diff --git a/devicemodel/core/main.c b/devicemodel/core/main.c index 4dce40669..8c881fe19 100644 --- a/devicemodel/core/main.c +++ b/devicemodel/core/main.c @@ -137,7 +137,6 @@ usage(int code) " -H: vmexit from the guest on hlt\n" " -l: LPC device configuration\n" " -m: memory size in MB\n" - " -M: do not hide INTx link for MSI&INTx capable ptdev\n" " -p: pin 'vcpu' to 'hostcpu'\n" " -P: vmexit from the guest on pause\n" " -s: PCI slot config\n" @@ -619,7 +618,6 @@ static struct option long_options[] = { {"kernel", required_argument, 0, 'k' }, {"ramdisk", required_argument, 0, 'r' }, {"bootargs", required_argument, 0, 'B' }, - {"ptdev_msi", no_argument, 0, 'M' }, {"version", no_argument, 0, 'v' }, {"gvtargs", required_argument, 0, 'G' }, {"help", no_argument, 0, 'h' }, @@ -658,7 +656,7 @@ main(int argc, char *argv[]) if (signal(SIGINT, sig_handler_term) == SIG_ERR) fprintf(stderr, "cannot register handler for SIGINT\n"); - optstr = "abehuwxACHIMPSTWYvk:r:B:p:g:c:s:m:l:U:G:i:"; + optstr = "abehuwxACHIPSTWYvk:r:B:p:g:c:s:m:l:U:G:i:"; while ((c = getopt_long(argc, argv, optstr, long_options, &option_idx)) != -1) { switch (c) { @@ -774,9 +772,6 @@ main(int argc, char *argv[]) exit(1); } break; - case 'M': - ptdev_prefer_msi(false); - break; case 'v': print_version(); break; diff --git a/devicemodel/hw/pci/passthrough.c b/devicemodel/hw/pci/passthrough.c index 27f1c4101..46c612ee2 100644 --- a/devicemodel/hw/pci/passthrough.c +++ b/devicemodel/hw/pci/passthrough.c @@ -85,9 +85,6 @@ static int memfd = -1; static int pciaccess_ref_cnt; static pthread_mutex_t ref_cnt_mtx = PTHREAD_MUTEX_INITIALIZER; -/* Prefer MSI over INTx for ptdev */ -static bool prefer_msi = true; - /* Not check reset capability before assign ptdev. * Set false by default, that is, always check. */ @@ -112,12 +109,6 @@ struct passthru_dev { struct pci_device *phys_dev; }; -void -ptdev_prefer_msi(bool enable) -{ - prefer_msi = enable; -} - void ptdev_no_reset(bool enable) { no_reset = enable; @@ -937,16 +928,28 @@ passthru_init(struct vmctx *ctx, struct pci_vdev *dev, char *opts) struct passthru_dev *ptdev; struct pci_device_iterator *iter; struct pci_device *phys_dev; + char *opt; + bool keep_gsi = false; ptdev = NULL; error = -EINVAL; - if (opts == NULL || - sscanf(opts, "%x/%x/%x", &bus, &slot, &func) != 3) { - warnx("invalid passthru options, %s", opts); + if (opts == NULL) { + warnx("Empty passthru options\n"); return -EINVAL; } + opt = strsep(&opts, ","); + if (sscanf(opt, "%x/%x/%x", &bus, &slot, &func) != 3) { + warnx("Invalid passthru options, %s", opt); + return -EINVAL; + } + + while ((opt = strsep(&opts, ",")) != NULL) { + if (!strncmp(opt, "keep_gsi", 8)) + keep_gsi = true; + } + if (vm_assign_ptdev(ctx, bus, slot, func) != 0) { warnx("PCI device at %x/%x/%x is not using the pt(4) driver", bus, slot, func); @@ -1012,7 +1015,7 @@ passthru_init(struct vmctx *ctx, struct pci_vdev *dev, char *opts) * Forge Guest to use MSI/MSIX in this case to mitigate IRQ sharing * issue */ - if (error == IRQ_MSI && prefer_msi) + if (error == IRQ_MSI && !keep_gsi) return 0; /* Allocates the virq if ptdev only support INTx */ diff --git a/devicemodel/include/dm.h b/devicemodel/include/dm.h index e9ea89959..e0a02035e 100644 --- a/devicemodel/include/dm.h +++ b/devicemodel/include/dm.h @@ -48,6 +48,5 @@ int vmexit_task_switch(struct vmctx *ctx, struct vhm_request *vhm_req, void *paddr_guest2host(struct vmctx *ctx, uintptr_t addr, size_t len); void *dm_gpa2hva(uint64_t gpa, size_t size); int virtio_uses_msix(void); -void ptdev_prefer_msi(bool enable); void ptdev_no_reset(bool enable); #endif