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 <edwin.zhai@intel.com>
Acked-by: Anthony Xu <anthony.xu@intel.com>
This commit is contained in:
Edwin Zhai 2018-06-22 18:57:31 +08:00 committed by lijinxia
parent dafca1743d
commit b4aa981bc0
3 changed files with 17 additions and 20 deletions

View File

@ -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: <slot,driver,configinfo> 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;

View File

@ -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 */

View File

@ -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