From b4aa981bc0ac607d85d24bf13a86fa675b40b7d5 Mon Sep 17 00:00:00 2001 From: Edwin Zhai Date: Fri, 22 Jun 2018 18:57:31 +0800 Subject: [PATCH] DM: make removing vGSI capability option as local Current option of removing vGSI capability is global, which exposes vIOAPIC link for all ptdev even only one need this. This patch makes it as ptdev local option to lower the system level impact. To keep vGSI for MSI capable ptdev, just explicitly append ",keep_gsi" in option list, like "-s 14,passthru,0/e/0,keep_gsi" Signed-off-by: Edwin Zhai Acked-by: Anthony Xu --- devicemodel/core/main.c | 7 +------ devicemodel/hw/pci/passthrough.c | 29 ++++++++++++++++------------- devicemodel/include/dm.h | 1 - 3 files changed, 17 insertions(+), 20 deletions(-) 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