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

Re: [Xen-devel] [PATCH 4 of 4] xl: Add pci_assignable_add and remove commands



On Wed, 2012-05-09 at 11:28 +0100, George Dunlap wrote:
> pci-assignable-add will always store the driver rebind path, but
> pci-assignable-remove will only actually rebind if asked to do so.
> 
> Signed-off-by: George Dunlap <george.dunlap@xxxxxxxxxxxxx>
> 
> diff -r 17a5b562d1e7 -r a1c357853735 docs/man/xl.pod.1
> --- a/docs/man/xl.pod.1       Wed May 09 11:21:28 2012 +0100
> +++ b/docs/man/xl.pod.1       Wed May 09 11:24:01 2012 +0100
> @@ -1026,6 +1026,26 @@ These are devices in the system which ar
>  available for passthrough and are bound to a suitable PCI
>  backend driver in domain 0 rather than a real driver.
>  
> +=item B<pci-assignable-add> I<BDF>
> +
> +Make the device at PCI Bus/Device/Function BDF assignable to guests.  This
> +will bind the device to the pciback driver.  If it is already bound to a
> +driver, it will first be unbound, and the original driver stored so that it
> +can be re-bound to the same driver later if desired.  
> +
> +CAUTION: This will make the device unusable by Domain 0 until it is
> +returned with pci-assignable-remove.  Care should therefore be taken
> +not to do this on a device critical to domain 0's operation, such as
> +storage controllers, network interfaces, or GPUs that are currently
> +being used.
> +
> +=item B<pci-assignable-remove> [I<-r>] I<BDF>
> +
> +Make the device at PCI Bus/Device/Function BDF assignable to guests.  This
> +will at least unbind the device from pciback.  If the -r option is specified,
> +it will also attempt to re-bind the device to its original driver, making it
> +usable by Domain 0 again.
> +
>  =item B<pci-attach> I<domain-id> I<BDF>
>  
>  Hot-plug a new pass-through pci device to the specified domain.
> diff -r 17a5b562d1e7 -r a1c357853735 tools/libxl/xl.h
> --- a/tools/libxl/xl.h        Wed May 09 11:21:28 2012 +0100
> +++ b/tools/libxl/xl.h        Wed May 09 11:24:01 2012 +0100
> @@ -36,6 +36,8 @@ int main_vncviewer(int argc, char **argv
>  int main_pcilist(int argc, char **argv);
>  int main_pcidetach(int argc, char **argv);
>  int main_pciattach(int argc, char **argv);
> +int main_pciassignable_add(int argc, char **argv);
> +int main_pciassignable_remove(int argc, char **argv);
>  int main_pciassignable_list(int argc, char **argv);
>  int main_restore(int argc, char **argv);
>  int main_migrate_receive(int argc, char **argv);
> diff -r 17a5b562d1e7 -r a1c357853735 tools/libxl/xl_cmdimpl.c
> --- a/tools/libxl/xl_cmdimpl.c        Wed May 09 11:21:28 2012 +0100
> +++ b/tools/libxl/xl_cmdimpl.c        Wed May 09 11:24:01 2012 +0100
> @@ -2368,6 +2368,82 @@ int main_pciassignable_list(int argc, ch
>      return 0;
>  }
>  
> +static void pciassignable_add(const char *bdf, int rebind)
> +{
> +    libxl_device_pci pcidev;
> +    XLU_Config *config;
> +
> +    memset(&pcidev, 0x00, sizeof(pcidev));

libxl_device_pci_init please.

> +
> +    config = xlu_cfg_init(stderr, "command line");
> +    if (!config) { perror("xlu_cfg_inig"); exit(-1); }
> +
> +    if (xlu_pci_parse_bdf(config, &pcidev, bdf)) {
> +        fprintf(stderr, "pci-assignable-add: malformed BDF specification 
> \"%s\"\n", bdf);
> +        exit(2);
> +    }
> +    libxl_device_pci_assignable_add(ctx, &pcidev, rebind);
> +    libxl_device_pci_dispose(&pcidev);
> +}
> +
> +int main_pciassignable_add(int argc, char **argv)
> +{
> +    int opt;
> +    const char *bdf = NULL;
> +
> +    while ((opt = def_getopt(argc, argv, "", "pci-assignable-add", 1)) != 
> -1) {
> +        switch (opt) {
> +        case 0: case 2:
> +            return opt;
> +        }
> +    }
> +
> +    bdf = argv[optind];
> +
> +    pciassignable_add(bdf, 1);
> +    return 0;
> +}
> +
> +static void pciassignable_remove(const char *bdf, int rebind)
> +{
> +    libxl_device_pci pcidev;
> +    XLU_Config *config;
> +
> +    memset(&pcidev, 0x00, sizeof(pcidev));

libxl_device_pci_init also.

You are also missing the xlu_cfg_destroy both here and in the add fn.

(it's a bit annoying that an XLU_COnfig is needed for these simple
helper functions, I suppose it's for logging, but maybe they could log
to stderr if cfg==NULL. Anyway, lets not fix that here)

> +
> +    config = xlu_cfg_init(stderr, "command line");
> +    if (!config) { perror("xlu_cfg_inig"); exit(-1); }
> +
> +    if (xlu_pci_parse_bdf(config, &pcidev, bdf)) {
> +        fprintf(stderr, "pci-assignable-remove: malformed BDF specification 
> \"%s\"\n", bdf);
> +        exit(2);
> +    }
> +    libxl_device_pci_assignable_remove(ctx, &pcidev, rebind);
> +    libxl_device_pci_dispose(&pcidev);
> +}
> +
> +int main_pciassignable_remove(int argc, char **argv)
> +{
> +    int opt;
> +    const char *bdf = NULL;
> +    int rebind = 0;
> +
> +    while ((opt = def_getopt(argc, argv, "r", "pci-assignable-remove", 1)) 
> != -1) {
> +        switch (opt) {
> +        case 0: case 2:
> +            return opt;
> +        case 'r':
> +            rebind=1;
> +            break;
> +        }
> +    }
> +
> +    bdf = argv[optind];
> +
> +    pciassignable_remove(bdf, rebind);
> +    return 0;
> +}
> +
>  static void pause_domain(const char *p)
>  {
>      find_domain(p);
> diff -r 17a5b562d1e7 -r a1c357853735 tools/libxl/xl_cmdtable.c
> --- a/tools/libxl/xl_cmdtable.c       Wed May 09 11:21:28 2012 +0100
> +++ b/tools/libxl/xl_cmdtable.c       Wed May 09 11:24:01 2012 +0100
> @@ -86,6 +86,20 @@ struct cmd_spec cmd_table[] = {
>        "List pass-through pci devices for a domain",
>        "<Domain>",
>      },
> +    { "pci-assignable-add",
> +      &main_pciassignable_add, 0,
> +      "Make a device assignable for pci-passthru",
> +      "<BDF>",
> +      "-h                      Print this help.\n"
> +    },
> +    { "pci-assignable-remove",
> +      &main_pciassignable_remove, 0,
> +      "Remove a device from being assignable",
> +      "[options] <BDF>",
> +      "-h                      Print this help.\n"
> +      "-r                      Attempt to re-assign the device to the\n"
> +      "                        original driver"
> +    },
>      { "pci-assignable-list",
>        &main_pciassignable_list, 0,
>        "List all the assignable pci devices",
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxx
> http://lists.xen.org/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

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