From nobody Mon Feb 9 07:56:34 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org ARC-Seal: i=1; a=rsa-sha256; t=1568914906; cv=none; d=zoho.com; s=zohoarc; b=bxjMc8+62U1DDMlgo2ebARD4+A5bZ6XeGZOeVKIx+j286i7+IkR7wpmNtzu4xRKhCJjExGjIX0AgaEgiPS6RR6EPiFMLKiHLoP0Py+dHMFRx42V+/ejS3lPM3V0tb+rKqLqbAvwqNKbp1eWN3xRirU6skPh4K9zSE/xilX8UEp4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1568914906; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=UxmoMng/dIuKqh4zn3cTDrfVdXVjz10aac0mnHN0WOQ=; b=nGYwjti+SrslWJtFP4BwQ08PmTuldO2nUoDLGjS9ZUKAJgAzR1AUKFRQ5XI3TMEk1rV32iobyROV6dU41s4s0cM+bz4pokLi/czyJzBmFF77I3kf87lCxQ5vJq9h5noKHdmx0zrI2I5Oq0vqJrVVWScg1dI2gFuyqtw2KfWW2KY= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1568914906932288.45526460040037; Thu, 19 Sep 2019 10:41:46 -0700 (PDT) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1iB0Py-000482-8y; Thu, 19 Sep 2019 17:40:34 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1iB0Px-00047x-3v for xen-devel@lists.xenproject.org; Thu, 19 Sep 2019 17:40:33 +0000 Received: from esa1.hc3370-68.iphmx.com (unknown [216.71.145.142]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id 9388799a-db04-11e9-978d-bc764e2007e4; Thu, 19 Sep 2019 17:40:32 +0000 (UTC) X-Inumbo-ID: 9388799a-db04-11e9-978d-bc764e2007e4 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=citrix.com; s=securemail; t=1568914832; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=PP+vnRAblMneTFTS7p0zE7UYiASGasi1qLf8ytAIQG8=; b=IsnMNxu6gZkSyiYIacDEZUV1MS2toQSGiUm3C3KAEqMxF4rQiW8kyJr+ x3GLaFpFo5h84/h5ulN4f35E2YbClBpB2gBtpeo4BvTPUPgZvz4Po3SbR T21L8h5BUL9lkUgHhogCAa6UlGnI5ebESXpULbGKDIi3mbU1XFk12znx6 0=; Authentication-Results: esa1.hc3370-68.iphmx.com; dkim=none (message not signed) header.i=none; spf=None smtp.pra=anthony.perard@citrix.com; spf=Pass smtp.mailfrom=anthony.perard@citrix.com; spf=None smtp.helo=postmaster@mail.citrix.com Received-SPF: none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Received-SPF: None (esa1.hc3370-68.iphmx.com: no sender authenticity information available from domain of anthony.perard@citrix.com) identity=pra; client-ip=162.221.158.21; receiver=esa1.hc3370-68.iphmx.com; envelope-from="anthony.perard@citrix.com"; x-sender="anthony.perard@citrix.com"; x-conformance=sidf_compatible Received-SPF: Pass (esa1.hc3370-68.iphmx.com: domain of anthony.perard@citrix.com designates 162.221.158.21 as permitted sender) identity=mailfrom; client-ip=162.221.158.21; receiver=esa1.hc3370-68.iphmx.com; envelope-from="anthony.perard@citrix.com"; x-sender="anthony.perard@citrix.com"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 ip4:209.167.231.154 ip4:178.63.86.133 ip4:195.66.111.40/30 ip4:85.115.9.32/28 ip4:199.102.83.4 ip4:192.28.146.160 ip4:192.28.146.107 ip4:216.52.6.88 ip4:216.52.6.188 ip4:162.221.158.21 ip4:162.221.156.83 ~all" Received-SPF: None (esa1.hc3370-68.iphmx.com: no sender authenticity information available from domain of postmaster@mail.citrix.com) identity=helo; client-ip=162.221.158.21; receiver=esa1.hc3370-68.iphmx.com; envelope-from="anthony.perard@citrix.com"; x-sender="postmaster@mail.citrix.com"; x-conformance=sidf_compatible IronPort-SDR: ZOBKLhvhg1X1ejU43Q+iisPia62/SSqEEcBuHMne3zQITvXTTdVl4CWEbK7PpiILn3deyeNfTZ J+VQe+9hjkjfnoMLKtmBa6hksDlHvh/aa8M03onz0jNX3QhJh/qPaYB5XIBTLVZnCT6s7aNZQw Ant5jb4KlztQpnMDtYAUo4GT6rF8UNfDJpcIGWmkLzVBDE6jE7ONlDMbmxtHfFbnrgutCmbwsN Zp/D6MCrj/wT0ayhLMEnVSImc5Z/4AAs2iXfSUDiUiTJtY2smJRbS+tXpZE+Ff9ZGdrGM9rEyt uNg= X-SBRS: 2.7 X-MesageID: 5864875 X-Ironport-Server: esa1.hc3370-68.iphmx.com X-Remote-IP: 162.221.158.21 X-Policy: $RELAYED X-IronPort-AV: E=Sophos;i="5.64,524,1559534400"; d="scan'208";a="5864875" From: Anthony PERARD To: Date: Thu, 19 Sep 2019 18:16:47 +0100 Message-ID: <20190919171656.899649-28-anthony.perard@citrix.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20190919171656.899649-1-anthony.perard@citrix.com> References: <20190919171656.899649-1-anthony.perard@citrix.com> MIME-Version: 1.0 Subject: [Xen-devel] [PATCH v2 27/35] libxl_pci: Use libxl__ao_device with libxl__device_pci_add 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 , Ian Jackson , Wei Liu Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Signed-off-by: Anthony PERARD Acked-by: Ian Jackson --- tools/libxl/libxl_internal.h | 7 +- tools/libxl/libxl_pci.c | 170 ++++++++++++++++++++++++++++++----- 2 files changed, 150 insertions(+), 27 deletions(-) diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 571301a5d5d8..18c665d3dbe2 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -198,6 +198,7 @@ typedef struct libxl__json_object libxl__json_object; typedef struct libxl__carefd libxl__carefd; typedef struct libxl__ev_devlock libxl__ev_devlock; typedef struct libxl__dm_resume_state libxl__dm_resume_state; +typedef struct libxl__ao_device libxl__ao_device; =20 typedef struct libxl__domain_create_state libxl__domain_create_state; typedef void libxl__domain_create_cb(struct libxl__egc *egc, @@ -1593,8 +1594,9 @@ _hidden int libxl__pci_topology_init(libxl__gc *gc, =20 /* from libxl_pci */ =20 -_hidden int libxl__device_pci_add(libxl__gc *gc, uint32_t domid, - libxl_device_pci *pcidev, bool starting); +_hidden void libxl__device_pci_add(libxl__egc *egc, uint32_t domid, + libxl_device_pci *pcidev, bool starting, + libxl__ao_device *aodev); _hidden int libxl__device_pci_destroy_all(libxl__gc *gc, uint32_t domid); _hidden bool libxl__is_igd_vga_passthru(libxl__gc *gc, const libxl_domain_config *d_confi= g); @@ -2572,7 +2574,6 @@ _hidden void libxl__kill(libxl__gc *gc, pid_t pid, in= t sig, const char *what); =20 /*----- device addition/removal -----*/ =20 -typedef struct libxl__ao_device libxl__ao_device; typedef struct libxl__multidev libxl__multidev; typedef void libxl__device_callback(libxl__egc*, libxl__ao_device*); =20 diff --git a/tools/libxl/libxl_pci.c b/tools/libxl/libxl_pci.c index 071880b8556b..503db6c26043 100644 --- a/tools/libxl/libxl_pci.c +++ b/tools/libxl/libxl_pci.c @@ -983,9 +983,24 @@ static int qemu_pci_add_xenstore(libxl__gc *gc, uint32= _t domid, return rc; } =20 -static int do_pci_add(libxl__gc *gc, uint32_t domid, - libxl_device_pci *pcidev, bool starting) +typedef struct pci_add_state { + /* filled by user of do_pci_add */ + libxl__ao_device *aodev; + libxl_domid domid; + bool starting; + void (*callback)(libxl__egc *, struct pci_add_state *, int rc); + + /* private to do_pci_add */ + libxl_device_pci *pcidev; + int pci_domid; +} pci_add_state; + +static void do_pci_add(libxl__egc *egc, + libxl_domid domid, + libxl_device_pci *pcidev, + pci_add_state *pas) { + STATE_AO_GC(pas->aodev->ao); libxl_ctx *ctx =3D libxl__gc_owner(gc); libxl_domain_type type =3D libxl__domain_type(gc, domid); char *sysfs_path; @@ -997,6 +1012,13 @@ static int do_pci_add(libxl__gc *gc, uint32_t domid, bool isstubdom =3D libxl_is_stubdom(ctx, domid, &domainid); int r; =20 + /* Convenience aliases */ + bool starting =3D pas->starting; + + /* init pci_add_state */ + pas->pcidev =3D pcidev; + pas->pci_domid =3D domid; + if (type =3D=3D LIBXL_DOMAIN_TYPE_INVALID) { rc =3D ERROR_FAIL; goto out; @@ -1123,7 +1145,7 @@ static int do_pci_add(libxl__gc *gc, uint32_t domid, else rc =3D 0; out: - return rc; + pas->callback(egc, pas, rc); } =20 static int libxl__device_pci_reset(libxl__gc *gc, unsigned int domain, uns= igned int bus, @@ -1177,9 +1199,14 @@ int libxl_device_pci_add(libxl_ctx *ctx, uint32_t do= mid, const libxl_asyncop_how *ao_how) { AO_CREATE(ctx, domid, ao_how); - int rc; - rc =3D libxl__device_pci_add(gc, domid, pcidev, false); - libxl__ao_complete(egc, ao, rc); + libxl__ao_device *aodev; + + GCNEW(aodev); + libxl__prepare_ao_device(ao, aodev); + aodev->action =3D LIBXL__DEVICE_ACTION_ADD; + aodev->callback =3D device_addrm_aocomplete; + aodev->update_json =3D true; + libxl__device_pci_add(egc, domid, pcidev, false, aodev); return AO_INPROGRESS; } =20 @@ -1200,14 +1227,31 @@ static int libxl_pcidev_assignable(libxl_ctx *ctx, = libxl_device_pci *pcidev) return i !=3D num; } =20 -int libxl__device_pci_add(libxl__gc *gc, uint32_t domid, - libxl_device_pci *pcidev, bool starting) +static void device_pci_add_stubdom_done(libxl__egc *egc, + pci_add_state *, int rc); +static void device_pci_add_done(libxl__egc *egc, + pci_add_state *, int rc); + +void libxl__device_pci_add(libxl__egc *egc, uint32_t domid, + libxl_device_pci *pcidev, bool starting, + libxl__ao_device *aodev) { + STATE_AO_GC(aodev->ao); libxl_ctx *ctx =3D libxl__gc_owner(gc); - unsigned int orig_vdev, pfunc_mask; libxl_device_pci *assigned; - int num_assigned, i, rc; + int num_assigned, rc; int stubdomid =3D 0; + pci_add_state *pas; + + /* Store *pcidev to be used by callbacks */ + aodev->device_config =3D pcidev; + aodev->device_type =3D &libxl__pcidev_devtype; + + GCNEW(pas); + pas->aodev =3D aodev; + pas->domid =3D domid; + pas->starting =3D starting; + pas->callback =3D device_pci_add_stubdom_done; =20 if (libxl__domain_type(gc, domid) =3D=3D LIBXL_DOMAIN_TYPE_HVM) { rc =3D xc_test_assign_device(ctx->xch, domid, pcidev_encode_bdf(pc= idev)); @@ -1254,13 +1298,39 @@ int libxl__device_pci_add(libxl__gc *gc, uint32_t d= omid, =20 stubdomid =3D libxl_get_stubdom_id(ctx, domid); if (stubdomid !=3D 0) { - libxl_device_pci pcidev_s =3D *pcidev; + libxl_device_pci *pcidev_s; + + GCNEW(pcidev_s); + libxl_device_pci_init(pcidev_s); + libxl_device_pci_copy(CTX, pcidev_s, pcidev); /* stubdomain is always running by now, even at create time */ - rc =3D do_pci_add(gc, stubdomid, &pcidev_s, false); - if ( rc ) - goto out; + pas->callback =3D device_pci_add_stubdom_done; + do_pci_add(egc, stubdomid, pcidev_s, pas); /* must be last */ + return; } =20 + device_pci_add_stubdom_done(egc, pas, 0); /* must be last */ + return; + +out: + device_pci_add_done(egc, pas, rc); /* must be last */ +} + +static void device_pci_add_stubdom_done(libxl__egc *egc, + pci_add_state *pas, + int rc) +{ + STATE_AO_GC(pas->aodev->ao); + unsigned int orig_vdev, pfunc_mask; + int i; + + /* Convenience aliases */ + libxl__ao_device *aodev =3D pas->aodev; + libxl_domid domid =3D pas->domid; + libxl_device_pci *pcidev =3D aodev->device_config; + + if (rc) goto out; + orig_vdev =3D pcidev->vdevfn & ~7U; =20 if ( pcidev->vfunc_mask =3D=3D LIBXL_PCI_FUNC_ALL ) { @@ -1291,31 +1361,83 @@ int libxl__device_pci_add(libxl__gc *gc, uint32_t d= omid, */ pcidev->vdevfn =3D orig_vdev; } - if ( do_pci_add(gc, domid, pcidev, starting) ) - rc =3D ERROR_FAIL; + pas->callback =3D device_pci_add_done; + do_pci_add(egc, domid, pcidev, pas); /* must be last */ + return; } } =20 out: - return rc; + device_pci_add_done(egc, pas, rc); +} + +static void device_pci_add_done(libxl__egc *egc, + pci_add_state *pas, + int rc) +{ + EGC_GC; + libxl__ao_device *aodev =3D pas->aodev; + libxl_domid domid =3D pas->domid; + libxl_device_pci *pcidev =3D aodev->device_config; + + if (rc) { + LOGD(ERROR, domid, + "libxl__device_pci_add failed for " + "PCI device %x:%x:%x.%x (rc %d)", + pcidev->domain, pcidev->bus, pcidev->dev, pcidev->func, + rc); + } + aodev->rc =3D rc; + aodev->callback(egc, aodev); } =20 +typedef struct { + libxl__multidev multidev; + libxl__ao_device *outer_aodev; + libxl_domain_config *d_config; + libxl_domid domid; +} add_pcidevs_state; + +static void add_pcidevs_done(libxl__egc *, libxl__multidev *, int rc); + static void libxl__add_pcidevs(libxl__egc *egc, libxl__ao *ao, uint32_t do= mid, libxl_domain_config *d_config, libxl__multidev *multidev) { AO_GC; - libxl__ao_device *aodev =3D libxl__multidev_prepare(multidev); - int i, rc =3D 0; + add_pcidevs_state *apds; + int i; + + /* We need to start a new multidev in order to be able to execute + * libxl__create_pci_backend only once. */ + + GCNEW(apds); + apds->outer_aodev =3D libxl__multidev_prepare(multidev); + apds->d_config =3D d_config; + apds->domid =3D domid; + apds->multidev.callback =3D add_pcidevs_done; + libxl__multidev_begin(ao, &apds->multidev); =20 for (i =3D 0; i < d_config->num_pcidevs; i++) { - rc =3D libxl__device_pci_add(gc, domid, &d_config->pcidevs[i], tru= e); - if (rc < 0) { - LOGD(ERROR, domid, "libxl_device_pci_add failed: %d", rc); - goto out; - } + libxl__ao_device *aodev =3D libxl__multidev_prepare(&apds->multide= v); + libxl__device_pci_add(egc, domid, &d_config->pcidevs[i], + true, aodev); } =20 + libxl__multidev_prepared(egc, &apds->multidev, 0); +} + +static void add_pcidevs_done(libxl__egc *egc, libxl__multidev *multidev, + int rc) +{ + EGC_GC; + add_pcidevs_state *apds =3D CONTAINER_OF(multidev, *apds, multidev); + + /* Convenience aliases */ + libxl_domain_config *d_config =3D apds->d_config; + libxl_domid domid =3D apds->domid; + libxl__ao_device *aodev =3D apds->outer_aodev; + if (d_config->num_pcidevs > 0) { rc =3D libxl__create_pci_backend(gc, domid, d_config->pcidevs, d_config->num_pcidevs); --=20 Anthony PERARD _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel