[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 4 of 4 v3] xl: Add pci_assignable_add and remove commands
pci-assignable-add will always store the driver rebind path, but pci-assignable-remove will only actually rebind if asked to do so. v2: - Use libxl_device_pci_init() instead of memset() - Call xlu_cfg_destroy() properly v3: - Fix typo in failure message - Specify idempotence in manpage - Mark add/remove as commands which modify state Signed-off-by: George Dunlap <george.dunlap@xxxxxxxxxxxxx> diff -r d6739b5dfd9a -r 34a8cded4b39 docs/man/xl.pod.1 --- a/docs/man/xl.pod.1 Tue May 15 15:26:25 2012 +0100 +++ b/docs/man/xl.pod.1 Tue May 15 15:30:32 2012 +0100 @@ -1032,6 +1032,28 @@ 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. +If the device is already bound, it will return success. + +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. If the device is not bound to pciback, it will +return success. + =item B<pci-attach> I<domain-id> I<BDF> Hot-plug a new pass-through pci device to the specified domain. diff -r d6739b5dfd9a -r 34a8cded4b39 tools/libxl/xl.h --- a/tools/libxl/xl.h Tue May 15 15:26:25 2012 +0100 +++ b/tools/libxl/xl.h Tue May 15 15:30:32 2012 +0100 @@ -37,6 +37,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 d6739b5dfd9a -r 34a8cded4b39 tools/libxl/xl_cmdimpl.c --- a/tools/libxl/xl_cmdimpl.c Tue May 15 15:26:25 2012 +0100 +++ b/tools/libxl/xl_cmdimpl.c Tue May 15 15:30:32 2012 +0100 @@ -2371,6 +2371,86 @@ 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; + + libxl_device_pci_init(&pcidev); + + config = xlu_cfg_init(stderr, "command line"); + if (!config) { perror("xlu_cfg_init"); 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); + xlu_cfg_destroy(config); +} + +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; + + libxl_device_pci_init(&pcidev); + + config = xlu_cfg_init(stderr, "command line"); + if (!config) { perror("xlu_cfg_init"); 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); + xlu_cfg_destroy(config); +} + +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 d6739b5dfd9a -r 34a8cded4b39 tools/libxl/xl_cmdtable.c --- a/tools/libxl/xl_cmdtable.c Tue May 15 15:26:25 2012 +0100 +++ b/tools/libxl/xl_cmdtable.c Tue May 15 15:30:32 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, 1, + "Make a device assignable for pci-passthru", + "<BDF>", + "-h Print this help.\n" + }, + { "pci-assignable-remove", + &main_pciassignable_remove, 0, 1, + "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, 0, "List all the assignable pci devices", _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |