5
5
#include <linux/seq_file.h>
6
6
#include <linux/shrinker.h>
7
7
#include <linux/memcontrol.h>
8
- #include <linux/srcu.h>
9
8
10
9
/* defined in vmscan.c */
11
10
extern struct rw_semaphore shrinker_rwsem ;
12
11
extern struct list_head shrinker_list ;
13
- extern struct srcu_struct shrinker_srcu ;
14
12
15
13
static DEFINE_IDA (shrinker_debugfs_ida );
16
14
static struct dentry * shrinker_debugfs_root ;
@@ -51,13 +49,18 @@ static int shrinker_debugfs_count_show(struct seq_file *m, void *v)
51
49
struct mem_cgroup * memcg ;
52
50
unsigned long total ;
53
51
bool memcg_aware ;
54
- int ret = 0 , nid , srcu_idx ;
52
+ int ret , nid ;
55
53
56
54
count_per_node = kcalloc (nr_node_ids , sizeof (unsigned long ), GFP_KERNEL );
57
55
if (!count_per_node )
58
56
return - ENOMEM ;
59
57
60
- srcu_idx = srcu_read_lock (& shrinker_srcu );
58
+ ret = down_read_killable (& shrinker_rwsem );
59
+ if (ret ) {
60
+ kfree (count_per_node );
61
+ return ret ;
62
+ }
63
+ rcu_read_lock ();
61
64
62
65
memcg_aware = shrinker -> flags & SHRINKER_MEMCG_AWARE ;
63
66
@@ -88,7 +91,8 @@ static int shrinker_debugfs_count_show(struct seq_file *m, void *v)
88
91
}
89
92
} while ((memcg = mem_cgroup_iter (NULL , memcg , NULL )) != NULL );
90
93
91
- srcu_read_unlock (& shrinker_srcu , srcu_idx );
94
+ rcu_read_unlock ();
95
+ up_read (& shrinker_rwsem );
92
96
93
97
kfree (count_per_node );
94
98
return ret ;
@@ -111,8 +115,9 @@ static ssize_t shrinker_debugfs_scan_write(struct file *file,
111
115
.gfp_mask = GFP_KERNEL ,
112
116
};
113
117
struct mem_cgroup * memcg = NULL ;
114
- int nid , srcu_idx ;
118
+ int nid ;
115
119
char kbuf [72 ];
120
+ ssize_t ret ;
116
121
117
122
read_len = size < (sizeof (kbuf ) - 1 ) ? size : (sizeof (kbuf ) - 1 );
118
123
if (copy_from_user (kbuf , buf , read_len ))
@@ -141,7 +146,11 @@ static ssize_t shrinker_debugfs_scan_write(struct file *file,
141
146
return - EINVAL ;
142
147
}
143
148
144
- srcu_idx = srcu_read_lock (& shrinker_srcu );
149
+ ret = down_read_killable (& shrinker_rwsem );
150
+ if (ret ) {
151
+ mem_cgroup_put (memcg );
152
+ return ret ;
153
+ }
145
154
146
155
sc .nid = nid ;
147
156
sc .memcg = memcg ;
@@ -150,7 +159,7 @@ static ssize_t shrinker_debugfs_scan_write(struct file *file,
150
159
151
160
shrinker -> scan_objects (shrinker , & sc );
152
161
153
- srcu_read_unlock ( & shrinker_srcu , srcu_idx );
162
+ up_read ( & shrinker_rwsem );
154
163
mem_cgroup_put (memcg );
155
164
156
165
return size ;
0 commit comments