On Thu, Jan 07, 2021 at 09:32:43PM +0100, Ján Tomko wrote:
On a Thursday in 2021, Erik Skultety wrote:
> The lookup didn't do anything apart from comparing the sysfs paths
> anyway since that's what makes each mdev unique.
> The most ridiculous usage of the old logic was in
> virHostdevReAttachMediatedDevices where in order to drop an mdev
> hostdev from the list of active devices we first had to create a new
> mdev and use it in the lookup call. Why couldn't we have used the
> hostdev directly? Because the hostdev and mdev structures are
> incompatible.
>
> The way mdevs are currently removed is via a write to a specific sysfs
> attribute. If you do it while the machine which has the mdev assigned
> is running, the write call may block (this should return a write error
> instead and it is likely a bug in the vendor driver) until the device
I'll reword ^this bit slightly as it turned out that this behavior conforms
to the kernel device model (which it previously didn't) and a device
"remove"
apparently cannot return an error (I have this via a conversation on a private
list, so I can't link it as a source of truth).
> is no longer bound to vfio which is when the QEMU process
exits.
>
> The interesting part here comes afterwards when we're cleaning up and
> call virHostdevReAttachMediatedDevices. The domain doesn't exist
> anymore, so the list of active hostdevs needs to be updated and the
> respective hostdevs removed from the list, but remember we had to
> create an mdev object in the memory in order to find it in the list
> first which will fail because the write to sysfs had already removed
> the mdev instance from the host system.
> And so the next time you try to start the same domain you'll get:
>
> "Requested operation is not valid: mediated device <path> is in use by
> driver QEMU, domain <name>"
>
Is there a public bug/issue you could link here?
I just created one (gitlab issue) for bookkeeping and I'll link it here.
> Signed-off-by: Erik Skultety <eskultet(a)redhat.com>
> ---
> src/hypervisor/virhostdev.c | 10 ++++------
> src/util/virmdev.c | 16 ++++++++--------
> src/util/virmdev.h | 4 ++--
> 3 files changed, 14 insertions(+), 16 deletions(-)
>
> diff --git a/src/hypervisor/virhostdev.c b/src/hypervisor/virhostdev.c
> index aa3fc8738f..ea04382d0d 100644
> --- a/src/hypervisor/virhostdev.c
> +++ b/src/hypervisor/virhostdev.c
> @@ -1975,7 +1975,7 @@ virHostdevReAttachMediatedDevices(virHostdevManagerPtr mgr,
>
> virObjectLock(mgr->activeMediatedHostdevs);
> for (i = 0; i < nhostdevs; i++) {
> - g_autoptr(virMediatedDevice) mdev = NULL;
> + g_autofree char * sysfspath = NULL;
extra space
> virMediatedDevicePtr tmp;
> virDomainHostdevSubsysMediatedDevPtr mdevsrc;
> virDomainHostdevDefPtr hostdev = hostdevs[i];
Reviewed-by: Ján Tomko <jtomko(a)redhat.com>
Thanks.
Erik