diff options
Diffstat (limited to 'fs/fscache/main.c')
-rw-r--r-- | fs/fscache/main.c | 106 |
1 files changed, 100 insertions, 6 deletions
diff --git a/fs/fscache/main.c b/fs/fscache/main.c index add6bdb53f04..f9d856773f79 100644 --- a/fs/fscache/main.c +++ b/fs/fscache/main.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/sched.h> | 15 | #include <linux/sched.h> |
16 | #include <linux/completion.h> | 16 | #include <linux/completion.h> |
17 | #include <linux/slab.h> | 17 | #include <linux/slab.h> |
18 | #include <linux/seq_file.h> | ||
18 | #include "internal.h" | 19 | #include "internal.h" |
19 | 20 | ||
20 | MODULE_DESCRIPTION("FS Cache Manager"); | 21 | MODULE_DESCRIPTION("FS Cache Manager"); |
@@ -40,22 +41,105 @@ MODULE_PARM_DESC(fscache_debug, | |||
40 | "FS-Cache debugging mask"); | 41 | "FS-Cache debugging mask"); |
41 | 42 | ||
42 | struct kobject *fscache_root; | 43 | struct kobject *fscache_root; |
44 | struct workqueue_struct *fscache_object_wq; | ||
45 | struct workqueue_struct *fscache_op_wq; | ||
46 | |||
47 | DEFINE_PER_CPU(wait_queue_head_t, fscache_object_cong_wait); | ||
48 | |||
49 | /* these values serve as lower bounds, will be adjusted in fscache_init() */ | ||
50 | static unsigned fscache_object_max_active = 4; | ||
51 | static unsigned fscache_op_max_active = 2; | ||
52 | |||
53 | #ifdef CONFIG_SYSCTL | ||
54 | static struct ctl_table_header *fscache_sysctl_header; | ||
55 | |||
56 | static int fscache_max_active_sysctl(struct ctl_table *table, int write, | ||
57 | void __user *buffer, | ||
58 | size_t *lenp, loff_t *ppos) | ||
59 | { | ||
60 | struct workqueue_struct **wqp = table->extra1; | ||
61 | unsigned int *datap = table->data; | ||
62 | int ret; | ||
63 | |||
64 | ret = proc_dointvec(table, write, buffer, lenp, ppos); | ||
65 | if (ret == 0) | ||
66 | workqueue_set_max_active(*wqp, *datap); | ||
67 | return ret; | ||
68 | } | ||
69 | |||
70 | ctl_table fscache_sysctls[] = { | ||
71 | { | ||
72 | .procname = "object_max_active", | ||
73 | .data = &fscache_object_max_active, | ||
74 | .maxlen = sizeof(unsigned), | ||
75 | .mode = 0644, | ||
76 | .proc_handler = fscache_max_active_sysctl, | ||
77 | .extra1 = &fscache_object_wq, | ||
78 | }, | ||
79 | { | ||
80 | .procname = "operation_max_active", | ||
81 | .data = &fscache_op_max_active, | ||
82 | .maxlen = sizeof(unsigned), | ||
83 | .mode = 0644, | ||
84 | .proc_handler = fscache_max_active_sysctl, | ||
85 | .extra1 = &fscache_op_wq, | ||
86 | }, | ||
87 | {} | ||
88 | }; | ||
89 | |||
90 | ctl_table fscache_sysctls_root[] = { | ||
91 | { | ||
92 | .procname = "fscache", | ||
93 | .mode = 0555, | ||
94 | .child = fscache_sysctls, | ||
95 | }, | ||
96 | {} | ||
97 | }; | ||
98 | #endif | ||
43 | 99 | ||
44 | /* | 100 | /* |
45 | * initialise the fs caching module | 101 | * initialise the fs caching module |
46 | */ | 102 | */ |
47 | static int __init fscache_init(void) | 103 | static int __init fscache_init(void) |
48 | { | 104 | { |
105 | unsigned int nr_cpus = num_possible_cpus(); | ||
106 | unsigned int cpu; | ||
49 | int ret; | 107 | int ret; |
50 | 108 | ||
51 | ret = slow_work_register_user(THIS_MODULE); | 109 | fscache_object_max_active = |
52 | if (ret < 0) | 110 | clamp_val(nr_cpus, |
53 | goto error_slow_work; | 111 | fscache_object_max_active, WQ_UNBOUND_MAX_ACTIVE); |
112 | |||
113 | ret = -ENOMEM; | ||
114 | fscache_object_wq = alloc_workqueue("fscache_object", WQ_UNBOUND, | ||
115 | fscache_object_max_active); | ||
116 | if (!fscache_object_wq) | ||
117 | goto error_object_wq; | ||
118 | |||
119 | fscache_op_max_active = | ||
120 | clamp_val(fscache_object_max_active / 2, | ||
121 | fscache_op_max_active, WQ_UNBOUND_MAX_ACTIVE); | ||
122 | |||
123 | ret = -ENOMEM; | ||
124 | fscache_op_wq = alloc_workqueue("fscache_operation", WQ_UNBOUND, | ||
125 | fscache_op_max_active); | ||
126 | if (!fscache_op_wq) | ||
127 | goto error_op_wq; | ||
128 | |||
129 | for_each_possible_cpu(cpu) | ||
130 | init_waitqueue_head(&per_cpu(fscache_object_cong_wait, cpu)); | ||
54 | 131 | ||
55 | ret = fscache_proc_init(); | 132 | ret = fscache_proc_init(); |
56 | if (ret < 0) | 133 | if (ret < 0) |
57 | goto error_proc; | 134 | goto error_proc; |
58 | 135 | ||
136 | #ifdef CONFIG_SYSCTL | ||
137 | ret = -ENOMEM; | ||
138 | fscache_sysctl_header = register_sysctl_table(fscache_sysctls_root); | ||
139 | if (!fscache_sysctl_header) | ||
140 | goto error_sysctl; | ||
141 | #endif | ||
142 | |||
59 | fscache_cookie_jar = kmem_cache_create("fscache_cookie_jar", | 143 | fscache_cookie_jar = kmem_cache_create("fscache_cookie_jar", |
60 | sizeof(struct fscache_cookie), | 144 | sizeof(struct fscache_cookie), |
61 | 0, | 145 | 0, |
@@ -78,10 +162,16 @@ static int __init fscache_init(void) | |||
78 | error_kobj: | 162 | error_kobj: |
79 | kmem_cache_destroy(fscache_cookie_jar); | 163 | kmem_cache_destroy(fscache_cookie_jar); |
80 | error_cookie_jar: | 164 | error_cookie_jar: |
165 | #ifdef CONFIG_SYSCTL | ||
166 | unregister_sysctl_table(fscache_sysctl_header); | ||
167 | error_sysctl: | ||
168 | #endif | ||
81 | fscache_proc_cleanup(); | 169 | fscache_proc_cleanup(); |
82 | error_proc: | 170 | error_proc: |
83 | slow_work_unregister_user(THIS_MODULE); | 171 | destroy_workqueue(fscache_op_wq); |
84 | error_slow_work: | 172 | error_op_wq: |
173 | destroy_workqueue(fscache_object_wq); | ||
174 | error_object_wq: | ||
85 | return ret; | 175 | return ret; |
86 | } | 176 | } |
87 | 177 | ||
@@ -96,8 +186,12 @@ static void __exit fscache_exit(void) | |||
96 | 186 | ||
97 | kobject_put(fscache_root); | 187 | kobject_put(fscache_root); |
98 | kmem_cache_destroy(fscache_cookie_jar); | 188 | kmem_cache_destroy(fscache_cookie_jar); |
189 | #ifdef CONFIG_SYSCTL | ||
190 | unregister_sysctl_table(fscache_sysctl_header); | ||
191 | #endif | ||
99 | fscache_proc_cleanup(); | 192 | fscache_proc_cleanup(); |
100 | slow_work_unregister_user(THIS_MODULE); | 193 | destroy_workqueue(fscache_op_wq); |
194 | destroy_workqueue(fscache_object_wq); | ||
101 | printk(KERN_NOTICE "FS-Cache: Unloaded\n"); | 195 | printk(KERN_NOTICE "FS-Cache: Unloaded\n"); |
102 | } | 196 | } |
103 | 197 | ||