[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v4 03/23] libxl: Make sure devices added by pci-attach are reflected in the config


  • To: Paul Durrant <paul@xxxxxxx>, "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Oleksandr Andrushchenko <Oleksandr_Andrushchenko@xxxxxxxx>
  • Date: Tue, 1 Dec 2020 13:12:22 +0000
  • Accept-language: en-US
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=epam.com; dmarc=pass action=none header.from=epam.com; dkim=pass header.d=epam.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=gX1fZVUF3IThJ1z4CK/d+pqVKfl2H7GE0dwf74Lavwc=; b=NRMOQwGiMZZ8+8wdbHlddLLYPXT7C8n27UVJneyzsuvweuXhGqLKZ3bO534W49IX2hKcoDQ/Ym79IxtCYACtkzEFO6SRROlsWG2465GnESl6IkgcyWAT50lR3djH60sVCxuhDZwcDg7TJx7tQA+1yz9SiKD/ldr0KUE8l3YVh+IHdlRpInoYF4rjjiAETKE8hXAVtAJvaI7eaX/3JE+jUHZ8fk8JHi3G8e4AkJ9HFzh3P3IqUSe55SoQxONQd9QlPgvHCn3hKSB/GfNJ1N1bAD+vsKFfiMF5b6eQafRpP2g3Qozjx3/W53AUd3/dHs/HbmnKfsEGoE95HGzWliQpWw==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=BNYCrEQvf3whzZ/bRJYXijdCBGFzBlaUysXceFNdCefpXBBVyZnxN6F4tPYegoa3ZTekSTszmJ+OCP6xPT/JIGchK/iP5Hsb6ciUf7r4mcyJRdhYpdIMdv2j/pysIcpz1XC7z97NFVZ3oeTfnEo+nZLH1Bwn9tYEoxxXVfD45vAx7AAUXxi2DfPtTZkd8U+RMRq/ZqOVJJIjwhfWy7eZJ68B5G2VdZRo4c81sv8WmcfIEYbK0aJ9WyfkRHqCk3IfQUjFVbjPoaRrN0z3PNHubchHIC35vU+pbI1O+HBJ17vqJblO0a2fm4RyyucXSCDNoBVZCvZ+mSq6km8TIT/JXQ==
  • Authentication-results: xen.org; dkim=none (message not signed) header.d=none;xen.org; dmarc=none action=none header.from=epam.com;
  • Cc: Paul Durrant <pdurrant@xxxxxxxxxx>, Ian Jackson <iwj@xxxxxxxxxxxxxx>, Wei Liu <wl@xxxxxxx>, Anthony PERARD <anthony.perard@xxxxxxxxxx>
  • Delivery-date: Tue, 01 Dec 2020 13:12:37 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
  • Thread-index: AQHWx+OabtYotvRU7E6Ior0bjSGKzA==
  • Thread-topic: [PATCH v4 03/23] libxl: Make sure devices added by pci-attach are reflected in the config

Hi, Paul!

On 11/24/20 10:01 AM, Paul Durrant wrote:
> From: Paul Durrant <pdurrant@xxxxxxxxxx>
>
> 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 observed
> 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 situation
> 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 <pdurrant@xxxxxxxxxx>
> ---
> Cc: Ian Jackson <iwj@xxxxxxxxxxxxxx>
> Cc: Wei Liu <wl@xxxxxxx>
> Cc: Anthony PERARD <anthony.perard@xxxxxxxxxx>
>
> v2:
>   - Avoid having two completely different ways of adding devices into xenstore
>
> v3:
>   - Revert some changes form v2 as there is confusion over use of the libxl
>     and backend xenstore paths which needs to be fixed
> ---
>   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 9d44b28f0a..da01c77ba2 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, 
> uint32_t domid,
>       device->kind = LIBXL__DEVICE_KIND_PCI;
>   }
>   
> -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_pci 
> *pci)
>   {
> -    flexarray_t *front = NULL;
> -    flexarray_t *back = NULL;
> -    libxl__device device;
> -    int i;
> +    libxl_ctx *ctx = 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");
>   
>       front = flexarray_make(gc, 16, 1);
>       back = flexarray_make(gc, 16, 1);
>   
> -    LOGD(DEBUG, domid, "Creating pci backend");
> -
> -    /* add pci device */
> -    libxl__device_from_pci(gc, domid, pci, &device);
> +    fe_path = libxl__domain_device_frontend_path(gc, domid, 0,
> +                                                 LIBXL__DEVICE_KIND_PCI);
> +    be_path = libxl__domain_device_backend_path(gc, 0, domid, 0,
> +                                                LIBXL__DEVICE_KIND_PCI);
>   
> +    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", 
> XenbusStateInitialising));
>       flexarray_append_pair(back, "domain", libxl__domid_to_name(gc, domid));
>   
> -    for (i = 0; i < num; i++, pci++)
> -        libxl_create_pci_backend_device(gc, back, i, pci);
> +    be_perms[0].id = 0;

