[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
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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |