On 6/23/23 15:48, Peter Krempa wrote:
> From: zuoboqun <zuobo...@baidu.com>
> 
> When detaching a device, the following race condition may happen:
> Once qemuDomainSignalDeviceRemoval() marks the device for
> removal, it returns true, which means it is the caller
> that marked the device for removal is going to remove the
> device from domain definition.
> 
> But qemuDomainWaitForDeviceRemoval() may still receive
> timeout from virDomainObjWaitUntil() which is implemented
> by pthread_cond_timedwait() due to an unavoidable race
> between the expiration of the timeout and the predicate
> state(priv->unplug.alias) change.
> 
> And then qemuDomainWaitForDeviceRemoval() will return 0,
> thus the caller will not remove the device from domain
> definition.
> 
> In this situation, the device is still present in the domain
> definition but doesn't exist in qemu anymore. Worse, there is
> no way to remove it from the domain definition.
> 
> Solution is to recheck the value of priv->unplug.alias to
> determine who is going to remove the device from domain
> definition.
> 
> Signed-off-by: zuo boqun <zuobo...@baidu.com>
> Reviewed-by: Peter Krempa <pkre...@redhat.com>
> Signed-off-by: Peter Krempa <pkre...@redhat.com>
> ---
> 
> v2:
>  - rewrote waiting loop so that we always check the unplug status if the
>    thread was notified
>  - added comments explaining the logic
> 
>  src/qemu/qemu_hotplug.c | 20 +++++++++++++-------
>  1 file changed, 13 insertions(+), 7 deletions(-)

Reviewed-by: Michal Privoznik <mpriv...@redhat.com>

Michal

Reply via email to