summaryrefslogtreecommitdiffstats
path: root/kernel/ksysfs.c
diff options
context:
space:
mode:
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>2015-11-24 18:44:06 -0500
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>2015-12-04 15:26:53 -0500
commit5a9be7c628c5273f84abacebf7faf2488376e0f0 (patch)
tree4d39aabecb8cc7542a053b3f9761f8e119f25450 /kernel/ksysfs.c
parent72611ab9f5d2d384a04e72d560c9c82463115cbf (diff)
rcu: Add rcu_normal kernel parameter to suppress expediting
Although expedited grace periods can be quite useful, and although their OS jitter has been greatly reduced, they can still pose problems for extreme real-time workloads. This commit therefore adds a rcu_normal kernel boot parameter (which can also be manipulated via sysfs) to suppress expedited grace periods, that is, to treat requests for expedited grace periods as if they were requests for normal grace periods. If both rcu_expedited and rcu_normal are specified, rcu_normal wins. This means that if you are relying on expedited grace periods to speed up boot, you will want to specify rcu_expedited on the kernel command line, and then specify rcu_normal via sysfs once boot completes. Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Diffstat (limited to 'kernel/ksysfs.c')
-rw-r--r--kernel/ksysfs.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/kernel/ksysfs.c b/kernel/ksysfs.c
index e83b26464061..b4e2fa52d8bc 100644
--- a/kernel/ksysfs.c
+++ b/kernel/ksysfs.c
@@ -20,7 +20,7 @@
20#include <linux/capability.h> 20#include <linux/capability.h>
21#include <linux/compiler.h> 21#include <linux/compiler.h>
22 22
23#include <linux/rcupdate.h> /* rcu_expedited */ 23#include <linux/rcupdate.h> /* rcu_expedited and rcu_normal */
24 24
25#define KERNEL_ATTR_RO(_name) \ 25#define KERNEL_ATTR_RO(_name) \
26static struct kobj_attribute _name##_attr = __ATTR_RO(_name) 26static struct kobj_attribute _name##_attr = __ATTR_RO(_name)
@@ -148,7 +148,7 @@ int rcu_expedited;
148static ssize_t rcu_expedited_show(struct kobject *kobj, 148static ssize_t rcu_expedited_show(struct kobject *kobj,
149 struct kobj_attribute *attr, char *buf) 149 struct kobj_attribute *attr, char *buf)
150{ 150{
151 return sprintf(buf, "%d\n", rcu_expedited); 151 return sprintf(buf, "%d\n", READ_ONCE(rcu_expedited));
152} 152}
153static ssize_t rcu_expedited_store(struct kobject *kobj, 153static ssize_t rcu_expedited_store(struct kobject *kobj,
154 struct kobj_attribute *attr, 154 struct kobj_attribute *attr,
@@ -161,6 +161,23 @@ static ssize_t rcu_expedited_store(struct kobject *kobj,
161} 161}
162KERNEL_ATTR_RW(rcu_expedited); 162KERNEL_ATTR_RW(rcu_expedited);
163 163
164int rcu_normal;
165static ssize_t rcu_normal_show(struct kobject *kobj,
166 struct kobj_attribute *attr, char *buf)
167{
168 return sprintf(buf, "%d\n", READ_ONCE(rcu_normal));
169}
170static ssize_t rcu_normal_store(struct kobject *kobj,
171 struct kobj_attribute *attr,
172 const char *buf, size_t count)
173{
174 if (kstrtoint(buf, 0, &rcu_normal))
175 return -EINVAL;
176
177 return count;
178}
179KERNEL_ATTR_RW(rcu_normal);
180
164/* 181/*
165 * Make /sys/kernel/notes give the raw contents of our kernel .notes section. 182 * Make /sys/kernel/notes give the raw contents of our kernel .notes section.
166 */ 183 */
@@ -203,6 +220,7 @@ static struct attribute * kernel_attrs[] = {
203 &vmcoreinfo_attr.attr, 220 &vmcoreinfo_attr.attr,
204#endif 221#endif
205 &rcu_expedited_attr.attr, 222 &rcu_expedited_attr.attr,
223 &rcu_normal_attr.attr,
206 NULL 224 NULL
207}; 225};
208 226