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