There was a discussion [1] on PCI on ARM and one of the question was that it is 
possible

that we have the pci backend running in a late hardware domain/driver domain, 
which may

not be Domain-0. Do you think we can avoid using 0 here and get some clue of 
the domain

from "*backend=domain-id"? If not set it will return Domain-0's ID and won't 
break anything*

*Thank you,*

*Oleksandr
*

> +    be_perms[0].perms = XS_PERM_NONE;
> +    be_perms[1].id = domid;
> +    be_perms[1].perms = 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));
>   
> -    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", 
> XenbusStateInitialising));
>   
> -    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 = domid;
> +    fe_perms[0].perms = XS_PERM_NONE;
> +    fe_perms[1].id = 0;
> +    fe_perms[1].perms = 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));
>   }
>   
>   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 = libxl__domain_device_backend_path(gc, 0, domid, 0,
>                                                   LIBXL__DEVICE_KIND_PCI);
>       num_devs = libxl__xs_read(gc, XBT_NULL, GCSPRINTF("%s/num_devs", 
> be_path));
> -    if (!num_devs)
> -        return libxl__create_pci_backend(gc, domid, pci, 1);
>   
>       libxl_domain_type domtype = libxl__domain_type(gc, domid);
>       if (domtype == LIBXL_DOMAIN_TYPE_INVALID)
> @@ -150,17 +164,17 @@ static int libxl__device_pci_add_xenstore(libxl__gc *gc,
>       back = flexarray_make(gc, 16, 1);
>   
>       LOGD(DEBUG, domid, "Adding new pci device to xenstore");
> -    num = atoi(num_devs);
> +    num = 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", 
> XenbusStateReconfiguring));
>   
>       /*
>        * Stubdomin config is derived from its target domain, it doesn't have
>        * its own file.
>        */
> -    if (!is_stubdomain) {
> +    if (!is_stubdomain && !starting) {
>           lock = libxl__lock_domain_userdata(gc, domid);
>           if (!lock) {
>               rc = ERROR_LOCK_FAIL;
> @@ -170,6 +184,7 @@ static int libxl__device_pci_add_xenstore(libxl__gc *gc,
>           rc = libxl__get_domain_configuration(gc, domid, &d_config);
>           if (rc) goto out;
>   
> +        LOGD(DEBUG, domid, "Adding new pci device to config");
>           device_add_domain_config(gc, &d_config, &libxl__pci_devtype,
>                                    pci);
>   
> @@ -186,6 +201,10 @@ static int libxl__device_pci_add_xenstore(libxl__gc *gc,
>               if (rc) goto out;
>           }
>   
> +        /* 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, 
> back));
>   
>           rc = libxl__xs_transaction_commit(gc, &t);
> @@ -1437,7 +1456,7 @@ out_no_irq:
>           }
>       }
>   
> -    if (!starting && !libxl_get_stubdom_id(CTX, domid))
> +    if (!libxl_get_stubdom_id(CTX, domid))
>           rc = libxl__device_pci_add_xenstore(gc, domid, pci, starting);
>       else
>           rc = 0;
> @@ -1765,28 +1784,12 @@ static void libxl__add_pcis(libxl__egc *egc, 
> libxl__ao *ao, uint32_t domid,
>   }
>   
>   static void add_pcis_done(libxl__egc *egc, libxl__multidev *multidev,
> -                             int rc)
> +                          int rc)
>   {
>       EGC_GC;
>       add_pcis_state *apds = CONTAINER_OF(multidev, *apds, multidev);
> -
> -    /* Convenience aliases */
> -    libxl_domain_config *d_config = apds->d_config;
> -    libxl_domid domid = apds->domid;
>       libxl__ao_device *aodev = apds->outer_aodev;
>   
> -    if (rc) goto out;
> -
> -    if (d_config->num_pcis > 0 && !libxl_get_stubdom_id(CTX, domid)) {
> -        rc = libxl__create_pci_backend(gc, domid, d_config->pcis,
> -                                       d_config->num_pcis);
> -        if (rc < 0) {
> -            LOGD(ERROR, domid, "libxl_create_pci_backend failed: %d", rc);
> -            goto out;
> -        }
> -    }
> -
> -out:
>       aodev->rc = rc;
>       aodev->callback(egc, aodev);
>   }
[1] https://lists.xenproject.org/archives/html/xen-devel/2020-10/msg01861.html

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.