|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] libxl_qmp: wait for completion of device removal
Hi,
Thanks for the patch. I've got some comments.
On Tue, Jul 02, 2019 at 03:46:40PM +0800, Chao Gao wrote:
> To remove a device from a domain, a qmp command is sent to qemu. But it is
> handled by qemu asychronously. Even the qmp command is claimed to be done,
> the actual handling in qemu side may happen later.
> This behavior brings two questions:
> 1. Attaching a device back to a domain right after detaching the device from
> that domain would fail with error:
>
> libxl: error: libxl_qmp.c:341:qmp_handle_error_response: Domain 1:received an
> error message from QMP server: Duplicate ID 'pci-pt-60_00.0' for device
>
> 2. Accesses to PCI configuration space in Qemu may overlap with later device
> reset issued by 'xl' or by pciback.
>
> In order to avoid mentioned questions, wait for the completion of device
> removal by querying all pci devices using qmp command and ensuring the target
> device isn't listed. Only retry 5 times to avoid 'xl' potentially being
> blocked
> by qemu.
>
> Signed-off-by: Chao Gao <chao.gao@xxxxxxxxx>
> ---
> tools/libxl/libxl_qmp.c | 57
> ++++++++++++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 56 insertions(+), 1 deletion(-)
>
> diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c
> index 42c8ab8..18f6126 100644
> --- a/tools/libxl/libxl_qmp.c
> +++ b/tools/libxl/libxl_qmp.c
> @@ -1000,9 +1032,32 @@ int libxl__qmp_pci_add(libxl__gc *gc, int domid,
> libxl_device_pci *pcidev)
> static int qmp_device_del(libxl__gc *gc, int domid, char *id)
> {
> libxl__json_object *args = NULL;
> + libxl__qmp_handler *qmp = NULL;
> + int rc = 0;
> +
> + qmp = libxl__qmp_initialize(gc, domid);
> + if (!qmp)
> + return ERROR_FAIL;
>
> qmp_parameters_add_string(gc, &args, "id", id);
> - return qmp_run_command(gc, domid, "device_del", args, NULL, NULL);
> + rc = qmp_synchronous_send(qmp, "device_del", args,
> + NULL, NULL, qmp->timeout);
> + if (rc == 0) {
> + unsigned int retry = 0;
> +
> + do {
> + if (qmp_synchronous_send(qmp, "query-pci", NULL,
> + pci_del_callback, id, qmp->timeout) ==
> 0) {
Could you assign the return value of qmp_synchronous_send into a
variable, then check for success/error?
qmp_synchronous_send returns several possible values:
- errors, when rc < 0
- rc of the callback, which is 0 or 1 here.
If there's an error, we don't want to keep trying we probably want to
return that error.
Thanks.
> + break;
> + }
> + LOGD(DEBUG, qmp->domid,
> + "Waiting for completion of deleting device %s", id);
> + sleep(1);
> + } while (retry++ < 5);
> + }
--
Anthony PERARD
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |