Re: [PATCH] KVM: Start populating /sys/hypervisor with KVM entries

Christian Borntraeger
2018-10-09T10:41:46Z

On 10/09/2018 11:54 AM, Filippo Sironi wrote:
> Start populating /sys/hypervisor with KVM entries when we're running on
> KVM. This is to replicate functionality that's available when we're
> running on Xen.
>
> Let's start with /sys/hypervisor/uuid, which users prefer over
> /sys/devices/virtual/dmi/id/product_uuid as a way to recognize a virtual
> machine, since it's also available when running on Xen HVM and on Xen PV
> and, on top of that doesn't require root privileges by default.

Can you make this an arch hook? On s390 it is possible to get the uuid with
the stsi instruction.
See
https://git.kernel.org/pub/scm/virt/kvm/kvm.git/tree/arch/s390/kernel/sysinfo.c#n248

We do use uuid_t, but we can certainly return a char*.

>
> Signed-off-by: Filippo Sironi <sironi@amazon.de>
> ---
> drivers/Kconfig | 2 ++
> drivers/Makefile | 2 ++
> drivers/kvm/Kconfig | 14 ++++++++++++++
> drivers/kvm/Makefile | 1 +
> drivers/kvm/sys-hypervisor.c | 26 ++++++++++++++++++++++++++
> 5 files changed, 45 insertions(+)
> create mode 100644 drivers/kvm/Kconfig
> create mode 100644 drivers/kvm/Makefile
> create mode 100644 drivers/kvm/sys-hypervisor.c
>
> diff --git a/drivers/Kconfig b/drivers/Kconfig
> index afc942c54814..597519c5f7c8 100644
> --- a/drivers/Kconfig
> +++ b/drivers/Kconfig
> @@ -135,6 +135,8 @@ source "drivers/hv/Kconfig"
>
> source "drivers/xen/Kconfig"
>
> +source "drivers/kvm/Kconfig"
> +
> source "drivers/staging/Kconfig"
>
> source "drivers/platform/Kconfig"
> diff --git a/drivers/Makefile b/drivers/Makefile
> index 1056f9699192..727205e287fc 100644
> --- a/drivers/Makefile
> +++ b/drivers/Makefile
> @@ -47,6 +47,8 @@ obj-y += soc/
> obj-$(CONFIG_VIRTIO) += virtio/
> obj-$(CONFIG_XEN) += xen/
>
> +obj-$(CONFIG_KVM_GUEST) += kvm/
> +
> # regulators early, since some subsystems rely on them to initialize
> obj-$(CONFIG_REGULATOR) += regulator/
>
> diff --git a/drivers/kvm/Kconfig b/drivers/kvm/Kconfig
> new file mode 100644
> index 000000000000..3fc041df7c11
> --- /dev/null
> +++ b/drivers/kvm/Kconfig
> @@ -0,0 +1,14 @@
> +menu "KVM driver support"
> + depends on KVM_GUEST
> +
> +config KVM_SYS_HYPERVISOR
> + bool "Create KVM entries under /sys/hypervisor"
> + depends on SYSFS
> + select SYS_HYPERVISOR
> + default y
> + help
> + Create KVM entries under /sys/hypervisor (e.g., uuid). When running
> + native or on another hypervisor, /sys/hypervisor may still be
> + present, but it will have no KVM entries.
> +
> +endmenu
> diff --git a/drivers/kvm/Makefile b/drivers/kvm/Makefile
> new file mode 100644
> index 000000000000..73a43fc994b9
> --- /dev/null
> +++ b/drivers/kvm/Makefile
> @@ -0,0 +1 @@
> +obj-$(CONFIG_KVM_SYS_HYPERVISOR) += sys-hypervisor.o
> diff --git a/drivers/kvm/sys-hypervisor.c b/drivers/kvm/sys-hypervisor.c
> new file mode 100644
> index 000000000000..ef04ca65cf1a
> --- /dev/null
> +++ b/drivers/kvm/sys-hypervisor.c
> @@ -0,0 +1,26 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +
> +#include <asm/kvm_para.h>
> +
> +#include <linux/dmi.h>
> +#include <linux/kobject.h>
> +#include <linux/sysfs.h>
> +
> +static ssize_t uuid_show(struct kobject *obj,
> + struct kobj_attribute *attr,
> + char *buf)
> +{
> + const char *uuid = dmi_get_system_info(DMI_PRODUCT_UUID);
> + return sprintf(buf, "%s\n", uuid);
> +}
> +
> +static struct kobj_attribute uuid = __ATTR_RO(uuid);
> +
> +static int __init uuid_init(void)
> +{
> + if (!kvm_para_available())
> + return 0;
> + return sysfs_create_file(hypervisor_kobj, &uuid.attr);
> +}
> +
> +device_initcall(uuid_init);
>