Re: [PATCH v7 7/7] libxl / libxlu: support 'xl pci-attach/detach' by name

2021-01-21 Thread Wei Liu
On Tue, Jan 05, 2021 at 05:46:42PM +, Paul Durrant wrote:
> From: Paul Durrant 
> 
> This patch modifies libxlu_pci_parse_spec_string() to parse the new 'name'
> parameter of PCI_SPEC_STRING detailed in the updated documention in
> xl-pci-configuration(5) and populate the 'name' field of 'libxl_device_pci'.
> 
> If the 'name' field is non-NULL then both libxl_device_pci_add() and
> libxl_device_pci_remove() will use it to look up the device BDF in
> the list of assignable devices.
> 
> Signed-off-by: Paul Durrant 

Acked-by: Wei Liu 



[PATCH v7 7/7] libxl / libxlu: support 'xl pci-attach/detach' by name

2021-01-05 Thread Paul Durrant
From: Paul Durrant 

This patch modifies libxlu_pci_parse_spec_string() to parse the new 'name'
parameter of PCI_SPEC_STRING detailed in the updated documention in
xl-pci-configuration(5) and populate the 'name' field of 'libxl_device_pci'.

If the 'name' field is non-NULL then both libxl_device_pci_add() and
libxl_device_pci_remove() will use it to look up the device BDF in
the list of assignable devices.

Signed-off-by: Paul Durrant 
---
Cc: Wei Liu 
Cc: Ian Jackson 
Cc: Anthony PERARD 

v7:
 - Re-worked (mainly because 'libxl_device_pci' already has a 'name' field)
 - Dropped Wei's A-b because of the re-work

v6:
 - Re-base
 - Slight modification to the patch name
 - Kept Wei's A-b since modifications are small
---
 tools/libs/light/libxl_pci.c | 43 ++-
 tools/libs/util/libxlu_pci.c |  7 ++-
 2 files changed, 44 insertions(+), 6 deletions(-)

diff --git a/tools/libs/light/libxl_pci.c b/tools/libs/light/libxl_pci.c
index 9e3a90dcda..1a1c263080 100644
--- a/tools/libs/light/libxl_pci.c
+++ b/tools/libs/light/libxl_pci.c
@@ -58,6 +58,8 @@ static void libxl_create_pci_backend_device(libxl__gc *gc,
 flexarray_append(back, GCSPRINTF(PCI_BDF, pci->domain, pci->bus, pci->dev, 
pci->func));
 if (pci->vdevfn)
 flexarray_append_pair(back, GCSPRINTF("vdevfn-%d", num), 
GCSPRINTF("%x", pci->vdevfn));
+if (pci->name)
+flexarray_append_pair(back, GCSPRINTF("name-%d", num), GCSPRINTF("%s", 
pci->name));
 flexarray_append(back, GCSPRINTF("opts-%d", num));
 flexarray_append(back,
   
GCSPRINTF("msitranslate=%d,power_mgmt=%d,permissive=%d,rdm_policy=%s",
@@ -282,6 +284,7 @@ retry_transaction2:
 xs_rm(ctx->xsh, t, GCSPRINTF("%s/vdev-%d", be_path, i));
 xs_rm(ctx->xsh, t, GCSPRINTF("%s/opts-%d", be_path, i));
 xs_rm(ctx->xsh, t, GCSPRINTF("%s/vdevfn-%d", be_path, i));
+xs_rm(ctx->xsh, t, GCSPRINTF("%s/name-%d", be_path, i));
 libxl__xs_printf(gc, t, num_devs_path, "%d", num - 1);
 for (j = i + 1; j < num; j++) {
 tmppath = GCSPRINTF("%s/state-%d", be_path, j);
@@ -314,6 +317,12 @@ retry_transaction2:
 xs_write(ctx->xsh, t, GCSPRINTF("%s/vdevfn-%d", be_path, j - 1), 
tmp, strlen(tmp));
 xs_rm(ctx->xsh, t, tmppath);
 }
+tmppath = GCSPRINTF("%s/name-%d", be_path, j);
+tmp = libxl__xs_read(gc, t, tmppath);
+if (tmp) {
+xs_write(ctx->xsh, t, GCSPRINTF("%s/name-%d", be_path, j - 1), 
tmp, strlen(tmp));
+xs_rm(ctx->xsh, t, tmppath);
+}
 }
 if (!xs_transaction_end(ctx->xsh, t, 0))
 if (errno == EAGAIN)
@@ -1589,6 +1598,12 @@ void libxl__device_pci_add(libxl__egc *egc, uint32_t 
domid,
 libxl_device_pci_copy(CTX, >pci, pci);
 pci = >pci;
 
+/* If the device is named then we need to look up the BDF */
+if (pci->name) {
+rc = name2bdf(gc, pci);
+if (rc) goto out;
+}
+
 pas->starting = starting;
 pas->callback = device_pci_add_stubdom_done;
 
@@ -1739,11 +1754,19 @@ static void device_pci_add_done(libxl__egc *egc,
 libxl_device_pci *pci = >pci;
 
 if (rc) {
-LOGD(ERROR, domid,
- "libxl__device_pci_add  failed for "
- "PCI device %x:%x:%x.%x (rc %d)",
- pci->domain, pci->bus, pci->dev, pci->func,
- rc);
+if (pci->name) {
+LOGD(ERROR, domid,
+ "libxl__device_pci_add failed for "
+ "PCI device '%s' (rc %d)",
+ pci->name,
+ rc);
+} else {
+LOGD(ERROR, domid,
+ "libxl__device_pci_add failed for "
+ "PCI device %x:%x:%x.%x (rc %d)",
+ pci->domain, pci->bus, pci->dev, pci->func,
+ rc);
+}
 pci_info_xs_remove(gc, pci, "domid");
 }
 libxl_device_pci_dispose(pci);
@@ -2250,6 +2273,12 @@ static void libxl__device_pci_remove_common(libxl__egc 
*egc,
 libxl_device_pci_copy(CTX, >pci, pci);
 pci = >pci;
 
+/* If the device is named then we need to look up the BDF */
+if (pci->name) {
+rc = name2bdf(gc, pci);
+if (rc) goto out;
+}
+
 prs->force = force;
 libxl__xswait_init(>xswait);
 libxl__ev_qmp_init(>qmp);
@@ -2372,6 +2401,10 @@ static int libxl__device_pci_from_xs_be(libxl__gc *gc,
 if (s)
 pci->vdevfn = strtol(s, (char **) NULL, 16);
 
+s = libxl__xs_read(gc, XBT_NULL, GCSPRINTF("%s/name-%d", be_path, nr));
+if (s)
+pci->name = strdup(s);
+
 s = libxl__xs_read(gc, XBT_NULL, GCSPRINTF("%s/opts-%d", be_path, nr));
 if (s) {
 char *saveptr;
diff --git a/tools/libs/util/libxlu_pci.c b/tools/libs/util/libxlu_pci.c
index 05472a0bd1..ad88fee088 100644
--- a/tools/libs/util/libxlu_pci.c
+++ b/tools/libs/util/libxlu_pci.c
@@ -147,6 +147,7 @@ int xlu_pci_parse_spec_string(XLU_Config *cfg, 
libxl_device_pci *pci,
 {
 const char *ptr = str;