From nobody Mon Feb 9 18:19:25 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org ARC-Seal: i=1; a=rsa-sha256; t=1607455872; cv=none; d=zohomail.com; s=zohoarc; b=Yraq3Tkxnh3wtZCzIROVkL0Wbmclxf+Us0vl1WbwnuL3NtX4KtLpJMryt6RNAd/GuQ+Y2Zb98Njpr3mtZN+cVoTahEiVwRzePLLBUtEryUIfuvhqYiMDRUIunDMtQsJNz8ygoL7f5ig2vbWM8RNF8fTjrBEBiePXDw/I+bZRSyU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1607455872; h=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; bh=yn6sZWxU4vwNPVA8AP0gTT6bc+30jY0cMASuBOO950E=; b=ZN9x5DMd6qWnLF6tLHMOAZPIGT6DQZ/rKM6H0NEYYYaLiSxlZeCVVbT0aXA+rzGbIHjFcCoemX8jz1wqN0reMgMxpbf1jKXURCuO6TSOnIk6//ZGg5oqPuC2LrQ4Bbw6VCkJPw+st8fsU82HRKKRE3mSODQvbKY0MSy433y43LA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) 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 1607455872783216.93541555281308; Tue, 8 Dec 2020 11:31:12 -0800 (PST) Received: from list by lists.xenproject.org with outflank-mailman.47687.84422 (Exim 4.92) (envelope-from ) id 1kmihC-0000js-RC; Tue, 08 Dec 2020 19:30:46 +0000 Received: by outflank-mailman (output) from mailman id 47687.84422; Tue, 08 Dec 2020 19:30:46 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1kmihC-0000jV-FT; Tue, 08 Dec 2020 19:30:46 +0000 Received: by outflank-mailman (input) for mailman id 47687; Tue, 08 Dec 2020 19:30:45 +0000 Received: from mail.xenproject.org ([104.130.215.37]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1kmihB-0000hS-7X for xen-devel@lists.xenproject.org; Tue, 08 Dec 2020 19:30:45 +0000 Received: from xenbits.xenproject.org ([104.239.192.120]) by mail.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1kmihA-0007LS-CX; Tue, 08 Dec 2020 19:30:44 +0000 Received: from host86-183-162-145.range86-183.btcentralplus.com ([86.183.162.145] helo=desktop.home) by xenbits.xenproject.org with esmtpsa (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1kmihA-0001p0-2c; Tue, 08 Dec 2020 19:30:44 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=xen.org; s=20200302mail; h=Content-Transfer-Encoding:MIME-Version:References: In-Reply-To:Message-Id:Date:Subject:Cc:To:From; bh=yn6sZWxU4vwNPVA8AP0gTT6bc+30jY0cMASuBOO950E=; b=jSHjQYLlHY8No67/nBbY1YL4Pg ygXhvNw18was+IXO269HFAbyYQt93yKwuqwXRsSaGudIOToIptj6/mO0gTqX8coTLsLvSJiehDvdB IoYNzrf5AuLYGiKZi/jdR6Ui5M6kYFeAYo+vZRG+3knTK3Z4ELeOG98QcaBvQW5UBoLA=; From: Paul Durrant To: xen-devel@lists.xenproject.org Cc: Paul Durrant , Oleksandr Andrushchenko , Wei Liu , Ian Jackson , Anthony PERARD Subject: [PATCH v6 04/25] libxl: Make sure devices added by pci-attach are reflected in the config Date: Tue, 8 Dec 2020 19:30:12 +0000 Message-Id: <20201208193033.11306-5-paul@xen.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20201208193033.11306-1-paul@xen.org> References: <20201208193033.11306-1-paul@xen.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @xen.org) Content-Type: text/plain; charset="utf-8" From: Paul Durrant Currently libxl__device_pci_add_xenstore() is broken in that does not update the domain's configuration for the first device added (which causes creation of the overall backend area in xenstore). This can be easily obser= ved by running 'xl list -l' after adding a single device: the device will be missing. This patch fixes the problem and adds a DEBUG log line to allow easy verification that the domain configuration is being modified. Also, the use of libxl__device_generic_add() is dropped as it leads to a confusing situat= ion where only partial backend information is written under the xenstore '/libxl' path. For LIBXL__DEVICE_KIND_PCI devices the only definitive information in xenstore is under '/local/domain/0/backend' (the '0' being hard-coded). NOTE: This patch includes a whitespace in add_pcis_done(). Signed-off-by: Paul Durrant Reviewed-by: Oleksandr Andrushchenko Acked-by: Wei Liu --- Cc: Ian Jackson Cc: Anthony PERARD v3: - Revert some changes form v2 as there is confusion over use of the libxl and backend xenstore paths which needs to be fixed v2: - Avoid having two completely different ways of adding devices into xensto= re --- tools/libs/light/libxl_pci.c | 87 +++++++++++++++++++----------------- 1 file changed, 45 insertions(+), 42 deletions(-) diff --git a/tools/libs/light/libxl_pci.c b/tools/libs/light/libxl_pci.c index d536702ac420..3f85f0d7620e 100644 --- a/tools/libs/light/libxl_pci.c +++ b/tools/libs/light/libxl_pci.c @@ -79,39 +79,55 @@ static void libxl__device_from_pci(libxl__gc *gc, uint3= 2_t domid, device->kind =3D LIBXL__DEVICE_KIND_PCI; } =20 -static int libxl__create_pci_backend(libxl__gc *gc, uint32_t domid, - const libxl_device_pci *pci, - int num) +static void libxl__create_pci_backend(libxl__gc *gc, xs_transaction_t t, + uint32_t domid, const libxl_device_p= ci *pci) { - flexarray_t *front =3D NULL; - flexarray_t *back =3D NULL; - libxl__device device; - int i; + libxl_ctx *ctx =3D libxl__gc_owner(gc); + flexarray_t *front, *back; + char *fe_path, *be_path; + struct xs_permissions fe_perms[2], be_perms[2]; + + LOGD(DEBUG, domid, "Creating pci backend"); =20 front =3D flexarray_make(gc, 16, 1); back =3D flexarray_make(gc, 16, 1); =20 - LOGD(DEBUG, domid, "Creating pci backend"); - - /* add pci device */ - libxl__device_from_pci(gc, domid, pci, &device); + fe_path =3D libxl__domain_device_frontend_path(gc, domid, 0, + LIBXL__DEVICE_KIND_PCI); + be_path =3D libxl__domain_device_backend_path(gc, 0, domid, 0, + LIBXL__DEVICE_KIND_PCI); =20 + flexarray_append_pair(back, "frontend", fe_path); flexarray_append_pair(back, "frontend-id", GCSPRINTF("%d", domid)); - flexarray_append_pair(back, "online", "1"); + flexarray_append_pair(back, "online", GCSPRINTF("%d", 1)); flexarray_append_pair(back, "state", GCSPRINTF("%d", XenbusStateInitia= lising)); flexarray_append_pair(back, "domain", libxl__domid_to_name(gc, domid)); =20 - for (i =3D 0; i < num; i++, pci++) - libxl_create_pci_backend_device(gc, back, i, pci); + be_perms[0].id =3D 0; + be_perms[0].perms =3D XS_PERM_NONE; + be_perms[1].id =3D domid; + be_perms[1].perms =3D XS_PERM_READ; + + xs_rm(ctx->xsh, t, be_path); + xs_mkdir(ctx->xsh, t, be_path); + xs_set_permissions(ctx->xsh, t, be_path, be_perms, + ARRAY_SIZE(be_perms)); + libxl__xs_writev(gc, t, be_path, libxl__xs_kvs_of_flexarray(gc, back)); =20 - flexarray_append_pair(back, "num_devs", GCSPRINTF("%d", num)); + flexarray_append_pair(front, "backend", be_path); flexarray_append_pair(front, "backend-id", GCSPRINTF("%d", 0)); flexarray_append_pair(front, "state", GCSPRINTF("%d", XenbusStateIniti= alising)); =20 - return libxl__device_generic_add(gc, XBT_NULL, &device, - libxl__xs_kvs_of_flexarray(gc, back), - libxl__xs_kvs_of_flexarray(gc, front), - NULL); + fe_perms[0].id =3D domid; + fe_perms[0].perms =3D XS_PERM_NONE; + fe_perms[1].id =3D 0; + fe_perms[1].perms =3D XS_PERM_READ; + + xs_rm(ctx->xsh, t, fe_path); + xs_mkdir(ctx->xsh, t, fe_path); + xs_set_permissions(ctx->xsh, t, fe_path, + fe_perms, ARRAY_SIZE(fe_perms)); + libxl__xs_writev(gc, t, fe_path, libxl__xs_kvs_of_flexarray(gc, front)= ); } =20 static int libxl__device_pci_add_xenstore(libxl__gc *gc, @@ -135,8 +151,6 @@ static int libxl__device_pci_add_xenstore(libxl__gc *gc, be_path =3D libxl__domain_device_backend_path(gc, 0, domid, 0, LIBXL__DEVICE_KIND_PCI); num_devs =3D libxl__xs_read(gc, XBT_NULL, GCSPRINTF("%s/num_devs", be_= path)); - if (!num_devs) - return libxl__create_pci_backend(gc, domid, pci, 1); =20 libxl_domain_type domtype =3D libxl__domain_type(gc, domid); if (domtype =3D=3D LIBXL_DOMAIN_TYPE_INVALID) @@ -150,17 +164,17 @@ static int libxl__device_pci_add_xenstore(libxl__gc *= gc, back =3D flexarray_make(gc, 16, 1); =20 LOGD(DEBUG, domid, "Adding new pci device to xenstore"); - num =3D atoi(num_devs); + num =3D num_devs ? atoi(num_devs) : 0; libxl_create_pci_backend_device(gc, back, num, pci); flexarray_append_pair(back, "num_devs", GCSPRINTF("%d", num + 1)); - if (!starting) + if (num && !starting) flexarray_append_pair(back, "state", GCSPRINTF("%d", XenbusStateRe= configuring)); =20 /* * Stubdomin config is derived from its target domain, it doesn't have * its own file. */ - if (!is_stubdomain) { + if (!is_stubdomain && !starting) { lock =3D libxl__lock_domain_userdata(gc, domid); if (!lock) { rc =3D ERROR_LOCK_FAIL; @@ -170,6 +184,7 @@ static int libxl__device_pci_add_xenstore(libxl__gc *gc, rc =3D libxl__get_domain_configuration(gc, domid, &d_config); if (rc) goto out; =20 + LOGD(DEBUG, domid, "Adding new pci device to config"); device_add_domain_config(gc, &d_config, &libxl__pci_devtype, pci); =20 @@ -186,6 +201,10 @@ static int libxl__device_pci_add_xenstore(libxl__gc *g= c, if (rc) goto out; } =20 + /* This is the first device, so create the backend */ + if (!num_devs) + libxl__create_pci_backend(gc, t, domid, pci); + libxl__xs_writev(gc, t, be_path, libxl__xs_kvs_of_flexarray(gc, ba= ck)); =20 rc =3D libxl__xs_transaction_commit(gc, &t); @@ -1437,7 +1456,7 @@ out_no_irq: } } =20 - if (!starting && !libxl_get_stubdom_id(CTX, domid)) + if (!libxl_get_stubdom_id(CTX, domid)) rc =3D libxl__device_pci_add_xenstore(gc, domid, pci, starting); else rc =3D 0; @@ -1765,28 +1784,12 @@ static void libxl__add_pcis(libxl__egc *egc, libxl_= _ao *ao, uint32_t domid, } =20 static void add_pcis_done(libxl__egc *egc, libxl__multidev *multidev, - int rc) + int rc) { EGC_GC; add_pcis_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; =20 - if (rc) goto out; - - if (d_config->num_pcidevs > 0 && !libxl_get_stubdom_id(CTX, domid)) { - rc =3D libxl__create_pci_backend(gc, domid, d_config->pcidevs, - d_config->num_pcidevs); - if (rc < 0) { - LOGD(ERROR, domid, "libxl_create_pci_backend failed: %d", rc); - goto out; - } - } - -out: aodev->rc =3D rc; aodev->callback(egc, aodev); } --=20 2.20.1