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

TOMOYO Linux Cross Reference
Linux/fs/drop_caches.c

Version: ~ [ linux-5.3-rc4 ] ~ [ linux-5.2.8 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.66 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.138 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.189 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.189 ] ~ [ 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.71 ] ~ [ 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 static void drop_slab(void)
 41 {
 42         int nr_objects;
 43         struct shrink_control shrink = {
 44                 .gfp_mask = GFP_KERNEL,
 45         };
 46 
 47         do {
 48                 nr_objects = shrink_slab(&shrink, 1000, 1000);
 49         } while (nr_objects > 10);
 50 }
 51 
 52 int drop_caches_sysctl_handler(ctl_table *table, int write,
 53         void __user *buffer, size_t *length, loff_t *ppos)
 54 {
 55         int ret;
 56 
 57         ret = proc_dointvec_minmax(table, write, buffer, length, ppos);
 58         if (ret)
 59                 return ret;
 60         if (write) {
 61                 if (sysctl_drop_caches & 1)
 62                         iterate_supers(drop_pagecache_sb, NULL);
 63                 if (sysctl_drop_caches & 2)
 64                         drop_slab();
 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