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

TOMOYO Linux Cross Reference
Linux/fs/drop_caches.c

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /fs/drop_caches.c (Architecture i386) and /fs/drop_caches.c (Architecture ppc)


  1 // SPDX-License-Identifier: GPL-2.0                 1 // SPDX-License-Identifier: GPL-2.0
  2 /*                                                  2 /*
  3  * Implement the manual drop-all-pagecache fun      3  * Implement the manual drop-all-pagecache function
  4  */                                                 4  */
  5                                                     5 
  6 #include <linux/pagemap.h>                          6 #include <linux/pagemap.h>
  7 #include <linux/kernel.h>                           7 #include <linux/kernel.h>
  8 #include <linux/mm.h>                               8 #include <linux/mm.h>
  9 #include <linux/fs.h>                               9 #include <linux/fs.h>
 10 #include <linux/writeback.h>                       10 #include <linux/writeback.h>
 11 #include <linux/sysctl.h>                          11 #include <linux/sysctl.h>
 12 #include <linux/gfp.h>                             12 #include <linux/gfp.h>
 13 #include <linux/swap.h>                            13 #include <linux/swap.h>
 14 #include "internal.h"                              14 #include "internal.h"
 15                                                    15 
 16 /* A global variable is a bit ugly, but it kee     16 /* A global variable is a bit ugly, but it keeps the code simple */
 17 int sysctl_drop_caches;                            17 int sysctl_drop_caches;
 18                                                    18 
 19 static void drop_pagecache_sb(struct super_blo     19 static void drop_pagecache_sb(struct super_block *sb, void *unused)
 20 {                                                  20 {
 21         struct inode *inode, *toput_inode = NU     21         struct inode *inode, *toput_inode = NULL;
 22                                                    22 
 23         spin_lock(&sb->s_inode_list_lock);         23         spin_lock(&sb->s_inode_list_lock);
 24         list_for_each_entry(inode, &sb->s_inod     24         list_for_each_entry(inode, &sb->s_inodes, i_sb_list) {
 25                 spin_lock(&inode->i_lock);         25                 spin_lock(&inode->i_lock);
 26                 /*                                 26                 /*
 27                  * We must skip inodes in unus     27                  * We must skip inodes in unusual state. We may also skip
 28                  * inodes without pages but we     28                  * inodes without pages but we deliberately won't in case
 29                  * we need to reschedule to av     29                  * we need to reschedule to avoid softlockups.
 30                  */                                30                  */
 31                 if ((inode->i_state & (I_FREEI     31                 if ((inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW)) ||
 32                     (mapping_empty(inode->i_ma     32                     (mapping_empty(inode->i_mapping) && !need_resched())) {
 33                         spin_unlock(&inode->i_     33                         spin_unlock(&inode->i_lock);
 34                         continue;                  34                         continue;
 35                 }                                  35                 }
 36                 __iget(inode);                     36                 __iget(inode);
 37                 spin_unlock(&inode->i_lock);       37                 spin_unlock(&inode->i_lock);
 38                 spin_unlock(&sb->s_inode_list_     38                 spin_unlock(&sb->s_inode_list_lock);
 39                                                    39 
 40                 invalidate_mapping_pages(inode     40                 invalidate_mapping_pages(inode->i_mapping, 0, -1);
 41                 iput(toput_inode);                 41                 iput(toput_inode);
 42                 toput_inode = inode;               42                 toput_inode = inode;
 43                                                    43 
 44                 cond_resched();                    44                 cond_resched();
 45                 spin_lock(&sb->s_inode_list_lo     45                 spin_lock(&sb->s_inode_list_lock);
 46         }                                          46         }
 47         spin_unlock(&sb->s_inode_list_lock);       47         spin_unlock(&sb->s_inode_list_lock);
 48         iput(toput_inode);                         48         iput(toput_inode);
 49 }                                                  49 }
 50                                                    50 
 51 int drop_caches_sysctl_handler(const struct ct     51 int drop_caches_sysctl_handler(const struct ctl_table *table, int write,
 52                 void *buffer, size_t *length,      52                 void *buffer, size_t *length, loff_t *ppos)
 53 {                                                  53 {
 54         int ret;                                   54         int ret;
 55                                                    55 
 56         ret = proc_dointvec_minmax(table, writ     56         ret = proc_dointvec_minmax(table, write, buffer, length, ppos);
 57         if (ret)                                   57         if (ret)
 58                 return ret;                        58                 return ret;
 59         if (write) {                               59         if (write) {
 60                 static int stfu;                   60                 static int stfu;
 61                                                    61 
 62                 if (sysctl_drop_caches & 1) {      62                 if (sysctl_drop_caches & 1) {
 63                         lru_add_drain_all();       63                         lru_add_drain_all();
 64                         iterate_supers(drop_pa     64                         iterate_supers(drop_pagecache_sb, NULL);
 65                         count_vm_event(DROP_PA     65                         count_vm_event(DROP_PAGECACHE);
 66                 }                                  66                 }
 67                 if (sysctl_drop_caches & 2) {      67                 if (sysctl_drop_caches & 2) {
 68                         drop_slab();               68                         drop_slab();
 69                         count_vm_event(DROP_SL     69                         count_vm_event(DROP_SLAB);
 70                 }                                  70                 }
 71                 if (!stfu) {                       71                 if (!stfu) {
 72                         pr_info("%s (%d): drop     72                         pr_info("%s (%d): drop_caches: %d\n",
 73                                 current->comm,     73                                 current->comm, task_pid_nr(current),
 74                                 sysctl_drop_ca     74                                 sysctl_drop_caches);
 75                 }                                  75                 }
 76                 stfu |= sysctl_drop_caches & 4     76                 stfu |= sysctl_drop_caches & 4;
 77         }                                          77         }
 78         return 0;                                  78         return 0;
 79 }                                                  79 }
 80                                                    80 

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

kernel.org | git.kernel.org | LWN.net | Project Home | 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.

sflogo.php