]> git.hungrycats.org Git - linux/commitdiff
[PATCH] tmpfs 4/6: use mark_page_accessed
authorAndrew Morton <akpm@digeo.com>
Thu, 3 Apr 2003 00:27:19 +0000 (16:27 -0800)
committerLinus Torvalds <torvalds@home.transmeta.com>
Thu, 3 Apr 2003 00:27:19 +0000 (16:27 -0800)
From: Hugh Dickins <hugh@veritas.com>

tmpfs pages should be surfing the LRUs in the company of their filemap
friends: I was expecting the rules to change, but they've been stable so
long, let's sprinkle mark_page_accessed in the equivalent places here; but
(don't ask me why) SetPageReferenced in shmem_file_write.  Ooh, and
shmem_populate was missing a flush_page_to_ram.

mm/shmem.c

index 30e63b9093fb02e0fbf4d07717f753a30f1e5174..a1bff8caab34f650d3d18ca5ab064a56d90f9b74 100644 (file)
@@ -951,6 +951,7 @@ struct page *shmem_nopage(struct vm_area_struct *vma, unsigned long address, int
        if (error)
                return (error == -ENOMEM)? NOPAGE_OOM: NOPAGE_SIGBUS;
 
+       mark_page_accessed(page);
        flush_page_to_ram(page);
        return page;
 }
@@ -978,6 +979,8 @@ static int shmem_populate(struct vm_area_struct *vma,
                if (err)
                        return err;
                if (page) {
+                       mark_page_accessed(page);
+                       flush_page_to_ram(page);
                        err = install_page(mm, vma, addr, page, prot);
                        if (err) {
                                page_cache_release(page);
@@ -1192,6 +1195,8 @@ shmem_file_write(struct file *file, const char *buf, size_t count, loff_t *ppos)
                        break;
                }
 
+               if (!PageReferenced(page))
+                       SetPageReferenced(page);
                set_page_dirty(page);
                page_cache_release(page);
 
@@ -1264,13 +1269,20 @@ static void do_shmem_file_read(struct file *filp, loff_t *ppos, read_descriptor_
                }
                nr -= offset;
 
-               /* If users can be writing to this page using arbitrary
-                * virtual addresses, take care about potential aliasing
-                * before reading the page on the kernel side.
-                */
-               if (!list_empty(&mapping->i_mmap_shared) &&
-                   page != ZERO_PAGE(0))
-                       flush_dcache_page(page);
+               if (page != ZERO_PAGE(0)) {
+                       /*
+                        * If users can be writing to this page using arbitrary
+                        * virtual addresses, take care about potential aliasing
+                        * before reading the page on the kernel side.
+                        */
+                       if (!list_empty(&mapping->i_mmap_shared))
+                               flush_dcache_page(page);
+                       /*
+                        * Mark the page accessed if we read the beginning.
+                        */
+                       if (!offset)
+                               mark_page_accessed(page);
+               }
 
                /*
                 * Ok, we have the page, and it's up-to-date, so
@@ -1523,6 +1535,7 @@ static int shmem_readlink(struct dentry *dentry, char *buffer, int buflen)
                return res;
        res = vfs_readlink(dentry, buffer, buflen, kmap(page));
        kunmap(page);
+       mark_page_accessed(page);
        page_cache_release(page);
        return res;
 }
@@ -1535,6 +1548,7 @@ static int shmem_follow_link(struct dentry *dentry, struct nameidata *nd)
                return res;
        res = vfs_follow_link(nd, kmap(page));
        kunmap(page);
+       mark_page_accessed(page);
        page_cache_release(page);
        return res;
 }