Blame view
fs/drop_caches.c
1.83 KB
b24413180 License cleanup: ... |
1 |
// SPDX-License-Identifier: GPL-2.0 |
9d0243bca [PATCH] drop-page... |
2 3 4 5 6 7 8 9 10 11 |
/* * 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... |
12 |
#include "internal.h" |
9d0243bca [PATCH] drop-page... |
13 14 15 |
/* A global variable is a bit ugly, but it keeps the code simple */ int sysctl_drop_caches; |
01a05b337 new helper: itera... |
16 |
static void drop_pagecache_sb(struct super_block *sb, void *unused) |
9d0243bca [PATCH] drop-page... |
17 |
{ |
eccb95cee vfs: fix lock inv... |
18 |
struct inode *inode, *toput_inode = NULL; |
9d0243bca [PATCH] drop-page... |
19 |
|
74278da9f inode: convert in... |
20 |
spin_lock(&sb->s_inode_list_lock); |
9d0243bca [PATCH] drop-page... |
21 |
list_for_each_entry(inode, &sb->s_inodes, i_sb_list) { |
250df6ed2 fs: protect inode... |
22 |
spin_lock(&inode->i_lock); |
c27d82f52 fs/drop_caches.c:... |
23 24 25 26 27 |
/* * We must skip inodes in unusual state. We may also skip * inodes without pages but we deliberately won't in case * we need to reschedule to avoid softlockups. */ |
250df6ed2 fs: protect inode... |
28 |
if ((inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW)) || |
c27d82f52 fs/drop_caches.c:... |
29 |
(inode->i_mapping->nrpages == 0 && !need_resched())) { |
250df6ed2 fs: protect inode... |
30 |
spin_unlock(&inode->i_lock); |
af065b8a1 vfs: skip inodes ... |
31 |
continue; |
250df6ed2 fs: protect inode... |
32 |
} |
eccb95cee vfs: fix lock inv... |
33 |
__iget(inode); |
250df6ed2 fs: protect inode... |
34 |
spin_unlock(&inode->i_lock); |
74278da9f inode: convert in... |
35 |
spin_unlock(&sb->s_inode_list_lock); |
286973552 mm: remove __inva... |
36 |
invalidate_mapping_pages(inode->i_mapping, 0, -1); |
eccb95cee vfs: fix lock inv... |
37 38 |
iput(toput_inode); toput_inode = inode; |
74278da9f inode: convert in... |
39 |
|
04646aebd fs: avoid softloc... |
40 |
cond_resched(); |
74278da9f inode: convert in... |
41 |
spin_lock(&sb->s_inode_list_lock); |
9d0243bca [PATCH] drop-page... |
42 |
} |
74278da9f inode: convert in... |
43 |
spin_unlock(&sb->s_inode_list_lock); |
eccb95cee vfs: fix lock inv... |
44 |
iput(toput_inode); |
9d0243bca [PATCH] drop-page... |
45 |
} |
1f7e0616c fs: convert use o... |
46 |
int drop_caches_sysctl_handler(struct ctl_table *table, int write, |
8d65af789 sysctl: remove "s... |
47 |
void __user *buffer, size_t *length, loff_t *ppos) |
9d0243bca [PATCH] drop-page... |
48 |
{ |
cb16e95fa sysctl: add some ... |
49 50 51 52 53 |
int ret; ret = proc_dointvec_minmax(table, write, buffer, length, ppos); if (ret) return ret; |
9d0243bca [PATCH] drop-page... |
54 |
if (write) { |
5509a5d27 drop_caches: add ... |
55 56 57 |
static int stfu; if (sysctl_drop_caches & 1) { |
01a05b337 new helper: itera... |
58 |
iterate_supers(drop_pagecache_sb, NULL); |
5509a5d27 drop_caches: add ... |
59 60 61 |
count_vm_event(DROP_PAGECACHE); } if (sysctl_drop_caches & 2) { |
9d0243bca [PATCH] drop-page... |
62 |
drop_slab(); |
5509a5d27 drop_caches: add ... |
63 64 65 66 67 68 69 70 71 |
count_vm_event(DROP_SLAB); } if (!stfu) { pr_info("%s (%d): drop_caches: %d ", current->comm, task_pid_nr(current), sysctl_drop_caches); } stfu |= sysctl_drop_caches & 4; |
9d0243bca [PATCH] drop-page... |
72 73 74 |
} return 0; } |