On 10/14/20 1:08 PM, Jonathon Jongsma wrote:
The current udev node device driver ignores all events related to
vdpa
devices. Since libvirt now supports vDPA network devices, include these
devices in the device list.
Example output:
virsh # nodedev-list
[...ommitted long list of nodedevs...]
vdpa_vdpa0
virsh # nodedev-dumpxml vdpa_vdpa0
<device>
<name>vdpa_vdpa0</name>
<path>/sys/devices/vdpa0</path>
<parent>computer</parent>
<driver>
<name>vhost_vdpa</name>
</driver>
<capability type='vdpa'>
<chardev>/dev/vhost-vdpa-0</chardev>
</capability>
</device>
NOTE: normally the 'parent' would be a PCI device instead of 'computer',
but this example output is from the vdpa_sim kernel module, so it
doesn't have a normal parent device.
Signed-off-by: Jonathon Jongsma <jjongsma(a)redhat.com>
---
docs/formatnode.html.in | 9 +++++
docs/schemas/nodedev.rng | 10 ++++++
include/libvirt/libvirt-nodedev.h | 1 +
src/conf/node_device_conf.c | 14 ++++++++
src/conf/node_device_conf.h | 11 ++++++-
src/conf/virnodedeviceobj.c | 4 ++-
src/node_device/node_device_udev.c | 53 ++++++++++++++++++++++++++++++
tools/virsh-nodedev.c | 3 ++
8 files changed, 103 insertions(+), 2 deletions(-)
Coverity notes a RESOURCE_LEAK
diff --git a/src/node_device/node_device_udev.c
b/src/node_device/node_device_udev.c
index 29a7eaa07c..b1b8427c05 100644
--- a/src/node_device/node_device_udev.c
+++ b/src/node_device/node_device_udev.c
@@ -1142,6 +1142,55 @@ udevProcessCSS(struct udev_device *device,
return 0;
}
+
+static int
+udevGetVDPACharDev(const char *sysfs_path,
+ virNodeDevCapDataPtr data)
+{
+ struct dirent *entry;
+ DIR *dir = NULL;
+ int direrr;
+
+ if (virDirOpenIfExists(&dir, sysfs_path) <= 0)
+ return -1;
Any return after this leaks @dir - need a VIR_CLOSE_DIR(dir)
+
+ while ((direrr = virDirRead(dir, &entry, NULL)) > 0) {
+ if (g_str_has_prefix(entry->d_name, "vhost-vdpa")) {
+ g_autofree char *chardev = g_strdup_printf("/dev/%s",
entry->d_name);
+
+ if (!virFileExists(chardev)) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("vDPA chardev path '%s' does not
exist"),
+ chardev);> + return -1;
+ }
+ VIR_DEBUG("vDPA chardev is at '%s'", chardev);
+
+ data->vdpa.chardev = g_steal_pointer(&chardev);
+ break;
+ }
+ }
+
+ if (direrr < 0)
+ return -1;
+
+ return 0;
+}
+
John
[...]