From patchwork Thu Nov 21 18:13:00 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oleksandr Grytsov X-Patchwork-Id: 11256729 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id CE35C14DB for ; Thu, 21 Nov 2019 18:14:23 +0000 (UTC) Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id A60082068E for ; Thu, 21 Nov 2019 18:14:23 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="RXzx9/Q1" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org A60082068E Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1iXqxP-0003ik-2m; Thu, 21 Nov 2019 18:13:31 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1iXqxO-0003iR-FV for xen-devel@lists.xenproject.org; Thu, 21 Nov 2019 18:13:30 +0000 X-Inumbo-ID: 97bea9d2-0c8a-11ea-b678-bc764e2007e4 Received: from mail-lj1-x244.google.com (unknown [2a00:1450:4864:20::244]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id 97bea9d2-0c8a-11ea-b678-bc764e2007e4; Thu, 21 Nov 2019 18:13:18 +0000 (UTC) Received: by mail-lj1-x244.google.com with SMTP id n21so4259191ljg.12 for ; Thu, 21 Nov 2019 10:13:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=PCT5CX2D/qI3pj3Q/bbzvWBes5x8xliwvVl0q/Ba/Tg=; b=RXzx9/Q10nU8klt3oKsRUxLIG5R5KarKEtAKJMNb1twNbA9W+mXzGpgh8IZCGAFkGh aQ3H4tOrNHBdlmo6/4L3UauiKdNmN7YkLxRGM2Rv4JKB5hiWaOlInFOFGlrgW68utS8q jQNavALO3meB2btwVFBzIQqUEcfEmKORhT7hDTMpBI433RgK1xoxNEw0WJtPbB/JlsnK x5HSQpfTu89ffLLVF8Tdve54QDEXeuAiTVz9d/2fyENHTn1zC1OgIGjnDjnV5bJjJ2gS C6RxwsE3wTY09VIlcQ7OZzl/kserPoApUvNq6alu0s3ozJbB4E+CM6DteqcNTekNwWq2 LZwA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=PCT5CX2D/qI3pj3Q/bbzvWBes5x8xliwvVl0q/Ba/Tg=; b=MAD2xkyTcixpqSXcsZgy+wHrGwuKRaEfei+n85Zvmx/CKcXFh5nU+FDlr/qZK57xjf KXDfnlX+K03glHroBiRr8UuQygLW6JjG6XQkjM6XwG6gVq2wbYY18Tgxh97kwUyNgLjd ZlFVKKaElPwkdvTVQG4iL2bvQ6txeHBHi0zoQJdqs+tKxpaw+qn7i4fbKymZH/xHYya7 BY7acol5ZP4ypNOB8jZ2THTsf162tTOTzh6yWwetlsOmXvJo0+02bEtVv6+tzZsU1HUA z9tnLTwvLVeBMfpdMNziZi0hQia3xitQqVhHSGcz+9Ogaxwnsff44me0I75Kap+J2s+W hHHw== X-Gm-Message-State: APjAAAXlK1dDqsVo+7TIGQ2aHbW1Ou69HKNNOyrMB7E6lvdQnXW4MFl/ 64Qv300qwChGtw4zejGm8+6WHP1U3E8ULg== X-Google-Smtp-Source: APXvYqz2pPFC0s4d1oCnWRNXJO76vmvLqFx5iHpyrJWTCfOg8+z3RY0bGTqAcZLO58g8uRLZCQPKhg== X-Received: by 2002:a2e:97d3:: with SMTP id m19mr8804136ljj.56.1574359997197; Thu, 21 Nov 2019 10:13:17 -0800 (PST) Received: from al1-pc.kyiv.epam.com (ll-74.141.223.85.sovam.net.ua. [85.223.141.74]) by smtp.gmail.com with ESMTPSA id v12sm1855473lfb.47.2019.11.21.10.13.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 21 Nov 2019 10:13:16 -0800 (PST) From: Oleksandr Grytsov To: xen-devel@lists.xenproject.org Date: Thu, 21 Nov 2019 20:13:00 +0200 Message-Id: <20191121181300.6497-4-al1img@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20191121181300.6497-1-al1img@gmail.com> References: <20191121181300.6497-1-al1img@gmail.com> Subject: [Xen-devel] [PATCH v2 3/3] libxl: make default path to add/remove all PV devices X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: anthony.perard@citrix.com, Oleksandr Grytsov , ian.jackson@eu.citrix.com, wl@xen.org MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" From: Oleksandr Grytsov Adding/removing device is handled for specific devices only: VBD, VIF, QDISK. This commit adds default case to handle adding/removing for all PV devices by default, except QDISK device, which requires special handling. If any other device is required a special handling it should be done by implementing separate case (similar to QDISK device). The default behaviour for adding device is to wait when the backend goes to XenbusStateInitWait and the default behaviour on removing device is to start generic device remove procedure. Also this commit fixes removing guest function: before the guest was removed when all VIF and VBD devices are removed. The fix removes guest when all created devices are removed. This is done by checking the guest device list instead of checking num_vifs and num_vbds. num_vifs and num_vbds variables are removed as redundant in this case. Signed-off-by: Oleksandr Grytsov Acked-by: Ian Jackson Acked-by: Wei Liu --- tools/libxl/libxl_device.c | 63 +++++++++++++++----------------------- 1 file changed, 24 insertions(+), 39 deletions(-) diff --git a/tools/libxl/libxl_device.c b/tools/libxl/libxl_device.c index 1402b61a81..9d05d2fd13 100644 --- a/tools/libxl/libxl_device.c +++ b/tools/libxl/libxl_device.c @@ -1477,7 +1477,7 @@ typedef struct libxl__ddomain_device { */ typedef struct libxl__ddomain_guest { uint32_t domid; - int num_vifs, num_vbds, num_qdisks; + int num_qdisks; LIBXL_SLIST_HEAD(, struct libxl__ddomain_device) devices; LIBXL_SLIST_ENTRY(struct libxl__ddomain_guest) next; } libxl__ddomain_guest; @@ -1530,8 +1530,7 @@ static void check_and_maybe_remove_guest(libxl__gc *gc, { assert(ddomain); - if (dguest != NULL && - dguest->num_vifs + dguest->num_vbds + dguest->num_qdisks == 0) { + if (dguest != NULL && LIBXL_SLIST_FIRST(&dguest->devices) == NULL) { LIBXL_SLIST_REMOVE(&ddomain->guests, dguest, libxl__ddomain_guest, next); LOGD(DEBUG, dguest->domid, "Removed domain from the list of active guests"); @@ -1571,24 +1570,6 @@ static int add_device(libxl__egc *egc, libxl__ao *ao, libxl__device_backend_path(gc, dev)); switch(dev->backend_kind) { - case LIBXL__DEVICE_KIND_VBD: - case LIBXL__DEVICE_KIND_VIF: - if (dev->backend_kind == LIBXL__DEVICE_KIND_VBD) dguest->num_vbds++; - if (dev->backend_kind == LIBXL__DEVICE_KIND_VIF) dguest->num_vifs++; - - GCNEW(aodev); - libxl__prepare_ao_device(ao, aodev); - /* - * Clone the libxl__device to avoid races if remove_device is called - * before the device addition has finished. - */ - GCNEW(aodev->dev); - *aodev->dev = *dev; - aodev->action = LIBXL__DEVICE_ACTION_ADD; - aodev->callback = device_complete; - libxl__wait_device_connection(egc, aodev); - - break; case LIBXL__DEVICE_KIND_QDISK: if (dguest->num_qdisks == 0) { GCNEW(dmss); @@ -1599,10 +1580,19 @@ static int add_device(libxl__egc *egc, libxl__ao *ao, libxl__spawn_qdisk_backend(egc, dmss); } dguest->num_qdisks++; - break; default: - rc = 1; + GCNEW(aodev); + libxl__prepare_ao_device(ao, aodev); + /* + * Clone the libxl__device to avoid races if remove_device is called + * before the device addition has finished. + */ + GCNEW(aodev->dev); + *aodev->dev = *dev; + aodev->action = LIBXL__DEVICE_ACTION_ADD; + aodev->callback = device_complete; + libxl__wait_device_connection(egc, aodev); break; } @@ -1619,11 +1609,17 @@ static int remove_device(libxl__egc *egc, libxl__ao *ao, int rc = 0; switch(ddev->dev->backend_kind) { - case LIBXL__DEVICE_KIND_VBD: - case LIBXL__DEVICE_KIND_VIF: - if (dev->backend_kind == LIBXL__DEVICE_KIND_VBD) dguest->num_vbds--; - if (dev->backend_kind == LIBXL__DEVICE_KIND_VIF) dguest->num_vifs--; - + case LIBXL__DEVICE_KIND_QDISK: + if (--dguest->num_qdisks == 0) { + rc = libxl__destroy_qdisk_backend(gc, dev->domid); + if (rc) + goto out; + } + libxl__device_destroy(gc, dev); + /* Return > 0, no ao has been dispatched */ + rc = 1; + break; + default: GCNEW(aodev); libxl__prepare_ao_device(ao, aodev); /* @@ -1636,17 +1632,6 @@ static int remove_device(libxl__egc *egc, libxl__ao *ao, aodev->callback = device_complete; libxl__initiate_device_generic_remove(egc, aodev); break; - case LIBXL__DEVICE_KIND_QDISK: - if (--dguest->num_qdisks == 0) { - rc = libxl__destroy_qdisk_backend(gc, dev->domid); - if (rc) - goto out; - } - libxl__device_destroy(gc, dev); - /* Fall through to return > 0, no ao has been dispatched */ - default: - rc = 1; - break; } /*