[libvirt] [PATCH] util: mdev: support persistent devices with mdevctl
Jonathon Jongsma
jjongsma at redhat.com
Mon Aug 19 14:48:40 UTC 2019
On Wed, 2019-08-14 at 16:14 +0200, Boris Fiuczynski wrote:
> On 8/14/19 12:02 AM, Jonathon Jongsma wrote:
> > When a host is rebooted, mediated devices disappear from
> > sysfs. mdevctl
> > (https://github.com/mdevctl/mdevctl) is a utility for managing and
> > persisting these devices. It maintains a registry of mediated
> > devices
> > and can start and stop them by UUID.
> >
> > when libvirt attempts to create a new mediated device object, we
> > currently
> > fail if the path does not exist in sysfs. This patch tries a little
> > bit
> > harder by using mdevctl to attempt to activate the device. The
> > approach
> > is fairly naive -- it just calls 'mdevctl start -u $UUID' without
> > checking whether this UUID is registered with mdevctl or not.
> >
> > See https://bugzilla.redhat.com/show_bug.cgi?id=1699274
> >
> > Signed-off-by: Jonathon Jongsma <jjongsma at redhat.com>
> > ---
> > NOTES:
> > - an argument could be made that we should simply do nothing here.
> > mdevctl does
> > have support for automatically activating the mediated device
> > when the parent
> > device becomes available (via udev). So if the administrator set
> > up the mdev
> > to start automatically, this patch should not even be necessary.
> > That said, I
> > think this patch could still be useful.
>
> I would actually like to use this argument since this patch
> unconditionally starts/creates a persistently defined mdev without
> ever
> stopping/destroying it and also not looking if it is defined as to
> be
> automatically started or manually started. If the mdev is specified
> in
> mdevctl to be started automatically I would rate this as mdevctl is
> in
> control of this mdevs lifecycle and libvirt should not interfere
> with
> it. It might be that I am over-interpreting auto and manual as start
> options in mdevctl but it feels to me that libvirt and mdevctl
> should
> not run into a management clash of host resources.
>
> In addition what about a user specifiable tag in the domain xmls
> mdev
> definition which controls the management behavior of an mdev with
> mdevctl or another tool?
Thanks for the feedback. I welcome additional opinions on this. If
there's a concensus that the right approach is to do nothing, I can
drop this patch. Or alternately, we could simply point users toward
mdevctl in the error message. For example, something like:
diff --git a/src/util/virmdev.c b/src/util/virmdev.c
index 3d5488cdae..70d990eace 100644
--- a/src/util/virmdev.c
+++ b/src/util/virmdev.c
@@ -149,7 +149,7 @@ virMediatedDeviceNew(const char *uuidstr,
virMediatedDeviceModelType model)
if (!virFileExists(sysfspath)) {
virReportError(VIR_ERR_DEVICE_MISSING,
- _("mediated device '%s' not found"), uuidstr);
+ _("mediated device '%s' not found. Persistent
devices can be managed with 'mdevctl'."), uuidstr);
return NULL;
}
>
>
> > - As I said above, the approach is pretty naive. I could have
> > checked whether
> > the device was defined in mdevctl's registry and given a
> > different error
> > message ("try registering this device with mdevctl") in that
> > scenario. But
> > I chose to keep it simple.
> >
> > src/util/virmdev.c | 22 +++++++++++++++++++---
> > 1 file changed, 19 insertions(+), 3 deletions(-)
> >
> > diff --git a/src/util/virmdev.c b/src/util/virmdev.c
> > index 3d5488cdae..7a2f0adedc 100644
> > --- a/src/util/virmdev.c
> > +++ b/src/util/virmdev.c
> > @@ -25,6 +25,7 @@
> > #include "virfile.h"
> > #include "virstring.h"
> > #include "viralloc.h"
> > +#include "vircommand.h"
> >
> > #define VIR_FROM_THIS VIR_FROM_NONE
> >
> > @@ -148,9 +149,24 @@ virMediatedDeviceNew(const char *uuidstr,
> > virMediatedDeviceModelType model)
> > return NULL;
> >
> > if (!virFileExists(sysfspath)) {
> > - virReportError(VIR_ERR_DEVICE_MISSING,
> > - _("mediated device '%s' not found"),
> > uuidstr);
> > - return NULL;
> > + bool activated = false;
> > + /* if the mdev device path doesn't exist, we may still be
> > able to start
> > + * the device using mdevctl
> > + */
> > + char *mdevctl = virFindFileInPath("mdevctl");
> > + if (mdevctl) {
> > + const char *runargs[] = { mdevctl, "start", "-u",
> > uuidstr, NULL };
> > + if (virRun(runargs, NULL) == 0) {
> > + /* check to see if it the device exists now */
> > + activated = virFileExists(sysfspath);
> > + }
> > + }
> > +
> > + if (!activated) {
> > + virReportError(VIR_ERR_DEVICE_MISSING,
> > + _("mediated device '%s' not found"),
> > uuidstr);
> > + return NULL;
> > + }
> > }
> >
> > if (VIR_ALLOC(dev) < 0)
> >
>
>
More information about the libvir-list
mailing list