[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 2/6] xl: Add commands for hiding and unhiding pcie passthrough devices
xl: Add commands for hiding and unhiding pcie passthrough devices Introduce three subcommands: 'xl pci-assignable-hide <s:b:d.f>' to hide a device, 'xl pci-assignable-unhide <s:b:d.f>' to unhide a previously hidden device, and 'xl pci-assignable-list-hidden' to list the hidden devices. Changed create_domain() to register a handler for unrecoverable AER errors. Signed-off-by: Venu Busireddy <venu.busireddy@xxxxxxxxxx> --- tools/xl/xl.h | 3 ++ tools/xl/xl_cmdtable.c | 17 +++++++ tools/xl/xl_pci.c | 125 +++++++++++++++++++++++++++++++++++++++++++++++- tools/xl/xl_vmcontrol.c | 11 +++++ 4 files changed, 154 insertions(+), 2 deletions(-) diff --git a/tools/xl/xl.h b/tools/xl/xl.h index aa95b77..915fe86 100644 --- a/tools/xl/xl.h +++ b/tools/xl/xl.h @@ -121,9 +121,12 @@ 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_hide(int argc, char **argv); +int main_pciassignable_unhide(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_pciassignable_list_hidden(int argc, char **argv); #ifndef LIBXL_HAVE_NO_SUSPEND_RESUME int main_restore(int argc, char **argv); int main_migrate_receive(int argc, char **argv); diff --git a/tools/xl/xl_cmdtable.c b/tools/xl/xl_cmdtable.c index 30eb93c..e23bd15 100644 --- a/tools/xl/xl_cmdtable.c +++ b/tools/xl/xl_cmdtable.c @@ -119,6 +119,23 @@ struct cmd_spec cmd_table[] = { "List all the assignable pci devices", "", }, + { "pci-assignable-list-hidden", + &main_pciassignable_list_hidden, 0, 0, + "List all the pci devices hidden due to AER errors", + "", + }, + { "pci-assignable-hide", + &main_pciassignable_hide, 0, 1, + "Hide a PCI device", + "<BDF>", + "-h Print this help.\n" + }, + { "pci-assignable-unhide", + &main_pciassignable_unhide, 0, 1, + "Unhide a PCI device", + "<BDF>", + "-h Print this help.\n" + }, { "pause", &main_pause, 0, 1, "Pause execution of a domain", diff --git a/tools/xl/xl_pci.c b/tools/xl/xl_pci.c index 58345bd..f48c469 100644 --- a/tools/xl/xl_pci.c +++ b/tools/xl/xl_pci.c @@ -163,8 +163,9 @@ static void pciassignable_list(void) if ( pcidevs == NULL ) return; for (i = 0; i < num; i++) { - printf("%04x:%02x:%02x.%01x\n", - pcidevs[i].domain, pcidevs[i].bus, pcidevs[i].dev, pcidevs[i].func); + if (!libxl_device_pci_assignable_is_hidden(ctx, &pcidevs[i])) + printf("%04x:%02x:%02x.%01x\n", + pcidevs[i].domain, pcidevs[i].bus, pcidevs[i].dev, pcidevs[i].func); libxl_device_pci_dispose(&pcidevs[i]); } free(pcidevs); @@ -182,6 +183,126 @@ int main_pciassignable_list(int argc, char **argv) return 0; } +static void pciassignable_list_hidden(void) +{ + libxl_device_pci *pcidevs; + int num, i; + + pcidevs = libxl_device_pci_assignable_list(ctx, &num); + + if ( pcidevs == NULL ) + return; + for (i = 0; i < num; i++) { + if (libxl_device_pci_assignable_is_hidden(ctx, &pcidevs[i])) + printf("%04x:%02x:%02x.%01x\n", + pcidevs[i].domain, pcidevs[i].bus, pcidevs[i].dev, pcidevs[i].func); + libxl_device_pci_dispose(&pcidevs[i]); + } + free(pcidevs); +} + +int main_pciassignable_list_hidden(int argc, char **argv) +{ + int opt; + + SWITCH_FOREACH_OPT(opt, "", NULL, "pci-assignable-list-hidden", 0) { + /* No options */ + } + + pciassignable_list_hidden(); + return 0; +} + +static int pciassignable_hide(const char *bdf) +{ + libxl_device_pci pcidev; + XLU_Config *config; + int r = EXIT_SUCCESS; + + 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-hide: malformed BDF specification \"%s\"\n", bdf); + exit(2); + } + + if (libxl_device_pci_assignable_hide(ctx, &pcidev)) + r = EXIT_FAILURE; + + libxl_device_pci_dispose(&pcidev); + xlu_cfg_destroy(config); + + return r; +} + +int main_pciassignable_hide(int argc, char **argv) +{ + int opt; + const char *bdf = NULL; + + SWITCH_FOREACH_OPT(opt, "", NULL, "main_pciassignable_hide", 1) { + /* No options */ + } + + bdf = argv[optind]; + + if (pciassignable_hide(bdf)) + return EXIT_FAILURE; + + return EXIT_SUCCESS; +} + +static int pciassignable_unhide(const char *bdf) +{ + libxl_device_pci pcidev; + XLU_Config *config; + int r = EXIT_SUCCESS; + + 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-unhide: malformed BDF specification \"%s\"\n", bdf); + exit(2); + } + + if (libxl_device_pci_assignable_unhide(ctx, &pcidev)) + r = EXIT_FAILURE; + + libxl_device_pci_dispose(&pcidev); + xlu_cfg_destroy(config); + + return r; +} + +int main_pciassignable_unhide(int argc, char **argv) +{ + int opt; + const char *bdf = NULL; + + SWITCH_FOREACH_OPT(opt, "", NULL, "main_pciassignable_unhide", 1) { + /* No options */ + } + + bdf = argv[optind]; + + if (pciassignable_unhide(bdf)) + return EXIT_FAILURE; + + return EXIT_SUCCESS; +} + static int pciassignable_add(const char *bdf, int rebind) { libxl_device_pci pcidev; diff --git a/tools/xl/xl_vmcontrol.c b/tools/xl/xl_vmcontrol.c index 89c2b25..10a48a9 100644 --- a/tools/xl/xl_vmcontrol.c +++ b/tools/xl/xl_vmcontrol.c @@ -966,6 +966,15 @@ start: LOG("Waiting for domain %s (domid %u) to die [pid %ld]", d_config.c_info.name, domid, (long)getpid()); + ret = libxl_reg_aer_events_handler(ctx, domid); + if (ret) { + /* + * This error may not be severe enough to fail the creation of the VM. + * Log the error, and continue with the creation. + */ + LOG("libxl_reg_aer_events_handler() failed, ret = 0x%08x", ret); + } + ret = libxl_evenable_domain_death(ctx, domid, 0, &deathw); if (ret) goto out; @@ -993,6 +1002,7 @@ start: LOG("Domain %u has shut down, reason code %d 0x%x", domid, event->u.domain_shutdown.shutdown_reason, event->u.domain_shutdown.shutdown_reason); + libxl_unreg_aer_events_handler(ctx, domid); switch (handle_domain_death(&domid, event, &d_config)) { case DOMAIN_RESTART_SOFT_RESET: domid_soft_reset = domid; @@ -1059,6 +1069,7 @@ start: case LIBXL_EVENT_TYPE_DOMAIN_DEATH: LOG("Domain %u has been destroyed.", domid); + libxl_unreg_aer_events_handler(ctx, domid); libxl_event_free(ctx, event); ret = 0; goto out; _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |