~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/fs/drop_caches.c

Version: ~ [ linux-5.6-rc3 ] ~ [ linux-5.5.6 ] ~ [ linux-5.4.22 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.106 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.171 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.214 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.214 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.19.8 ] ~ [ linux-3.18.140 ] ~ [ linux-3.17.8 ] ~ [ linux-3.16.82 ] ~ [ linux-3.15.10 ] ~ [ linux-3.14.79 ] ~ [ linux-3.13.11 ] ~ [ linux-3.12.74 ] ~ [ linux-3.11.10 ] ~ [ linux-3.10.108 ] ~ [ linux-3.9.11 ] ~ [ linux-3.8.13 ] ~ [ linux-3.7.10 ] ~ [ linux-3.6.11 ] ~ [ linux-3.5.7 ] ~ [ linux-3.4.113 ] ~ [ linux-3.3.8 ] ~ [ linux-3.2.102 ] ~ [ linux-3.1.10 ] ~ [ linux-3.0.101 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /*
  2  * Implement the manual drop-all-pagecache function
  3  */
  4 
  5 #include <linux/kernel.h>
  6 #include <linux/mm.h>
  7 #include <linux/fs.h>
  8 #include <linux/writeback.h>
  9 #include <linux/sysctl.h>
 10 #include <linux/gfp.h>
 11 #include "internal.h"
 12 
 13 /* A global variable is a bit ugly, but it keeps the code simple */
 14 int sysctl_drop_caches;
 15 
 16 static void drop_pagecache_sb(struct super_block *sb, void *unused)
 17 {
 18         struct inode *inode, *toput_inode = NULL;
 19 
 20         spin_lock(&inode_sb_list_lock);
 21         list_for_each_entry(inode, &sb->s_inodes, i_sb_list) {
 22                 spin_lock(&inode->i_lock);
 23                 if ((inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW)) ||
 24                     (inode->i_mapping->nrpages == 0)) {
 25                         spin_unlock(&inode->i_lock);
 26                         continue;
 27                 }
 28                 __iget(inode);
 29                 spin_unlock(&inode->i_lock);
 30                 spin_unlock(&inode_sb_list_lock);
 31                 invalidate_mapping_pages(inode->i_mapping, 0, -1);
 32                 iput(toput_inode);
 33                 toput_inode = inode;
 34                 spin_lock(&inode_sb_list_lock);
 35         }
 36         spin_unlock(&inode_sb_list_lock);
 37         iput(toput_inode);
 38 }
 39 
 40 int drop_caches_sysctl_handler(struct ctl_table *table, int write,
 41         void __user *buffer, size_t *length, loff_t *ppos)
 42 {
 43         int ret;
 44 
 45         ret = proc_dointvec_minmax(table, write, buffer, length, ppos);
 46         if (ret)
 47                 return ret;
 48         if (write) {
 49                 static int stfu;
 50 
 51                 if (sysctl_drop_caches & 1) {
 52                         iterate_supers(drop_pagecache_sb, NULL);
 53                         count_vm_event(DROP_PAGECACHE);
 54                 }
 55                 if (sysctl_drop_caches & 2) {
 56                         drop_slab();
 57                         count_vm_event(DROP_SLAB);
 58                 }
 59                 if (!stfu) {
 60                         pr_info("%s (%d): drop_caches: %d\n",
 61                                 current->comm, task_pid_nr(current),
 62                                 sysctl_drop_caches);
 63                 }
 64                 stfu |= sysctl_drop_caches & 4;
 65         }
 66         return 0;
 67 }
 68 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp