[libvirt PATCH v4 6/6] Include vdpa devices in node device list

Jonathon Jongsma jjongsma at redhat.com
Wed Sep 30 20:29:41 UTC 2020


On Wed, 30 Sep 2020 10:02:04 -0500
Jonathon Jongsma <jjongsma at redhat.com> wrote:

> Adding Cindy and Jason to cc for input on the path issue below
> 
> On Tue, 29 Sep 2020 15:56:13 -0400
> Laine Stump <laine at redhat.com> wrote:
> 
> > On 9/24/20 5:45 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.    
> > 
> > 
> > Can you provide an example in the commit log of what the output xml 
> > looks like for nodedev-list and nodedev-dumpxml?  
> 
> So, this is what the xml looks like for the vdpa node device:
> 
> <device>
>   <name>vdpa_vdpa0</name>
>   <path>/sys/devices/vdpa0</path>
>   <parent>computer</parent>
>   <driver>
>     <name>vhost_vdpa</name>
>   </driver>
>   <capability type='vdpa'>
>   </capability>
> </device>
>  
> 
> The /sys/devices/ path is provided by udev, but unfortunately that
> path is not particularly useful for using the device with libvirt.
> Ideally, the node device xml should include the path to the chardev
> (e.g. /dev/vhost-vdpa-0) which is used to actually connect to the
> device. I don't see an obvious way (aside from string manipulation,
> which doesn't seem very reliable) to get from this sysfs path to the
> /dev/ path. Jason or Cindy, do you have any input here?

So after after a little more thinking and poking it looks like it may
not be too hard to connect the sysfs path to the chardev after all. I
don't have any vdpa hardware at the moment, but for vdpa_sim, the sysfs
path /sys/devices/vdpa0 has a subdirectory named vhost-vdpa-0 that
matches the name under /dev/ (/dev/vhost-vdpa-0). So perhaps I can use
that to generate the device path. 

Something like this pseudo-code: 

for file in syspath {
  if file.name begins with "vhost-vdpa" {
    return "/dev/" + file.name;
  }
}

Are these assumptions safe? Will the file always begin with
"vhost-vdpa"? Will it always match the /dev file? Jason?

In that case, I can adjust the node device XML to be something like:

<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>

(not totally sure about the naming of the xml element).

