tmpfs: add shmem_read_mapping_page_gfp
Although it is used (by i915) on nothing but tmpfs, read_cache_page_gfp() is unsuited to tmpfs, because it inserts a page into pagecache before calling the filesystem's ->readpage: tmpfs may have pages in swapcache which only it knows how to locate and switch to filecache. At present tmpfs provides a ->readpage method, and copes with this by copying pages; but soon we can simplify it by removing its ->readpage. Provide shmem_read_mapping_page_gfp() now, ready for that transition, Export shmem_read_mapping_page_gfp() and add it to list in shmem_fs.h, with shmem_read_mapping_page() inline for the common mapping_gfp case. (shmem_read_mapping_page_gfp or shmem_read_cache_page_gfp? Generally the read_mapping_page functions use the mapping's ->readpage, and the read_cache_page functions use the supplied filler, so I think read_cache_page_gfp was slightly misnamed.) Signed-off-by: Hugh Dickins <hughd@google.com> Cc: Christoph Hellwig <hch@infradead.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
94c1e62df4
commit
d9d90e5eb7
23
mm/shmem.c
23
mm/shmem.c
@@ -3035,3 +3035,26 @@ int shmem_zero_setup(struct vm_area_struct *vma)
|
||||
vma->vm_flags |= VM_CAN_NONLINEAR;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* shmem_read_mapping_page_gfp - read into page cache, using specified page allocation flags.
|
||||
* @mapping: the page's address_space
|
||||
* @index: the page index
|
||||
* @gfp: the page allocator flags to use if allocating
|
||||
*
|
||||
* This behaves as a tmpfs "read_cache_page_gfp(mapping, index, gfp)",
|
||||
* with any new page allocations done using the specified allocation flags.
|
||||
* But read_cache_page_gfp() uses the ->readpage() method: which does not
|
||||
* suit tmpfs, since it may have pages in swapcache, and needs to find those
|
||||
* for itself; although drivers/gpu/drm i915 and ttm rely upon this support.
|
||||
*
|
||||
* Provide a stub for those callers to start using now, then later
|
||||
* flesh it out to call shmem_getpage() with additional gfp mask, when
|
||||
* shmem_file_splice_read() is added and shmem_readpage() is removed.
|
||||
*/
|
||||
struct page *shmem_read_mapping_page_gfp(struct address_space *mapping,
|
||||
pgoff_t index, gfp_t gfp)
|
||||
{
|
||||
return read_cache_page_gfp(mapping, index, gfp);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(shmem_read_mapping_page_gfp);
|
||||
|
Reference in New Issue
Block a user