[libvirt PATCH v2 15/16] api: add virNodeDeviceCreate()

Ján Tomko jtomko at redhat.com
Tue Aug 25 13:15:33 UTC 2020


On a Tuesday in 2020, Jonathon Jongsma wrote:
>This new API function provides a way to start a persistently-defined
>mediate device that was defined by virNodeDeviceDefineXML() (or one that
>was defined externally via mdevctl)
>
>Signed-off-by: Jonathon Jongsma <jjongsma at redhat.com>
>---
> include/libvirt/libvirt-nodedev.h            |  2 +
> src/driver-nodedev.h                         |  4 ++
> src/libvirt-nodedev.c                        | 35 +++++++++++
> src/libvirt_public.syms                      |  1 +
> src/node_device/node_device_driver.c         | 64 ++++++++++++++++++++
> src/node_device/node_device_driver.h         |  6 ++
> src/node_device/node_device_udev.c           |  1 +
> src/remote/remote_driver.c                   |  1 +
> src/remote/remote_protocol.x                 | 14 ++++-
> src/remote_protocol-structs                  |  4 ++
> tests/nodedevmdevctldata/mdevctl-create.argv |  1 +
> tests/nodedevmdevctltest.c                   | 11 +++-
> 12 files changed, 141 insertions(+), 3 deletions(-)
> create mode 100644 tests/nodedevmdevctldata/mdevctl-create.argv
>
>@@ -1162,6 +1188,44 @@ nodeDeviceUndefine(virNodeDevicePtr device)
> }
>
>
>+int nodeDeviceCreate(virNodeDevicePtr device)
>+{
>+    int ret = -1;
>+    virNodeDeviceObjPtr obj = NULL;
>+    virNodeDeviceDefPtr def;
>+    g_autofree char *parent = NULL;

../src/node_device/node_device_driver.c:1128:22: error: unused variable 'parent' [-Werror,-Wunused-variable]
     g_autofree char *parent = NULL;
                      ^


>+
>+    if (!(obj = nodeDeviceObjFindByName(device->name)))
>+        return -1;
>+
>+    if (virNodeDeviceObjIsActive(obj)) {
>+        virReportError(VIR_ERR_OPERATION_INVALID, "%s",
>+                       _("Device is already active"));
>+        goto cleanup;
>+    }
>+    def = virNodeDeviceObjGetDef(obj);
>+
>+    if (virNodeDeviceCreateEnsureACL(device->conn, def) < 0)
>+        goto cleanup;
>+
>+    if (nodeDeviceHasCapability(def, VIR_NODE_DEV_CAP_MDEV)) {
>+        if (virMdevctlCreate(def) < 0) {
>+            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>+                           _("Unable to create mediated device"));
>+            goto cleanup;
>+        }
>+        ret = 0;
>+    } else {
>+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
>+                       _("Unsupported device type"));
>+    }
>+
>+ cleanup:
>+    virNodeDeviceObjEndAPI(&obj);
>+    return ret;
>+}
>+
>+
> int
> nodeConnectNodeDeviceEventRegisterAny(virConnectPtr conn,
>                                       virNodeDevicePtr device,
>diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x
>index d668074204..b019f38efd 100644
>--- a/src/remote/remote_protocol.x
>+++ b/src/remote/remote_protocol.x
>@@ -2152,6 +2152,10 @@ struct remote_node_device_undefine_args {
>     remote_nonnull_string name;
> };
>
>+struct remote_node_device_create_args {
>+    remote_nonnull_string name;
>+};
>+
>
> /*
>  * Events Register/Deregister:
>@@ -6682,7 +6686,6 @@ enum remote_procedure {
>     /**
>      * @generate: both
>      * @acl: node_device:write
>-     * @acl: node_device:start

This change looks fishy.

>      */
>     REMOTE_PROC_NODE_DEVICE_DEFINE_XML = 423,
>
>@@ -6691,6 +6694,13 @@ enum remote_procedure {
>      * @priority: high
>      * @acl: node_device:stop
>      */
>-    REMOTE_PROC_NODE_DEVICE_UNDEFINE = 424
>+    REMOTE_PROC_NODE_DEVICE_UNDEFINE = 424,
>+
>+    /**
>+     * @generate: both
>+     * @priority: high
>+     * @acl: node_device:start
>+     */
>+    REMOTE_PROC_NODE_DEVICE_CREATE = 425
>
> };
>diff --git a/tests/nodedevmdevctldata/mdevctl-create.argv b/tests/nodedevmdevctldata/mdevctl-create.argv
>new file mode 100644
>index 0000000000..802109340c
>--- /dev/null
>+++ b/tests/nodedevmdevctldata/mdevctl-create.argv
>@@ -0,0 +1 @@
>+$MDEVCTL_BINARY$ start -u 8a05ad83-3472-497d-8631-8142f31460e8
>diff --git a/tests/nodedevmdevctltest.c b/tests/nodedevmdevctltest.c
>index 216c70f1b8..a6726616dc 100644
>--- a/tests/nodedevmdevctltest.c
>+++ b/tests/nodedevmdevctltest.c
>@@ -14,7 +14,8 @@ typedef enum {
>     MDEVCTL_CMD_START,
>     MDEVCTL_CMD_STOP,
>     MDEVCTL_CMD_DEFINE,

>-    MDEVCTL_CMD_UNDEFINE
>+    MDEVCTL_CMD_UNDEFINE,

The last enum entry can be followed by a colon to avoid changes like
these, it's just remote_protocol.x where that does not work.

>+    MDEVCTL_CMD_CREATE
> } MdevctlCmd;
>

Jano
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20200825/8b146cb3/attachment-0001.sig>


More information about the libvir-list mailing list