> 
> 
> > 
> >   
> > >
> > > Signed-off-by: Jonathon Jongsma <jjongsma at redhat.com>
> > > ---
> > >   include/libvirt/libvirt-nodedev.h  |  1 +
> > >   src/conf/node_device_conf.c        |  5 +++++
> > >   src/conf/node_device_conf.h        |  4 +++-
> > >   src/conf/virnodedeviceobj.c        |  4 +++-
> > >   src/node_device/node_device_udev.c | 16 ++++++++++++++++
> > >   tools/virsh-nodedev.c              |  3 +++
> > >   6 files changed, 31 insertions(+), 2 deletions(-)
> > >
> > > diff --git a/include/libvirt/libvirt-nodedev.h
> > > b/include/libvirt/libvirt-nodedev.h index dd2ffd5782..b73b076f14
> > > 100644 --- a/include/libvirt/libvirt-nodedev.h
> > > +++ b/include/libvirt/libvirt-nodedev.h
> > > @@ -82,6 +82,7 @@ typedef enum {
> > >       VIR_CONNECT_LIST_NODE_DEVICES_CAP_MDEV          = 1 << 14,
> > > /* Mediated device */ VIR_CONNECT_LIST_NODE_DEVICES_CAP_CCW_DEV
> > > = 1 << 15, /* CCW device */
> > > VIR_CONNECT_LIST_NODE_DEVICES_CAP_CSS_DEV       = 1 << 16, /* CSS
> > > device */
> > > +    VIR_CONNECT_LIST_NODE_DEVICES_CAP_VDPA          = 1 << 17, /*
> > > vDPA device */ } virConnectListAllNodeDeviceFlags;
> > >   
> > >   int                     virConnectListAllNodeDevices
> > > (virConnectPtr conn, diff --git a/src/conf/node_device_conf.c
> > > b/src/conf/node_device_conf.c index a9a03ad6c2..3eab1cda75 100644
> > > --- a/src/conf/node_device_conf.c
> > > +++ b/src/conf/node_device_conf.c
> > > @@ -66,6 +66,7 @@ VIR_ENUM_IMPL(virNodeDevCap,
> > >                 "mdev",
> > >                 "ccw",
> > >                 "css",
> > > +              "vdpa",
> > >   );
> > >   
> > >   VIR_ENUM_IMPL(virNodeDevNetCap,
> > > @@ -614,6 +615,7 @@ virNodeDeviceDefFormat(const virNodeDeviceDef
> > > *def) case VIR_NODE_DEV_CAP_MDEV_TYPES:
> > >           case VIR_NODE_DEV_CAP_FC_HOST:
> > >           case VIR_NODE_DEV_CAP_VPORTS:
> > > +        case VIR_NODE_DEV_CAP_VDPA:
> > >           case VIR_NODE_DEV_CAP_LAST:
> > >               break;
> > >           }
> > > @@ -1913,6 +1915,7 @@ virNodeDevCapsDefParseXML(xmlXPathContextPtr
> > > ctxt, case VIR_NODE_DEV_CAP_FC_HOST:
> > >       case VIR_NODE_DEV_CAP_VPORTS:
> > >       case VIR_NODE_DEV_CAP_SCSI_GENERIC:
> > > +    case VIR_NODE_DEV_CAP_VDPA:
> > >       case VIR_NODE_DEV_CAP_LAST:
> > >           virReportError(VIR_ERR_INTERNAL_ERROR,
> > >                          _("unknown capability type '%d' for
> > > '%s'"), @@ -2232,6 +2235,7 @@
> > > virNodeDevCapsDefFree(virNodeDevCapsDefPtr caps) case
> > > VIR_NODE_DEV_CAP_VPORTS: case VIR_NODE_DEV_CAP_CCW_DEV:
> > >       case VIR_NODE_DEV_CAP_CSS_DEV:
> > > +    case VIR_NODE_DEV_CAP_VDPA:
> > >       case VIR_NODE_DEV_CAP_LAST:
> > >           /* This case is here to shutup the compiler */
> > >           break;
> > > @@ -2286,6 +2290,7 @@ virNodeDeviceUpdateCaps(virNodeDeviceDefPtr
> > > def) case VIR_NODE_DEV_CAP_MDEV:
> > >           case VIR_NODE_DEV_CAP_CCW_DEV:
> > >           case VIR_NODE_DEV_CAP_CSS_DEV:
> > > +        case VIR_NODE_DEV_CAP_VDPA:
> > >           case VIR_NODE_DEV_CAP_LAST:
> > >               break;
> > >           }
> > > diff --git a/src/conf/node_device_conf.h
> > > b/src/conf/node_device_conf.h index 5484bc340f..4f8e47a068 100644
> > > --- a/src/conf/node_device_conf.h
> > > +++ b/src/conf/node_device_conf.h
> > > @@ -65,6 +65,7 @@ typedef enum {
> > >       VIR_NODE_DEV_CAP_MDEV,              /* Mediated device */
> > >       VIR_NODE_DEV_CAP_CCW_DEV,           /* s390 CCW device */
> > >       VIR_NODE_DEV_CAP_CSS_DEV,           /* s390 channel
> > > subsystem device */
> > > +    VIR_NODE_DEV_CAP_VDPA,              /* vDPA device */
> > >   
> > >       VIR_NODE_DEV_CAP_LAST
> > >   } virNodeDevCapType;
> > > @@ -369,7 +370,8 @@ virNodeDevCapsDefFree(virNodeDevCapsDefPtr
> > > caps); VIR_CONNECT_LIST_NODE_DEVICES_CAP_MDEV_TYPES    | \
> > >                    VIR_CONNECT_LIST_NODE_DEVICES_CAP_MDEV
> > > | \ VIR_CONNECT_LIST_NODE_DEVICES_CAP_CCW_DEV       | \
> > > -                 VIR_CONNECT_LIST_NODE_DEVICES_CAP_CSS_DEV)
> > > +                 VIR_CONNECT_LIST_NODE_DEVICES_CAP_CSS_DEV
> > > | \
> > > +                 VIR_CONNECT_LIST_NODE_DEVICES_CAP_VDPA)
> > >   
> > >   int
> > >   virNodeDeviceGetSCSIHostCaps(virNodeDevCapSCSIHostPtr
> > > scsi_host); diff --git a/src/conf/virnodedeviceobj.c
> > > b/src/conf/virnodedeviceobj.c index 8aefd15e94..83c58ebe91 100644
> > > --- a/src/conf/virnodedeviceobj.c
> > > +++ b/src/conf/virnodedeviceobj.c
> > > @@ -711,6 +711,7 @@ virNodeDeviceObjHasCap(const virNodeDeviceObj
> > > *obj, case VIR_NODE_DEV_CAP_MDEV:
> > >           case VIR_NODE_DEV_CAP_CCW_DEV:
> > >           case VIR_NODE_DEV_CAP_CSS_DEV:
> > > +        case VIR_NODE_DEV_CAP_VDPA:
> > >           case VIR_NODE_DEV_CAP_LAST:
> > >               break;
> > >           }
> > > @@ -862,7 +863,8 @@ virNodeDeviceObjMatch(virNodeDeviceObjPtr obj,
> > >                 MATCH(MDEV_TYPES)    ||
> > >                 MATCH(MDEV)          ||
> > >                 MATCH(CCW_DEV)       ||
> > > -              MATCH(CSS_DEV)))
> > > +              MATCH(CSS_DEV)       ||
> > > +              MATCH(VDPA)))
> > >               return false;
> > >       }
> > >   
> > > diff --git a/src/node_device/node_device_udev.c
> > > b/src/node_device/node_device_udev.c index 12e3f30bad..fda72f9071
> > > 100644 --- a/src/node_device/node_device_udev.c
> > > +++ b/src/node_device/node_device_udev.c
> > > @@ -1144,6 +1144,18 @@ udevProcessCSS(struct udev_device *device,
> > >       return 0;
> > >   }
> > >   
> > > +
> > > +static int
> > > +udevProcessVDPA(struct udev_device *device,
> > > +                virNodeDeviceDefPtr def)
> > > +{
> > > +    if (udevGenerateDeviceName(device, def, NULL) != 0)
> > > +        return -1;
> > > +
> > > +    return 0;
> > > +}
> > > +
> > > +
> > >   static int
> > >   udevGetDeviceNodes(struct udev_device *device,
> > >                      virNodeDeviceDefPtr def)
> > > @@ -1224,6 +1236,8 @@ udevGetDeviceType(struct udev_device
> > > *device, *type = VIR_NODE_DEV_CAP_CCW_DEV;
> > >           else if (STREQ_NULLABLE(subsystem, "css"))
> > >               *type = VIR_NODE_DEV_CAP_CSS_DEV;
> > > +        else if (STREQ_NULLABLE(subsystem, "vdpa"))
> > > +            *type = VIR_NODE_DEV_CAP_VDPA;
> > >   
> > >           VIR_FREE(subsystem);
> > >       }
> > > @@ -1270,6 +1284,8 @@ udevGetDeviceDetails(struct udev_device
> > > *device, return udevProcessCCW(device, def);
> > >       case VIR_NODE_DEV_CAP_CSS_DEV:
> > >           return udevProcessCSS(device, def);
> > > +    case VIR_NODE_DEV_CAP_VDPA:
> > > +        return udevProcessVDPA(device, def);
> > >       case VIR_NODE_DEV_CAP_MDEV_TYPES:
> > >       case VIR_NODE_DEV_CAP_SYSTEM:
> > >       case VIR_NODE_DEV_CAP_FC_HOST:
> > > diff --git a/tools/virsh-nodedev.c b/tools/virsh-nodedev.c
> > > index 2edd403a64..19f0c17b4f 100644
> > > --- a/tools/virsh-nodedev.c
> > > +++ b/tools/virsh-nodedev.c
> > > @@ -464,6 +464,9 @@ cmdNodeListDevices(vshControl *ctl, const
> > > vshCmd *cmd G_GNUC_UNUSED) case VIR_NODE_DEV_CAP_CSS_DEV:
> > >               flags |= VIR_CONNECT_LIST_NODE_DEVICES_CAP_CSS_DEV;
> > >               break;
> > > +        case VIR_NODE_DEV_CAP_VDPA:
> > > +            flags |= VIR_CONNECT_LIST_NODE_DEVICES_CAP_VDPA;
> > > +            break;
> > >           case VIR_NODE_DEV_CAP_LAST:
> > >               break;
> > >           }    
> > 
> >   
> 




More information about the libvir-list mailing list