|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] libxl_qmp: wait for completion of device removal
On Tue, Jul 02, 2019 at 02:42:33PM +0100, Anthony PERARD wrote:
>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.
Sure. Will do. But I prefer to continue device removal to clean up
related status and mapping set up for the device in Xen (VT-d) and
pciback. It at least makes the device available to other domains.
Thanks
Chao
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |