Blame view
fs/drop_caches.c
1.51 KB
9d0243bca [PATCH] drop-page... |
1 2 3 4 5 6 7 8 9 10 |
/* * Implement the manual drop-all-pagecache function */ #include <linux/kernel.h> #include <linux/mm.h> #include <linux/fs.h> #include <linux/writeback.h> #include <linux/sysctl.h> #include <linux/gfp.h> |
55fa6091d fs: move i_sb_lis... |
11 |
#include "internal.h" |
9d0243bca [PATCH] drop-page... |
12 13 14 |
/* A global variable is a bit ugly, but it keeps the code simple */ int sysctl_drop_caches; |
01a05b337 new helper: itera... |
15 |
static void drop_pagecache_sb(struct super_block *sb, void *unused) |
9d0243bca [PATCH] drop-page... |
16 |
{ |
eccb95cee vfs: fix lock inv... |
17 |
struct inode *inode, *toput_inode = NULL; |
9d0243bca [PATCH] drop-page... |
18 |
|
55fa6091d fs: move i_sb_lis... |
19 |
spin_lock(&inode_sb_list_lock); |
9d0243bca [PATCH] drop-page... |
20 |
list_for_each_entry(inode, &sb->s_inodes, i_sb_list) { |
250df6ed2 fs: protect inode... |
21 22 23 24 |
spin_lock(&inode->i_lock); if ((inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW)) || (inode->i_mapping->nrpages == 0)) { spin_unlock(&inode->i_lock); |
af065b8a1 vfs: skip inodes ... |
25 |
continue; |
250df6ed2 fs: protect inode... |
26 |
} |
eccb95cee vfs: fix lock inv... |
27 |
__iget(inode); |
250df6ed2 fs: protect inode... |
28 |
spin_unlock(&inode->i_lock); |
55fa6091d fs: move i_sb_lis... |
29 |
spin_unlock(&inode_sb_list_lock); |
286973552 mm: remove __inva... |
30 |
invalidate_mapping_pages(inode->i_mapping, 0, -1); |
eccb95cee vfs: fix lock inv... |
31 32 |
iput(toput_inode); toput_inode = inode; |
55fa6091d fs: move i_sb_lis... |
33 |
spin_lock(&inode_sb_list_lock); |
9d0243bca [PATCH] drop-page... |
34 |
} |
55fa6091d fs: move i_sb_lis... |
35 |
spin_unlock(&inode_sb_list_lock); |
eccb95cee vfs: fix lock inv... |
36 |
iput(toput_inode); |
9d0243bca [PATCH] drop-page... |
37 |
} |
07d45da61 fs/drop_caches.c:... |
38 |
static void drop_slab(void) |
9d0243bca [PATCH] drop-page... |
39 40 |
{ int nr_objects; |
a09ed5e00 vmscan: change sh... |
41 42 |
struct shrink_control shrink = { .gfp_mask = GFP_KERNEL, |
a09ed5e00 vmscan: change sh... |
43 |
}; |
9d0243bca [PATCH] drop-page... |
44 45 |
do { |
1495f230f vmscan: change sh... |
46 |
nr_objects = shrink_slab(&shrink, 1000, 1000); |
9d0243bca [PATCH] drop-page... |
47 48 49 50 |
} while (nr_objects > 10); } int drop_caches_sysctl_handler(ctl_table *table, int write, |
8d65af789 sysctl: remove "s... |
51 |
void __user *buffer, size_t *length, loff_t *ppos) |
9d0243bca [PATCH] drop-page... |
52 |
{ |
cb16e95fa sysctl: add some ... |
53 54 55 56 57 |
int ret; ret = proc_dointvec_minmax(table, write, buffer, length, ppos); if (ret) return ret; |
9d0243bca [PATCH] drop-page... |
58 59 |
if (write) { if (sysctl_drop_caches & 1) |
01a05b337 new helper: itera... |
60 |
iterate_supers(drop_pagecache_sb, NULL); |
9d0243bca [PATCH] drop-page... |
61 62 63 64 65 |
if (sysctl_drop_caches & 2) drop_slab(); } return 0; } |