]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
mm/readahead: make space in struct file_ra_state
authorRyan Roberts <ryan.roberts@arm.com>
Mon, 9 Jun 2025 09:27:25 +0000 (10:27 +0100)
committerAndrew Morton <akpm@linux-foundation.org>
Thu, 10 Jul 2025 05:42:03 +0000 (22:42 -0700)
We need to be able to store the preferred folio order associated with a
readahead request in the struct file_ra_state so that we can more
accurately increase the order across subsequent readahead requests.  But
struct file_ra_state is per-struct file, so we don't really want to
increase it's size.

mmap_miss is currently 32 bits but it is only counted up to 10 *
MMAP_LOTSAMISS, which is currently defined as 1000.  So 16 bits should be
plenty.  Redefine it to unsigned short, making room for order as unsigned
short in follow up commit.

Link: https://lkml.kernel.org/r/20250609092729.274960-4-ryan.roberts@arm.com
Signed-off-by: Ryan Roberts <ryan.roberts@arm.com>
Acked-by: David Hildenbrand <david@redhat.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Cc: Chaitanya S Prakash <chaitanyas.prakash@arm.com>
Cc: Will Deacon <will@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
include/linux/fs.h
mm/filemap.c

index 62634af97da65e797e1b9643af954ed016baae29..ef819b232d66f1caf07c84064bcabfa96912aa15 100644 (file)
@@ -1054,7 +1054,7 @@ struct file_ra_state {
        unsigned int size;
        unsigned int async_size;
        unsigned int ra_pages;
-       unsigned int mmap_miss;
+       unsigned short mmap_miss;
        loff_t prev_pos;
 };
 
index a6459874bb2aaa221086a927b76f631f4d574fca..7bb4ffca84875bac311d03ce9f10271f69022f94 100644 (file)
@@ -3217,7 +3217,7 @@ static struct file *do_sync_mmap_readahead(struct vm_fault *vmf)
        DEFINE_READAHEAD(ractl, file, ra, mapping, vmf->pgoff);
        struct file *fpin = NULL;
        unsigned long vm_flags = vmf->vma->vm_flags;
-       unsigned int mmap_miss;
+       unsigned short mmap_miss;
 
 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
        /* Use the readahead code, even if readahead is disabled */
@@ -3285,7 +3285,7 @@ static struct file *do_async_mmap_readahead(struct vm_fault *vmf,
        struct file_ra_state *ra = &file->f_ra;
        DEFINE_READAHEAD(ractl, file, ra, file->f_mapping, vmf->pgoff);
        struct file *fpin = NULL;
-       unsigned int mmap_miss;
+       unsigned short mmap_miss;
 
        /* If we don't want any read-ahead, don't bother */
        if (vmf->vma->vm_flags & VM_RAND_READ || !ra->ra_pages)
@@ -3605,7 +3605,7 @@ skip:
 static vm_fault_t filemap_map_folio_range(struct vm_fault *vmf,
                        struct folio *folio, unsigned long start,
                        unsigned long addr, unsigned int nr_pages,
-                       unsigned long *rss, unsigned int *mmap_miss)
+                       unsigned long *rss, unsigned short *mmap_miss)
 {
        vm_fault_t ret = 0;
        struct page *page = folio_page(folio, start);
@@ -3667,7 +3667,7 @@ skip:
 
 static vm_fault_t filemap_map_order0_folio(struct vm_fault *vmf,
                struct folio *folio, unsigned long addr,
-               unsigned long *rss, unsigned int *mmap_miss)
+               unsigned long *rss, unsigned short *mmap_miss)
 {
        vm_fault_t ret = 0;
        struct page *page = &folio->page;
@@ -3709,7 +3709,8 @@ vm_fault_t filemap_map_pages(struct vm_fault *vmf,
        struct folio *folio;
        vm_fault_t ret = 0;
        unsigned long rss = 0;
-       unsigned int nr_pages = 0, mmap_miss = 0, mmap_miss_saved, folio_type;
+       unsigned int nr_pages = 0, folio_type;
+       unsigned short mmap_miss = 0, mmap_miss_saved;
 
        rcu_read_lock();
        folio = next_uptodate_folio(&xas, mapping, end_pgoff);