drivers/virt: vm_gen_counter: initial driver implementation
PATCH 1/1 drivers/virt: vm_gen_counter: initial driver implementation
From: Or Idgar <[email protected]>
This patch is a driver which expose the Virtual Machine Generation ID via sysfs. The ID is a UUID value used to differentiate between virtual machines.
The VM-Generation ID is a feature defined by Microsoft (paper:
http://go.microsoft.com/fwlink/?LinkId=260709) and supported by multiple hypervisor vendors.
--- Documentation/ABI/testing/sysfs-hypervisor | 13 +++ drivers/misc/Kconfig | 6 ++ drivers/misc/Makefile | 1 + drivers/misc/vmgenid.c | 141 +++++++++++++++++++++++++++++ 4 files changed, 161 insertions(+) create mode 100644 Documentation/ABI/testing/sysfs-hypervisor create mode 100644 drivers/misc/vmgenid.c
Documentation/ABI/testing/sysfs-hypervisor new file +13 -0
@@ -0,0 +1,13 @@ +What: /sys/hypervisor/vm_gen_counter +Date: February 2018 +Contact: Or Idgar <[email protected]> + Gal Hammer <[email protected]> +Description: Expose the virtual machine generation ID. The directory + contains two files: "generation_id" and "raw". Both files + represent the same information. + + "generation_id" file is a UUID string + representation. + + "raw" file is a 128-bit integer + representation (binary).
drivers/misc/Kconfig +6 -0
@@ -500,6 +500,12 @@ config MISC_RTSX tristate default MISC_RTSX_PCI || MISC_RTSX_USB +config VMGENID + tristate "Virtual Machine Generation ID driver" + help + This is a Virtual Machine Generation ID driver which provides + a virtual machine unique identifier. + source "drivers/misc/c2port/Kconfig" source "drivers/misc/eeprom/Kconfig" source "drivers/misc/cb710/Kconfig"
drivers/misc/Makefile +1 -0
@@ -57,6 +57,7 @@ obj-$(CONFIG_ASPEED_LPC_SNOOP) += aspeed-lpc-snoop.o obj-$(CONFIG_PCI_ENDPOINT_TEST) += pci_endpoint_test.o obj-$(CONFIG_OCXL) += ocxl/ obj-$(CONFIG_MISC_RTSX) += cardreader/ +obj-$(CONFIG_VMGENID) += vmgenid.o lkdtm-$(CONFIG_LKDTM) += lkdtm_core.o lkdtm-$(CONFIG_LKDTM) += lkdtm_bugs.o
drivers/misc/vmgenid.c new file +141 -0
141 lines not on this page · raw message
Signature · 1 line
2.14.3
Greg KH
maintainerQuoted 26 lines · Or Idgar
From: Or Idgar <[email protected]>
This patch is a driver which expose the Virtual Machine Generation ID via sysfs. The ID is a UUID value used to differentiate between virtual machines.
The VM-Generation ID is a feature defined by Microsoft (paper:
http://go.microsoft.com/fwlink/?LinkId=260709) and supported by multiple hypervisor vendors.Signed-off-by Or Idgar <[email protected]>--- Documentation/ABI/testing/sysfs-hypervisor | 13 +++ drivers/misc/Kconfig | 6 ++ drivers/misc/Makefile | 1 + drivers/misc/vmgenid.c | 141 +++++++++++++++++++++++++++++ 4 files changed, 161 insertions(+) create mode 100644 Documentation/ABI/testing/sysfs-hypervisor create mode 100644 drivers/misc/vmgenid.cDocumentation/ABI/testing/sysfs-hypervisor new file +0
-0
Documentation/ABI/testing/sysfs-hypervisor line 1
Quoted 1 line
Documentation/ABI/testing/sysfs-hypervisor new file +1
-0@@ -0,0 +1,13 @@ +What: /sys/hypervisor/vm_gen_counter
Shouldn't this go under the specific hypervisor you are running on? Why in the "root" of /sys/hypervisor?
Quoted 48 lines
Documentation/ABI/testing/sysfs-hypervisor new file +12
-0+Date: February 2018 +Contact: Or Idgar <[email protected]> + Gal Hammer <[email protected]> +Description: Expose the virtual machine generation ID. The directory + contains two files: "generation_id" and "raw". Both files + represent the same information. + + "generation_id" file is a UUID string + representation. + + "raw" file is a 128-bit integer + representation (binary).drivers/misc/Kconfig +6
-0@@ -500,6 +500,12 @@ config MISC_RTSX tristate default MISC_RTSX_PCI || MISC_RTSX_USB +config VMGENID + tristate "Virtual Machine Generation ID driver" + help + This is a Virtual Machine Generation ID driver which provides + a virtual machine unique identifier. + source "drivers/misc/c2port/Kconfig" source "drivers/misc/eeprom/Kconfig" source "drivers/misc/cb710/Kconfig"drivers/misc/Makefile +1
-0@@ -57,6 +57,7 @@ obj-$(CONFIG_ASPEED_LPC_SNOOP) += aspeed-lpc-snoop.o obj-$(CONFIG_PCI_ENDPOINT_TEST) += pci_endpoint_test.o obj-$(CONFIG_OCXL) += ocxl/ obj-$(CONFIG_MISC_RTSX) += cardreader/ +obj-$(CONFIG_VMGENID) += vmgenid.o lkdtm-$(CONFIG_LKDTM) += lkdtm_core.o lkdtm-$(CONFIG_LKDTM) += lkdtm_bugs.odrivers/misc/vmgenid.c new file +1
-0@@ -0,0 +1,141 @@ +/*
drivers/misc/vmgenid.c line 11
Quoted 10 lines
drivers/misc/vmgenid.c new file +10
-0+* Virtual Machine Generation ID driver +* +* Copyright (C) 2018 Red Hat, Inc. All rights reserved. +* Authors: +* Or Idgar <[email protected]> +* Gal Hammer <[email protected]> +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License version 2 as +* published by the Free Software Foundation.
No SPDX line? Please see the documentation for how to properly add this as the first line of any new file.
I want some hypervisor people to weigh in on this before I can take it...
thanks,
greg k-h
Hi,
Quoted 21 lines · Greg KH
Quoted 20 lines · Or Idgar
From: Or Idgar <[email protected]>
This patch is a driver which expose the Virtual Machine Generation ID via sysfs. The ID is a UUID value used to differentiate between virtual machines.
The VM-Generation ID is a feature defined by Microsoft (paper:
http://go.microsoft.com/fwlink/?LinkId=260709) and supported by multiple hypervisor vendors.Signed-off-by Or Idgar <[email protected]>--- Documentation/ABI/testing/sysfs-hypervisor | 13 +++ drivers/misc/Kconfig | 6 ++ drivers/misc/Makefile | 1 + drivers/misc/vmgenid.c | 141 +++++++++++++++++++++++++++++ 4 files changed, 161 insertions(+) create mode 100644 Documentation/ABI/testing/sysfs-hypervisor create mode 100644 drivers/misc/vmgenid.c
Quoted 10 lines
Documentation/ABI/testing/sysfs-hypervisor line 1
Quoted 7 lines
Documentation/ABI/testing/sysfs-hypervisor new file +1
-0@@ -0,0 +1,13 @@ +What: /sys/hypervisor/vm_gen_counterShouldn't this go under the specific hypervisor you are running on? Why in the "root" of
/sys/hypervisor?
As far as I know, most of today's hypervisors support this feature, so adding a subdirectory doesn't seem right. The guest user should be able to access the UUID without a knowledge of the running host.
At the moment, the driver supports only QEMU, but we're planning to enhance it once we'll have access to other vendor hypervisors.
Quoted 54 lines
Quoted 54 lines
Documentation/ABI/testing/sysfs-hypervisor new file +12
-0+Date: February 2018 +Contact: Or Idgar <[email protected]> + Gal Hammer <[email protected]> +Description: Expose the virtual machine generation ID. The directory + contains two files: "generation_id" and "raw". Both files + represent the same information. + + "generation_id" file is a UUID string + representation. + + "raw" file is a 128-bit integer + representation (binary).drivers/misc/Kconfig +6
-0@@ -500,6 +500,12 @@ config MISC_RTSX tristate default MISC_RTSX_PCI || MISC_RTSX_USB +config VMGENID + tristate "Virtual Machine Generation ID driver" + help + This is a Virtual Machine Generation ID driver which provides + a virtual machine unique identifier. + source "drivers/misc/c2port/Kconfig" source "drivers/misc/eeprom/Kconfig" source "drivers/misc/cb710/Kconfig"drivers/misc/Makefile +1
-0@@ -57,6 +57,7 @@ obj-$(CONFIG_ASPEED_LPC_SNOOP) += aspeed-lpc-snoop.o obj-$(CONFIG_PCI_ENDPOINT_TEST) += pci_endpoint_test.o obj-$(CONFIG_OCXL) += ocxl/ obj-$(CONFIG_MISC_RTSX) += cardreader/ +obj-$(CONFIG_VMGENID) += vmgenid.o lkdtm-$(CONFIG_LKDTM) += lkdtm_core.o lkdtm-$(CONFIG_LKDTM) += lkdtm_bugs.odrivers/misc/vmgenid.c new file +6
-0@@ -0,0 +1,141 @@ +/* +* Virtual Machine Generation ID driver +* +* Copyright (C) 2018 Red Hat, Inc. All rights reserved. +* Authors: +* Or Idgar <[email protected]>
Quoted 8 lines
drivers/misc/vmgenid.c line 11
Quoted 5 lines
drivers/misc/vmgenid.c new file +5
-0+* Gal Hammer <[email protected]> +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License version 2 as +* published by the Free Software Foundation. No SPDX line? Please see the documentation for how to properly add this as the first line of any new file.
We'll give it another try.
Quoted 6 lines
I want some hypervisor people to weigh in on this before I can take it...
thanks,
greg k-h
Thank you.
Gal.
kbuild test robot
build botThank you for the patch! Yet something to improve:
Hi Or,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on char-misc/char-misc-testing]
[also build test ERROR on v4.16-rc2 next-20180223]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Or-Idgar/drivers-virt-vm_gen_counter-initial-driver-implementation/20180224-112017
config: sh-allmodconfig (attached as .config)
compiler: sh4-linux-gnu-gcc (Debian 7.2.0-11) 7.2.0
reproduce:
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=sh
All error/warnings (new ones prefixed by >>):
drivers/misc/vmgenid.c: In function 'generation_id_show':
>> drivers/misc/vmgenid.c:35:10: error: implicit declaration of function 'acpi_os_map_iomem'; did you mean 'acpi_os_read_iomem'? [-Werror=implicit-function-declaration]
uuidp = acpi_os_map_iomem(phy_addr, sizeof(uuid_t));
^~~~~~~~~~~~~~~~~
acpi_os_read_iomem
>> drivers/misc/vmgenid.c:35:8: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
uuidp = acpi_os_map_iomem(phy_addr, sizeof(uuid_t));
^
>> drivers/misc/vmgenid.c:40:2: error: implicit declaration of function 'acpi_os_unmap_iomem'; did you mean 'acpi_os_read_iomem'? [-Werror=implicit-function-declaration]
acpi_os_unmap_iomem(uuidp, sizeof(uuid_t));
^~~~~~~~~~~~~~~~~~~
acpi_os_read_iomem
drivers/misc/vmgenid.c: In function 'raw_show':
drivers/misc/vmgenid.c:51:8: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
uuidp = acpi_os_map_iomem(phy_addr, sizeof(uuid_t));
^
drivers/misc/vmgenid.c: In function 'acpi_vmgenid_add':
>> drivers/misc/vmgenid.c:103:29: error: dereferencing pointer to incomplete type 'struct acpi_device'
retval = get_vmgenid(device->handle);
^~
drivers/misc/vmgenid.c: At top level:
>> drivers/misc/vmgenid.c:115:36: error: array type has incomplete element type 'struct acpi_device_id'
static const struct acpi_device_id vmgenid_ids[] = {
^~~~~~~~~~~
>> drivers/misc/vmgenid.c:120:15: error: variable 'acpi_vmgenid_driver' has initializer but incomplete type
static struct acpi_driver acpi_vmgenid_driver = {
^~~~~~~~~~~
>> drivers/misc/vmgenid.c:121:3: error: 'struct acpi_driver' has no member named 'name'
.name = "vm_gen_counter",
^~~~
>> drivers/misc/vmgenid.c:121:10: warning: excess elements in struct initializer
.name = "vm_gen_counter",
^~~~~~~~~~~~~~~~
drivers/misc/vmgenid.c:121:10: note: (near initialization for 'acpi_vmgenid_driver')
>> drivers/misc/vmgenid.c:122:3: error: 'struct acpi_driver' has no member named 'ids'
.ids = vmgenid_ids,
^~~
drivers/misc/vmgenid.c:122:9: warning: excess elements in struct initializer
.ids = vmgenid_ids,
^~~~~~~~~~~
drivers/misc/vmgenid.c:122:9: note: (near initialization for 'acpi_vmgenid_driver')
>> drivers/misc/vmgenid.c:123:3: error: 'struct acpi_driver' has no member named 'owner'
.owner = THIS_MODULE,
^~~~~
In file included from include/linux/linkage.h:7:0,
from include/linux/kernel.h:7,
from include/linux/list.h:9,
from include/linux/module.h:9,
from drivers/misc/vmgenid.c:14:
include/linux/export.h:35:21: warning: excess elements in struct initializer
#define THIS_MODULE (&__this_module)
^
>> drivers/misc/vmgenid.c:123:11: note: in expansion of macro 'THIS_MODULE'
.owner = THIS_MODULE,
^~~~~~~~~~~
include/linux/export.h:35:21: note: (near initialization for 'acpi_vmgenid_driver')
#define THIS_MODULE (&__this_module)
^
>> drivers/misc/vmgenid.c:123:11: note: in expansion of macro 'THIS_MODULE'
.owner = THIS_MODULE,
^~~~~~~~~~~
>> drivers/misc/vmgenid.c:124:3: error: 'struct acpi_driver' has no member named 'ops'
.ops = {
^~~
>> drivers/misc/vmgenid.c:124:9: error: extra brace group at end of initializer
.ops = {
^
drivers/misc/vmgenid.c:124:9: note: (near initialization for 'acpi_vmgenid_driver')
drivers/misc/vmgenid.c:124:9: warning: excess elements in struct initializer
drivers/misc/vmgenid.c:124:9: note: (near initialization for 'acpi_vmgenid_driver')
drivers/misc/vmgenid.c: In function 'vmgenid_init':
>> drivers/misc/vmgenid.c:132:9: error: implicit declaration of function 'acpi_bus_register_driver'; did you mean 'acpi_nvs_register'? [-Werror=implicit-function-declaration]
return acpi_bus_register_driver(&acpi_vmgenid_driver);
^~~~~~~~~~~~~~~~~~~~~~~~
acpi_nvs_register
drivers/misc/vmgenid.c: In function 'vmgenid_exit':
>> drivers/misc/vmgenid.c:137:2: error: implicit declaration of function 'acpi_bus_unregister_driver'; did you mean 'bus_unregister_notifier'? [-Werror=implicit-function-declaration]
acpi_bus_unregister_driver(&acpi_vmgenid_driver);
^~~~~~~~~~~~~~~~~~~~~~~~~~
bus_unregister_notifier
drivers/misc/vmgenid.c: At top level:
>> drivers/misc/vmgenid.c:120:27: error: storage size of 'acpi_vmgenid_driver' isn't known
static struct acpi_driver acpi_vmgenid_driver = {
^~~~~~~~~~~~~~~~~~~
drivers/misc/vmgenid.c:115:36: warning: 'vmgenid_ids' defined but not used [-Wunused-variable]
static const struct acpi_device_id vmgenid_ids[] = {
^~~~~~~~~~~cc1: some warnings being treated as errors
vim +35 drivers/misc/vmgenid.c
> 14 #include <linux/module.h>
15 #include <linux/kernel.h>
16 #include <linux/acpi.h>
17 #include <linux/uuid.h>
18
19 MODULE_LICENSE("GPL");
20 MODULE_AUTHOR("Or Idgar <[email protected]>");
21 MODULE_AUTHOR("Gal Hammer <[email protected]>");
22 MODULE_DESCRIPTION("Virtual Machine Generation ID");
23 MODULE_VERSION("0.1");
24
25 ACPI_MODULE_NAME("vmgenid");
26
27 static u64 phy_addr;
28
29 static ssize_t generation_id_show(struct device *_d,
30 struct device_attribute *attr, char *buf)
31 {
32 uuid_t *uuidp;
33 ssize_t result;
34
> 35 uuidp = acpi_os_map_iomem(phy_addr, sizeof(uuid_t));
36 if (!uuidp)
37 return -EFAULT;
38
39 result = sprintf(buf, "%pUl\n", uuidp);
> 40 acpi_os_unmap_iomem(uuidp, sizeof(uuid_t));
41 return result;
42 }
43 static DEVICE_ATTR_RO(generation_id);
44
45 static ssize_t raw_show(struct device *_d,
46 struct device_attribute *attr,
47 char *buf)
48 {
49 uuid_t *uuidp;
50
> 51 uuidp = acpi_os_map_iomem(phy_addr, sizeof(uuid_t));
52 if (!uuidp)
53 return -EFAULT;
54 memcpy(buf, uuidp, sizeof(uuid_t));
55 acpi_os_unmap_iomem(uuidp, sizeof(uuid_t));
56 return sizeof(uuid_t);
57 }
58 static DEVICE_ATTR_RO(raw);
59
60 static struct attribute *vmgenid_attrs[] = {
61 &dev_attr_generation_id.attr,
62 &dev_attr_raw.attr,
63 NULL,
64 };
65 static const struct attribute_group vmgenid_group = {
66 .name = "vm_gen_counter",
67 .attrs = vmgenid_attrs,
68 };
69
70 static int get_vmgenid(acpi_handle handle)
71 {
72 int i;
73 struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
74 acpi_status status;
75 union acpi_object *pss;
76 union acpi_object *element;
77
78 status = acpi_evaluate_object(handle, "ADDR", NULL, &buffer);
79 if (ACPI_FAILURE(status)) {
80 ACPI_EXCEPTION((AE_INFO, status, "Evaluating _ADDR"));
81 return -ENODEV;
82 }
83 pss = buffer.pointer;
84 if (!pss || pss->type != ACPI_TYPE_PACKAGE || pss->package.count != 2)
85 return -EFAULT;
86
87 phy_addr = 0;
88 for (i = 0; i < pss->package.count; i++) {
89 element = &(pss->package.elements[i]);
90 if (element->type != ACPI_TYPE_INTEGER)
91 return -EFAULT;
92 phy_addr |= element->integer.value << i*32;
93 }
94 return 0;
95 }
96
97 static int acpi_vmgenid_add(struct acpi_device *device)
98 {
99 int retval;
100
101 if (!device)
102 return -EINVAL;
> 103 retval = get_vmgenid(device->handle);
104 if (retval < 0)
105 return retval;
106 return sysfs_create_group(hypervisor_kobj, &vmgenid_group);
107 }
108
109 static int acpi_vmgenid_remove(struct acpi_device *device)
110 {
111 sysfs_remove_group(hypervisor_kobj, &vmgenid_group);
112 return 0;
113 }
114
> 115 static const struct acpi_device_id vmgenid_ids[] = {
116 {"QEMUVGID", 0},
117 {"", 0},
118 };
119
> 120 static struct acpi_driver acpi_vmgenid_driver = {
> 121 .name = "vm_gen_counter",
> 122 .ids = vmgenid_ids,
> 123 .owner = THIS_MODULE,
> 124 .ops = {
125 .add = acpi_vmgenid_add,
126 .remove = acpi_vmgenid_remove,
127 }
128 };
129
130 static int __init vmgenid_init(void)
131 {
> 132 return acpi_bus_register_driver(&acpi_vmgenid_driver);
133 }
134
135 static void __exit vmgenid_exit(void)
136 {
> 137 acpi_bus_unregister_driver(&acpi_vmgenid_driver); 138 }
139
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
kbuild test robot
build botThank you for the patch! Perhaps something to improve:
Hi Or,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on char-misc/char-misc-testing]
[also build test WARNING on v4.16-rc2 next-20180223]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Or-Idgar/drivers-virt-vm_gen_counter-initial-driver-implementation/20180224-112017
reproduce:
# apt-get install sparse
make ARCH=x86_64 allmodconfig
make C=1 CF=-D__CHECK_ENDIAN__sparse warnings: (new ones prefixed by >>)
>> drivers/misc/vmgenid.c:35:15: sparse: incorrect type in assignment (different address spaces) @@ expected struct uuid_t @@ got uct uuid_t @@ drivers/misc/vmgenid.c:35:15: expected struct uuid_t drivers/misc/vmgenid.c:35:15: got void >> drivers/misc/vmgenid.c:40:29: sparse: incorrect type in argument 1 (different address spaces) @@ expected void @@ got strvoid @@
drivers/misc/vmgenid.c:40:29: expected void
drivers/misc/vmgenid.c:40:29: got struct uuid_t
drivers/misc/vmgenid.c:51:15: sparse: incorrect type in assignment (different address spaces) @@ expected struct uuid_t @@ got uct uuid_t @@ drivers/misc/vmgenid.c:51:15: expected struct uuid_t
drivers/misc/vmgenid.c:51:15: got void
drivers/misc/vmgenid.c:55:29: sparse: incorrect type in argument 1 (different address spaces) @@ expected void @@ got strvoid @@ drivers/misc/vmgenid.c:55:29: expected void
drivers/misc/vmgenid.c:55:29: got struct uuid_t
vim +35 drivers/misc/vmgenid.c
28
29 static ssize_t generation_id_show(struct device *_d,
30 struct device_attribute *attr, char *buf)
31 {
32 uuid_t *uuidp;
33 ssize_t result;
34
> 35 uuidp = acpi_os_map_iomem(phy_addr, sizeof(uuid_t));
36 if (!uuidp)
37 return -EFAULT;
38
39 result = sprintf(buf, "%pUl\n", uuidp);
> 40 acpi_os_unmap_iomem(uuidp, sizeof(uuid_t));
41 return result;
42 }
43 static DEVICE_ATTR_RO(generation_id);
44 ---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
kbuild test robot
build botThank you for the patch! Yet something to improve:
Hi Or,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on char-misc/char-misc-testing]
[also build test ERROR on v4.16-rc2 next-20180223]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Or-Idgar/drivers-virt-vm_gen_counter-initial-driver-implementation/20180224-112017
config: i386-allmodconfig (attached as .config)
compiler: gcc-7 (Debian 7.3.0-1) 7.3.0 reproduce:
# save the attached .config to linux build tree
make ARCH=i386 All errors (new ones prefixed by >>):
>> ERROR: "hypervisor_kobj" [drivers/misc/vmgenid.ko] undefined!
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation