Blame view

fs/drop_caches.c 1.62 KB
b24413180   Greg Kroah-Hartman   License cleanup: ...
1
  // SPDX-License-Identifier: GPL-2.0
9d0243bca   Andrew Morton   [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   Dave Chinner   fs: move i_sb_lis...
12
  #include "internal.h"
9d0243bca   Andrew Morton   [PATCH] drop-page...
13
14
15
  
  /* A global variable is a bit ugly, but it keeps the code simple */
  int sysctl_drop_caches;
01a05b337   Al Viro   new helper: itera...
16
  static void drop_pagecache_sb(struct super_block *sb, void *unused)
9d0243bca   Andrew Morton   [PATCH] drop-page...
17
  {
eccb95cee   Jan Kara   vfs: fix lock inv...
18
  	struct inode *inode, *toput_inode = NULL;
9d0243bca   Andrew Morton   [PATCH] drop-page...
19

74278da9f   Dave Chinner   inode: convert in...
20
  	spin_lock(&sb->s_inode_list_lock);
9d0243bca   Andrew Morton   [PATCH] drop-page...
21
  	list_for_each_entry(inode, &sb->s_inodes, i_sb_list) {
250df6ed2   Dave Chinner   fs: protect inode...
22
23
24
25
  		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   Jan Kara   vfs: skip inodes ...
26
  			continue;
250df6ed2   Dave Chinner   fs: protect inode...
27
  		}
eccb95cee   Jan Kara   vfs: fix lock inv...
28
  		__iget(inode);
250df6ed2   Dave Chinner   fs: protect inode...
29
  		spin_unlock(&inode->i_lock);
74278da9f   Dave Chinner   inode: convert in...
30
  		spin_unlock(&sb->s_inode_list_lock);
286973552   Mike Waychison   mm: remove __inva...
31
  		invalidate_mapping_pages(inode->i_mapping, 0, -1);
eccb95cee   Jan Kara   vfs: fix lock inv...
32
33
  		iput(toput_inode);
  		toput_inode = inode;
74278da9f   Dave Chinner   inode: convert in...
34
35
  
  		spin_lock(&sb->s_inode_list_lock);
9d0243bca   Andrew Morton   [PATCH] drop-page...
36
  	}
74278da9f   Dave Chinner   inode: convert in...
37
  	spin_unlock(&sb->s_inode_list_lock);
eccb95cee   Jan Kara   vfs: fix lock inv...
38
  	iput(toput_inode);
9d0243bca   Andrew Morton   [PATCH] drop-page...
39
  }
1f7e0616c   Joe Perches   fs: convert use o...
40
  int drop_caches_sysctl_handler(struct ctl_table *table, int write,
8d65af789   Alexey Dobriyan   sysctl: remove "s...
41
  	void __user *buffer, size_t *length, loff_t *ppos)
9d0243bca   Andrew Morton   [PATCH] drop-page...
42
  {
cb16e95fa   Petr Holasek   sysctl: add some ...
43
44
45
46
47
  	int ret;
  
  	ret = proc_dointvec_minmax(table, write, buffer, length, ppos);
  	if (ret)
  		return ret;
9d0243bca   Andrew Morton   [PATCH] drop-page...
48
  	if (write) {
5509a5d27   Dave Hansen   drop_caches: add ...
49
50
51
  		static int stfu;
  
  		if (sysctl_drop_caches & 1) {
01a05b337   Al Viro   new helper: itera...
52
  			iterate_supers(drop_pagecache_sb, NULL);
5509a5d27   Dave Hansen   drop_caches: add ...
53
54
55
  			count_vm_event(DROP_PAGECACHE);
  		}
  		if (sysctl_drop_caches & 2) {
9d0243bca   Andrew Morton   [PATCH] drop-page...
56
  			drop_slab();
5509a5d27   Dave Hansen   drop_caches: add ...
57
58
59
60
61
62
63
64
65
  			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   Andrew Morton   [PATCH] drop-page...
66
67
68
  	}
  	return 0;
  }