Merge branches 'doc.2014.02.24a', 'fixes.2014.02.26a' and 'rt.2014.02.17b' into HEAD
[deliverable/linux.git] / kernel / ksysfs.c
CommitLineData
1da177e4
LT
1/*
2 * kernel/ksysfs.c - sysfs attributes in /sys/kernel, which
3 * are not related to any other subsystem
4 *
5 * Copyright (C) 2004 Kay Sievers <kay.sievers@vrfy.org>
6 *
7 * This file is release under the GPLv2
8 *
9 */
10
1da177e4
LT
11#include <linux/kobject.h>
12#include <linux/string.h>
13#include <linux/sysfs.h>
9984de1a 14#include <linux/export.h>
1da177e4 15#include <linux/init.h>
c330dda9 16#include <linux/kexec.h>
22b8ce94 17#include <linux/profile.h>
1596425f 18#include <linux/stat.h>
5cb350ba 19#include <linux/sched.h>
088ab0b4 20#include <linux/capability.h>
1da177e4 21
7a754743
PG
22#include <linux/rcupdate.h> /* rcu_expedited */
23
1da177e4 24#define KERNEL_ATTR_RO(_name) \
386f275f 25static struct kobj_attribute _name##_attr = __ATTR_RO(_name)
1da177e4
LT
26
27#define KERNEL_ATTR_RW(_name) \
386f275f 28static struct kobj_attribute _name##_attr = \
1da177e4
LT
29 __ATTR(_name, 0644, _name##_show, _name##_store)
30
0f76e5ac 31/* current uevent sequence number */
386f275f
KS
32static ssize_t uevent_seqnum_show(struct kobject *kobj,
33 struct kobj_attribute *attr, char *buf)
1da177e4 34{
386f275f 35 return sprintf(buf, "%llu\n", (unsigned long long)uevent_seqnum);
1da177e4 36}
0f76e5ac
KS
37KERNEL_ATTR_RO(uevent_seqnum);
38
af665852 39/* uevent helper program, used during early boot */
386f275f
KS
40static ssize_t uevent_helper_show(struct kobject *kobj,
41 struct kobj_attribute *attr, char *buf)
0f76e5ac 42{
386f275f 43 return sprintf(buf, "%s\n", uevent_helper);
0f76e5ac 44}
386f275f
KS
45static ssize_t uevent_helper_store(struct kobject *kobj,
46 struct kobj_attribute *attr,
47 const char *buf, size_t count)
0f76e5ac 48{
312c004d 49 if (count+1 > UEVENT_HELPER_PATH_LEN)
0f76e5ac 50 return -ENOENT;
386f275f 51 memcpy(uevent_helper, buf, count);
312c004d
KS
52 uevent_helper[count] = '\0';
53 if (count && uevent_helper[count-1] == '\n')
54 uevent_helper[count-1] = '\0';
0f76e5ac
KS
55 return count;
56}
57KERNEL_ATTR_RW(uevent_helper);
e3a1a5ec 58
1da177e4 59
22b8ce94
DH
60#ifdef CONFIG_PROFILING
61static ssize_t profiling_show(struct kobject *kobj,
62 struct kobj_attribute *attr, char *buf)
63{
64 return sprintf(buf, "%d\n", prof_on);
65}
66static ssize_t profiling_store(struct kobject *kobj,
67 struct kobj_attribute *attr,
68 const char *buf, size_t count)
69{
70 int ret;
71
72 if (prof_on)
73 return -EEXIST;
74 /*
75 * This eventually calls into get_option() which
76 * has a ton of callers and is not const. It is
77 * easiest to cast it away here.
78 */
79 profile_setup((char *)buf);
80 ret = profile_init();
81 if (ret)
82 return ret;
83 ret = create_proc_profile();
84 if (ret)
85 return ret;
86 return count;
87}
88KERNEL_ATTR_RW(profiling);
89#endif
90
c330dda9 91#ifdef CONFIG_KEXEC
386f275f
KS
92static ssize_t kexec_loaded_show(struct kobject *kobj,
93 struct kobj_attribute *attr, char *buf)
c330dda9 94{
386f275f 95 return sprintf(buf, "%d\n", !!kexec_image);
c330dda9
JM
96}
97KERNEL_ATTR_RO(kexec_loaded);
98
386f275f
KS
99static ssize_t kexec_crash_loaded_show(struct kobject *kobj,
100 struct kobj_attribute *attr, char *buf)
c330dda9 101{
386f275f 102 return sprintf(buf, "%d\n", !!kexec_crash_image);
c330dda9
JM
103}
104KERNEL_ATTR_RO(kexec_crash_loaded);
fd59d231 105
06a7f711
AW
106static ssize_t kexec_crash_size_show(struct kobject *kobj,
107 struct kobj_attribute *attr, char *buf)
108{
109 return sprintf(buf, "%zu\n", crash_get_memory_size());
110}
111static ssize_t kexec_crash_size_store(struct kobject *kobj,
112 struct kobj_attribute *attr,
113 const char *buf, size_t count)
114{
115 unsigned long cnt;
116 int ret;
117
6072ddc8 118 if (kstrtoul(buf, 0, &cnt))
06a7f711
AW
119 return -EINVAL;
120
121 ret = crash_shrink_memory(cnt);
122 return ret < 0 ? ret : count;
123}
124KERNEL_ATTR_RW(kexec_crash_size);
125
386f275f
KS
126static ssize_t vmcoreinfo_show(struct kobject *kobj,
127 struct kobj_attribute *attr, char *buf)
fd59d231 128{
386f275f 129 return sprintf(buf, "%lx %x\n",
fd59d231 130 paddr_vmcoreinfo_note(),
77019967 131 (unsigned int)sizeof(vmcoreinfo_note));
fd59d231
KO
132}
133KERNEL_ATTR_RO(vmcoreinfo);
134
c330dda9
JM
135#endif /* CONFIG_KEXEC */
136
088ab0b4
LN
137/* whether file capabilities are enabled */
138static ssize_t fscaps_show(struct kobject *kobj,
139 struct kobj_attribute *attr, char *buf)
140{
141 return sprintf(buf, "%d\n", file_caps_enabled);
142}
143KERNEL_ATTR_RO(fscaps);
144
3705b88d
AM
145int rcu_expedited;
146static ssize_t rcu_expedited_show(struct kobject *kobj,
147 struct kobj_attribute *attr, char *buf)
148{
149 return sprintf(buf, "%d\n", rcu_expedited);
150}
151static ssize_t rcu_expedited_store(struct kobject *kobj,
152 struct kobj_attribute *attr,
153 const char *buf, size_t count)
154{
155 if (kstrtoint(buf, 0, &rcu_expedited))
156 return -EINVAL;
157
158 return count;
159}
160KERNEL_ATTR_RW(rcu_expedited);
161
da1a679c
RM
162/*
163 * Make /sys/kernel/notes give the raw contents of our kernel .notes section.
164 */
0b1937ac
DH
165extern const void __start_notes __attribute__((weak));
166extern const void __stop_notes __attribute__((weak));
da1a679c
RM
167#define notes_size (&__stop_notes - &__start_notes)
168
2c3c8bea
CW
169static ssize_t notes_read(struct file *filp, struct kobject *kobj,
170 struct bin_attribute *bin_attr,
da1a679c
RM
171 char *buf, loff_t off, size_t count)
172{
173 memcpy(buf, &__start_notes + off, count);
174 return count;
175}
176
177static struct bin_attribute notes_attr = {
178 .attr = {
179 .name = "notes",
180 .mode = S_IRUGO,
181 },
182 .read = &notes_read,
183};
184
0ff21e46
GKH
185struct kobject *kernel_kobj;
186EXPORT_SYMBOL_GPL(kernel_kobj);
1da177e4
LT
187
188static struct attribute * kernel_attrs[] = {
088ab0b4 189 &fscaps_attr.attr,
0f76e5ac
KS
190 &uevent_seqnum_attr.attr,
191 &uevent_helper_attr.attr,
22b8ce94
DH
192#ifdef CONFIG_PROFILING
193 &profiling_attr.attr,
194#endif
c330dda9
JM
195#ifdef CONFIG_KEXEC
196 &kexec_loaded_attr.attr,
197 &kexec_crash_loaded_attr.attr,
06a7f711 198 &kexec_crash_size_attr.attr,
fd59d231 199 &vmcoreinfo_attr.attr,
1da177e4 200#endif
3705b88d 201 &rcu_expedited_attr.attr,
1da177e4
LT
202 NULL
203};
204
205static struct attribute_group kernel_attr_group = {
206 .attrs = kernel_attrs,
207};
208
209static int __init ksysfs_init(void)
210{
bd35b93d 211 int error;
1da177e4 212
0ff21e46
GKH
213 kernel_kobj = kobject_create_and_add("kernel", NULL);
214 if (!kernel_kobj) {
bd35b93d
GKH
215 error = -ENOMEM;
216 goto exit;
217 }
0ff21e46 218 error = sysfs_create_group(kernel_kobj, &kernel_attr_group);
bd35b93d
GKH
219 if (error)
220 goto kset_exit;
221
222 if (notes_size > 0) {
da1a679c 223 notes_attr.size = notes_size;
0ff21e46 224 error = sysfs_create_bin_file(kernel_kobj, &notes_attr);
bd35b93d
GKH
225 if (error)
226 goto group_exit;
da1a679c
RM
227 }
228
bd35b93d
GKH
229 return 0;
230
bd35b93d 231group_exit:
0ff21e46 232 sysfs_remove_group(kernel_kobj, &kernel_attr_group);
bd35b93d 233kset_exit:
78a2d906 234 kobject_put(kernel_kobj);
bd35b93d 235exit:
1da177e4
LT
236 return error;
237}
238
239core_initcall(ksysfs_init);
This page took 0.64433 seconds and 5 git commands to generate.