/[pkg-src]/trunk/kernel26-xen/patches-2.6.25-r1/1015-2.6.25-xen-Add-Xen-s-sys-hypervisor-interface.patch |
Contents of /trunk/kernel26-xen/patches-2.6.25-r1/1015-2.6.25-xen-Add-Xen-s-sys-hypervisor-interface.patch
Parent Directory | Revision Log
Revision 606 -
(show annotations)
(download)
Thu May 22 23:13:13 2008 UTC (15 years, 11 months ago) by niro
File size: 11534 byte(s)
Thu May 22 23:13:13 2008 UTC (15 years, 11 months ago) by niro
File size: 11534 byte(s)
-ver bump to 2.6.25-magellan-r1: - linux-2.6.25.4 - fbcondecor-0.9.4 - squashfs-3.3 - unionfs-2.3.3 - tuxonice-3.0-rc7 - linux-phc-0.3.0 - acpi-dstd-0.9a - reiser4 - xen-3.2.0 . ipw3945-1.2.2
1 | From a3bd6211ccaf28b2325c6034d3fe24859b184a1f Mon Sep 17 00:00:00 2001 |
2 | From: Mark McLoughlin <markmc@redhat.com> |
3 | Date: Thu, 7 Feb 2008 15:32:28 +0000 |
4 | Subject: [PATCH] xen: Add Xen's /sys/hypervisor interface |
5 | |
6 | Hook up Xen's /sys/hypervisor interface: |
7 | |
8 | /sys/hypervisor/ |
9 | -> type |
10 | -> uuid |
11 | -> compilation |
12 | -> compile_date |
13 | -> compiled_by |
14 | -> compiler |
15 | -> properties |
16 | -> capabilities |
17 | -> changeset |
18 | -> pagesize |
19 | -> virtual_start |
20 | -> writable_pt |
21 | -> version |
22 | -> extra |
23 | -> major |
24 | -> minor |
25 | |
26 | Note: the hypervisor subsys hook requires that |
27 | SYS_HYPERVISOR is selected to enabled it, which in |
28 | turns means that the subsys will be registered by |
29 | a pv-ops kernel with Xen support, even on bare |
30 | metal. This hook needs to be changed to be runtime |
31 | enabled. |
32 | |
33 | Signed-off-by: Mark McLoughlin <markmc@redhat.com> |
34 | --- |
35 | arch/x86/xen/Kconfig | 3 +- |
36 | drivers/xen/xenctrl/Makefile | 1 + |
37 | drivers/xen/xenctrl/main.c | 6 + |
38 | drivers/xen/xenctrl/sysfs.c | 349 +++++++++++++++++++++++++++++++++++++++ |
39 | drivers/xen/xenctrl/xenctrl.h | 6 + |
40 | include/xen/interface/version.h | 6 + |
41 | 6 files changed, 370 insertions(+), 1 deletions(-) |
42 | create mode 100644 drivers/xen/xenctrl/sysfs.c |
43 | |
44 | diff --git a/arch/x86/xen/Kconfig b/arch/x86/xen/Kconfig |
45 | index 4723bc1..ff6a56a 100644 |
46 | --- a/arch/x86/xen/Kconfig |
47 | +++ b/arch/x86/xen/Kconfig |
48 | @@ -14,7 +14,8 @@ config XEN |
49 | |
50 | config XENCTRL |
51 | tristate "Xen's user space control interfaces" |
52 | - depends on XEN && PROC_FS |
53 | + depends on XEN && PROC_FS && SYSFS |
54 | default y if XEN |
55 | + select SYS_HYPERVISOR |
56 | help |
57 | This is the /proc/xen interface used by Xen's libxc. |
58 | diff --git a/drivers/xen/xenctrl/Makefile b/drivers/xen/xenctrl/Makefile |
59 | index 23dafa3..e126e76 100644 |
60 | --- a/drivers/xen/xenctrl/Makefile |
61 | +++ b/drivers/xen/xenctrl/Makefile |
62 | @@ -5,3 +5,4 @@ xenctrl-objs += main.o |
63 | xenctrl-objs += capabilities.o |
64 | xenctrl-objs += privcmd.o |
65 | xenctrl-objs += xenbus.o |
66 | +xenctrl-objs += sysfs.o |
67 | diff --git a/drivers/xen/xenctrl/main.c b/drivers/xen/xenctrl/main.c |
68 | index b0cf61b..87d0dba 100644 |
69 | --- a/drivers/xen/xenctrl/main.c |
70 | +++ b/drivers/xen/xenctrl/main.c |
71 | @@ -63,8 +63,13 @@ static int __init xenctrl_init(void) |
72 | if (ret) |
73 | goto fail3; |
74 | |
75 | + ret = sys_hypervisor_init(); |
76 | + if (ret) |
77 | + goto fail4; |
78 | + |
79 | return 0; |
80 | |
81 | + fail4: xenbus_remove_proc_entry(); |
82 | fail3: privcmd_remove_proc_entry(); |
83 | fail2: capabilities_remove_proc_entry(); |
84 | fail1: remove_proc_entry("xen", NULL); |
85 | @@ -73,6 +78,7 @@ static int __init xenctrl_init(void) |
86 | |
87 | static void __exit xenctrl_exit(void) |
88 | { |
89 | + sys_hypervisor_exit(); |
90 | xenbus_remove_proc_entry(); |
91 | privcmd_remove_proc_entry(); |
92 | capabilities_remove_proc_entry(); |
93 | diff --git a/drivers/xen/xenctrl/sysfs.c b/drivers/xen/xenctrl/sysfs.c |
94 | new file mode 100644 |
95 | index 0000000..8cbf4d6 |
96 | --- /dev/null |
97 | +++ b/drivers/xen/xenctrl/sysfs.c |
98 | @@ -0,0 +1,349 @@ |
99 | +/* |
100 | + * copyright (c) 2006 IBM Corporation |
101 | + * Authored by: Mike D. Day <ncmike@us.ibm.com> |
102 | + * |
103 | + * This program is free software; you can redistribute it and/or modify |
104 | + * it under the terms of the GNU General Public License version 2 as |
105 | + * published by the Free Software Foundation. |
106 | + */ |
107 | + |
108 | +#include <linux/kobject.h> |
109 | +#include <linux/sysfs.h> |
110 | +#include <linux/err.h> |
111 | +#include <asm/xen/hypervisor.h> |
112 | +#include <xen/xenbus.h> |
113 | +#include "xenctrl.h" |
114 | + |
115 | +#define HYPERVISOR_ATTR_RO(_name) \ |
116 | +static struct kobj_attribute _name##_attr = __ATTR_RO(_name) |
117 | + |
118 | +#define HYPERVISOR_ATTR_RW(_name) \ |
119 | +static struct kobj_attribute _name##_attr = \ |
120 | + __ATTR(_name, 0644, _name##_show, _name##_store) |
121 | + |
122 | +static ssize_t type_show(struct kobject *kobj, struct kobj_attribute *attr, char *buffer) |
123 | +{ |
124 | + return sprintf(buffer, "xen\n"); |
125 | +} |
126 | + |
127 | +HYPERVISOR_ATTR_RO(type); |
128 | + |
129 | +static int __init xen_sysfs_type_init(void) |
130 | +{ |
131 | + return sysfs_create_file(hypervisor_kobj, &type_attr.attr); |
132 | +} |
133 | + |
134 | +static void xen_sysfs_type_destroy(void) |
135 | +{ |
136 | + sysfs_remove_file(hypervisor_kobj, &type_attr.attr); |
137 | +} |
138 | + |
139 | +static ssize_t major_show(struct kobject *kobj, struct kobj_attribute *attr, char *buffer) |
140 | +{ |
141 | + int version; |
142 | + |
143 | + version = HYPERVISOR_xen_version(XENVER_version, NULL); |
144 | + if (!version) |
145 | + return -ENODEV; |
146 | + |
147 | + return sprintf(buffer, "%d\n", version >> 16); |
148 | +} |
149 | + |
150 | +HYPERVISOR_ATTR_RO(major); |
151 | + |
152 | +static ssize_t minor_show(struct kobject *kobj, struct kobj_attribute *attr, char *buffer) |
153 | +{ |
154 | + int version; |
155 | + |
156 | + version = HYPERVISOR_xen_version(XENVER_version, NULL); |
157 | + if (!version) |
158 | + return -ENODEV; |
159 | + |
160 | + return sprintf(buffer, "%d\n", version & 0xff); |
161 | +} |
162 | + |
163 | +HYPERVISOR_ATTR_RO(minor); |
164 | + |
165 | +static ssize_t extra_show(struct kobject *kobj, struct kobj_attribute *attr, char *buffer) |
166 | +{ |
167 | + int ret; |
168 | + struct xen_extraversion extra; |
169 | + |
170 | + ret = HYPERVISOR_xen_version(XENVER_extraversion, &extra); |
171 | + if (ret) |
172 | + return ret; |
173 | + |
174 | + return sprintf(buffer, "%s\n", extra.extraversion); |
175 | +} |
176 | + |
177 | +HYPERVISOR_ATTR_RO(extra); |
178 | + |
179 | +static struct attribute *version_attrs[] = { |
180 | + &major_attr.attr, |
181 | + &minor_attr.attr, |
182 | + &extra_attr.attr, |
183 | + NULL |
184 | +}; |
185 | + |
186 | +static struct attribute_group version_group = { |
187 | + .name = "version", |
188 | + .attrs = version_attrs, |
189 | +}; |
190 | + |
191 | +static int __init xen_sysfs_version_init(void) |
192 | +{ |
193 | + return sysfs_create_group(hypervisor_kobj, &version_group); |
194 | +} |
195 | + |
196 | +static void xen_sysfs_version_destroy(void) |
197 | +{ |
198 | + sysfs_remove_group(hypervisor_kobj, &version_group); |
199 | +} |
200 | + |
201 | +static ssize_t uuid_show(struct kobject *kobj, struct kobj_attribute *attr, char *buffer) |
202 | +{ |
203 | + char *vm, *val; |
204 | + int ret; |
205 | + |
206 | + vm = xenbus_read(XBT_NIL, "vm", "", NULL); |
207 | + if (IS_ERR(vm)) |
208 | + return PTR_ERR(vm); |
209 | + |
210 | + val = xenbus_read(XBT_NIL, vm, "uuid", NULL); |
211 | + if (IS_ERR(val)) { |
212 | + ret = PTR_ERR(val); |
213 | + goto out; |
214 | + } |
215 | + |
216 | + ret = sprintf(buffer, "%s\n", val); |
217 | + |
218 | + kfree(val); |
219 | +out: kfree(vm); |
220 | + |
221 | + return ret; |
222 | +} |
223 | + |
224 | +HYPERVISOR_ATTR_RO(uuid); |
225 | + |
226 | +static int __init xen_sysfs_uuid_init(void) |
227 | +{ |
228 | + return sysfs_create_file(hypervisor_kobj, &uuid_attr.attr); |
229 | +} |
230 | + |
231 | +static void xen_sysfs_uuid_destroy(void) |
232 | +{ |
233 | + sysfs_remove_file(hypervisor_kobj, &uuid_attr.attr); |
234 | +} |
235 | + |
236 | +static ssize_t compiler_show(struct kobject *kobj, struct kobj_attribute *attr, char *buffer) |
237 | +{ |
238 | + struct xen_compile_info info; |
239 | + int ret; |
240 | + |
241 | + ret = HYPERVISOR_xen_version(XENVER_compile_info, &info); |
242 | + if (ret) |
243 | + return ret; |
244 | + |
245 | + return sprintf(buffer, "%s\n", info.compiler); |
246 | +} |
247 | + |
248 | +HYPERVISOR_ATTR_RO(compiler); |
249 | + |
250 | +static ssize_t compiled_by_show(struct kobject *kobj, struct kobj_attribute *attr, char *buffer) |
251 | +{ |
252 | + struct xen_compile_info info; |
253 | + int ret; |
254 | + |
255 | + ret = HYPERVISOR_xen_version(XENVER_compile_info, &info); |
256 | + if (ret) |
257 | + return ret; |
258 | + |
259 | + return sprintf(buffer, "%s\n", info.compile_by); |
260 | +} |
261 | + |
262 | +HYPERVISOR_ATTR_RO(compiled_by); |
263 | + |
264 | +static ssize_t compile_date_show(struct kobject *kobj, struct kobj_attribute *attr, char *buffer) |
265 | +{ |
266 | + struct xen_compile_info info; |
267 | + int ret; |
268 | + |
269 | + ret = HYPERVISOR_xen_version(XENVER_compile_info, &info); |
270 | + if (ret) |
271 | + return ret; |
272 | + |
273 | + return sprintf(buffer, "%s\n", info.compile_date); |
274 | +} |
275 | + |
276 | +HYPERVISOR_ATTR_RO(compile_date); |
277 | + |
278 | +static struct attribute *xen_compile_attrs[] = { |
279 | + &compiler_attr.attr, |
280 | + &compiled_by_attr.attr, |
281 | + &compile_date_attr.attr, |
282 | + NULL |
283 | +}; |
284 | + |
285 | +static struct attribute_group xen_compilation_group = { |
286 | + .name = "compilation", |
287 | + .attrs = xen_compile_attrs, |
288 | +}; |
289 | + |
290 | +static int __init xen_compilation_init(void) |
291 | +{ |
292 | + return sysfs_create_group(hypervisor_kobj, |
293 | + &xen_compilation_group); |
294 | +} |
295 | + |
296 | +static void xen_compilation_destroy(void) |
297 | +{ |
298 | + sysfs_remove_group(hypervisor_kobj, |
299 | + &xen_compilation_group); |
300 | +} |
301 | + |
302 | +static ssize_t capabilities_show(struct kobject *kobj, struct kobj_attribute *attr, char *buffer) |
303 | +{ |
304 | + struct xen_capabilities_info *caps; |
305 | + int ret; |
306 | + |
307 | + caps = kmalloc(sizeof(struct xen_capabilities_info), GFP_KERNEL); |
308 | + if (!caps) |
309 | + return -ENOMEM; |
310 | + |
311 | + ret = HYPERVISOR_xen_version(XENVER_capabilities, caps); |
312 | + if (ret) |
313 | + goto out; |
314 | + |
315 | + ret = sprintf(buffer, "%s\n", caps->info); |
316 | + |
317 | +out: kfree(caps); |
318 | + |
319 | + return ret; |
320 | +} |
321 | + |
322 | +HYPERVISOR_ATTR_RO(capabilities); |
323 | + |
324 | +static ssize_t changeset_show(struct kobject *kobj, struct kobj_attribute *attr, char *buffer) |
325 | +{ |
326 | + struct xen_changeset_info cset; |
327 | + int ret; |
328 | + |
329 | + ret = HYPERVISOR_xen_version(XENVER_changeset, &cset); |
330 | + if (ret) |
331 | + return ret; |
332 | + |
333 | + return sprintf(buffer, "%s\n", cset.info); |
334 | +} |
335 | + |
336 | +HYPERVISOR_ATTR_RO(changeset); |
337 | + |
338 | +static ssize_t virtual_start_show(struct kobject *kobj, struct kobj_attribute *attr, char *buffer) |
339 | +{ |
340 | + struct xen_platform_parameters parms; |
341 | + int ret; |
342 | + |
343 | + ret = HYPERVISOR_xen_version(XENVER_platform_parameters, &parms); |
344 | + if (ret) |
345 | + return ret; |
346 | + |
347 | + return sprintf(buffer, "%lx\n", parms.virt_start); |
348 | +} |
349 | + |
350 | +HYPERVISOR_ATTR_RO(virtual_start); |
351 | + |
352 | +static ssize_t pagesize_show(struct kobject *kobj, struct kobj_attribute *attr, char *buffer) |
353 | +{ |
354 | + int ret; |
355 | + |
356 | + ret = HYPERVISOR_xen_version(XENVER_pagesize, NULL); |
357 | + if (ret < 0) |
358 | + return ret; |
359 | + |
360 | + return sprintf(buffer, "%x\n", ret); |
361 | +} |
362 | + |
363 | +HYPERVISOR_ATTR_RO(pagesize); |
364 | + |
365 | +static ssize_t writable_pt_show(struct kobject *kobj, struct kobj_attribute *attr, char *buffer) |
366 | +{ |
367 | + struct xen_feature_info info; |
368 | + int ret; |
369 | + |
370 | + info.submap_idx = XENFEAT_writable_page_tables; |
371 | + |
372 | + ret = HYPERVISOR_xen_version(XENVER_get_features, &info); |
373 | + if (ret) |
374 | + return ret; |
375 | + |
376 | + return sprintf(buffer, "%d\n", info.submap); |
377 | +} |
378 | + |
379 | +HYPERVISOR_ATTR_RO(writable_pt); |
380 | + |
381 | +static struct attribute *xen_properties_attrs[] = { |
382 | + &capabilities_attr.attr, |
383 | + &changeset_attr.attr, |
384 | + &virtual_start_attr.attr, |
385 | + &pagesize_attr.attr, |
386 | + &writable_pt_attr.attr, |
387 | + NULL |
388 | +}; |
389 | + |
390 | +static struct attribute_group xen_properties_group = { |
391 | + .name = "properties", |
392 | + .attrs = xen_properties_attrs, |
393 | +}; |
394 | + |
395 | +static int __init xen_properties_init(void) |
396 | +{ |
397 | + return sysfs_create_group(hypervisor_kobj, |
398 | + &xen_properties_group); |
399 | +} |
400 | + |
401 | +static void xen_properties_destroy(void) |
402 | +{ |
403 | + sysfs_remove_group(hypervisor_kobj, &xen_properties_group); |
404 | +} |
405 | + |
406 | +int __init sys_hypervisor_init(void) |
407 | +{ |
408 | + int ret; |
409 | + |
410 | + if (!is_running_on_xen()) |
411 | + return -ENODEV; |
412 | + |
413 | + ret = xen_sysfs_type_init(); |
414 | + if (ret) |
415 | + goto out; |
416 | + ret = xen_sysfs_version_init(); |
417 | + if (ret) |
418 | + goto version_out; |
419 | + ret = xen_compilation_init(); |
420 | + if (ret) |
421 | + goto comp_out; |
422 | + ret = xen_sysfs_uuid_init(); |
423 | + if (ret) |
424 | + goto uuid_out; |
425 | + ret = xen_properties_init(); |
426 | + if (!ret) |
427 | + goto out; |
428 | + |
429 | + xen_sysfs_uuid_destroy(); |
430 | +uuid_out: |
431 | + xen_compilation_destroy(); |
432 | +comp_out: |
433 | + xen_sysfs_version_destroy(); |
434 | +version_out: |
435 | + xen_sysfs_type_destroy(); |
436 | +out: |
437 | + return ret; |
438 | +} |
439 | + |
440 | +void __exit sys_hypervisor_exit(void) |
441 | +{ |
442 | + xen_properties_destroy(); |
443 | + xen_compilation_destroy(); |
444 | + xen_sysfs_uuid_destroy(); |
445 | + xen_sysfs_version_destroy(); |
446 | + xen_sysfs_type_destroy(); |
447 | +} |
448 | diff --git a/drivers/xen/xenctrl/xenctrl.h b/drivers/xen/xenctrl/xenctrl.h |
449 | index e585c4b..1afbdfb 100644 |
450 | --- a/drivers/xen/xenctrl/xenctrl.h |
451 | +++ b/drivers/xen/xenctrl/xenctrl.h |
452 | @@ -49,3 +49,9 @@ void privcmd_remove_proc_entry(void) __exit; |
453 | */ |
454 | int xenbus_create_proc_entry(void) __init; |
455 | void xenbus_remove_proc_entry(void) __exit; |
456 | + |
457 | +/* |
458 | + * sysfs.c |
459 | + */ |
460 | +int sys_hypervisor_init(void) __init; |
461 | +void sys_hypervisor_exit(void) __exit; |
462 | diff --git a/include/xen/interface/version.h b/include/xen/interface/version.h |
463 | index 453235e..dd58cf5 100644 |
464 | --- a/include/xen/interface/version.h |
465 | +++ b/include/xen/interface/version.h |
466 | @@ -57,4 +57,10 @@ struct xen_feature_info { |
467 | /* Declares the features reported by XENVER_get_features. */ |
468 | #include "features.h" |
469 | |
470 | +/* arg == NULL; returns host memory page size. */ |
471 | +#define XENVER_pagesize 7 |
472 | + |
473 | +/* arg == xen_domain_handle_t. */ |
474 | +#define XENVER_guest_handle 8 |
475 | + |
476 | #endif /* __XEN_PUBLIC_VERSION_H__ */ |
477 | -- |
478 | 1.5.4.1 |
479 |