xen: add sysfs node for hypervisor build id
authorJuergen Gross <jgross@suse.com>
Wed, 14 Jun 2017 17:23:52 +0000 (19:23 +0200)
committerJuergen Gross <jgross@suse.com>
Thu, 15 Jun 2017 06:50:37 +0000 (08:50 +0200)
For support of Xen hypervisor live patching the hypervisor build id is
needed. Add a node /sys/hypervisor/properties/buildid containing the
information.

Signed-off-by: Juergen Gross <jgross@suse.com>
Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Signed-off-by: Juergen Gross <jgross@suse.com>
Documentation/ABI/testing/sysfs-hypervisor-xen
drivers/xen/sys-hypervisor.c

index c0edb3f..53b7b2e 100644 (file)
@@ -1,5 +1,5 @@
 What:          /sys/hypervisor/guest_type
-Date:          May 2017
+Date:          June 2017
 KernelVersion: 4.13
 Contact:       xen-devel@lists.xenproject.org
 Description:   If running under Xen:
@@ -32,3 +32,12 @@ Description: If running under Xen:
                Describes Xen PMU features (as an integer). A set bit indicates
                that the corresponding feature is enabled. See
                include/xen/interface/xenpmu.h for available features
+
+What:          /sys/hypervisor/properties/buildid
+Date:          June 2017
+KernelVersion: 4.13
+Contact:       xen-devel@lists.xenproject.org
+Description:   If running under Xen:
+               Build id of the hypervisor, needed for hypervisor live patching.
+               Might return "<denied>" in case of special security settings
+               in the hypervisor.
index 2f78f84..9d314bb 100644 (file)
@@ -356,12 +356,40 @@ static ssize_t features_show(struct hyp_sysfs_attr *attr, char *buffer)
 
 HYPERVISOR_ATTR_RO(features);
 
+static ssize_t buildid_show(struct hyp_sysfs_attr *attr, char *buffer)
+{
+       ssize_t ret;
+       struct xen_build_id *buildid;
+
+       ret = HYPERVISOR_xen_version(XENVER_build_id, NULL);
+       if (ret < 0) {
+               if (ret == -EPERM)
+                       ret = sprintf(buffer, "<denied>");
+               return ret;
+       }
+
+       buildid = kmalloc(sizeof(*buildid) + ret, GFP_KERNEL);
+       if (!buildid)
+               return -ENOMEM;
+
+       buildid->len = ret;
+       ret = HYPERVISOR_xen_version(XENVER_build_id, buildid);
+       if (ret > 0)
+               ret = sprintf(buffer, "%s", buildid->buf);
+       kfree(buildid);
+
+       return ret;
+}
+
+HYPERVISOR_ATTR_RO(buildid);
+
 static struct attribute *xen_properties_attrs[] = {
        &capabilities_attr.attr,
        &changeset_attr.attr,
        &virtual_start_attr.attr,
        &pagesize_attr.attr,
        &features_attr.attr,
+       &buildid_attr.attr,
        NULL
 };