eal: add command line option to select vfio interrupt type
Unlike igb_uio, VFIO interrupt type is not set by kernel module parameters but is set up via ioctl() calls at runtime. This warrants a new EAL command-line parameter. It will have no effect if VFIO is not compiled, but will set VFIO interrupt type to either "legacy", "msi" or "msix" if VFIO support is compiled. Note that VFIO initialization will fail if the interrupt type selected is not supported by the system. If the interrupt type parameter wasn't specified, VFIO will try all interrupt types (starting with MSI-X). In unit tests, we don't know if VFIO is compiled (eal_vfio.h header is internal to Linuxapp EAL), so we check this flag regardless. Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com> Tested-by: Waterman Cao <waterman.cao@intel.com> Acked-by: Thomas Monjalon <thomas.monjalon@6wind.com>
This commit is contained in:
parent
5da473e965
commit
317fe51f6e
@ -768,6 +768,22 @@ test_misc_flags(void)
|
||||
const char *argv11[] = {prgname, "--file-prefix=virtaddr",
|
||||
"-c", "1", "-n", "2", "--base-virtaddr=0x12345678"};
|
||||
|
||||
/* try running with --vfio-intr INTx flag */
|
||||
const char *argv12[] = {prgname, "--file-prefix=intr",
|
||||
"-c", "1", "-n", "2", "--vfio-intr=legacy"};
|
||||
|
||||
/* try running with --vfio-intr MSI flag */
|
||||
const char *argv13[] = {prgname, "--file-prefix=intr",
|
||||
"-c", "1", "-n", "2", "--vfio-intr=msi"};
|
||||
|
||||
/* try running with --vfio-intr MSI-X flag */
|
||||
const char *argv14[] = {prgname, "--file-prefix=intr",
|
||||
"-c", "1", "-n", "2", "--vfio-intr=msix"};
|
||||
|
||||
/* try running with --vfio-intr invalid flag */
|
||||
const char *argv15[] = {prgname, "--file-prefix=intr",
|
||||
"-c", "1", "-n", "2", "--vfio-intr=invalid"};
|
||||
|
||||
|
||||
if (launch_proc(argv0) == 0) {
|
||||
printf("Error - process ran ok with invalid flag\n");
|
||||
@ -820,6 +836,26 @@ test_misc_flags(void)
|
||||
printf("Error - process did not run ok with --base-virtaddr parameter\n");
|
||||
return -1;
|
||||
}
|
||||
if (launch_proc(argv12) != 0) {
|
||||
printf("Error - process did not run ok with "
|
||||
"--vfio-intr INTx parameter\n");
|
||||
return -1;
|
||||
}
|
||||
if (launch_proc(argv13) != 0) {
|
||||
printf("Error - process did not run ok with "
|
||||
"--vfio-intr MSI parameter\n");
|
||||
return -1;
|
||||
}
|
||||
if (launch_proc(argv14) != 0) {
|
||||
printf("Error - process did not run ok with "
|
||||
"--vfio-intr MSI-X parameter\n");
|
||||
return -1;
|
||||
}
|
||||
if (launch_proc(argv15) == 0) {
|
||||
printf("Error - process run ok with "
|
||||
"--vfio-intr invalid parameter\n");
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
@ -99,6 +99,7 @@
|
||||
#define OPT_BASE_VIRTADDR "base-virtaddr"
|
||||
#define OPT_XEN_DOM0 "xen-dom0"
|
||||
#define OPT_CREATE_UIO_DEV "create-uio-dev"
|
||||
#define OPT_VFIO_INTR "vfio-intr"
|
||||
|
||||
#define RTE_EAL_BLACKLIST_SIZE 0x100
|
||||
|
||||
@ -360,6 +361,8 @@ eal_usage(const char *prgname)
|
||||
" (ex: --vdev=eth_pcap0,iface=eth2).\n"
|
||||
" --"OPT_VMWARE_TSC_MAP": use VMware TSC map instead of native RDTSC\n"
|
||||
" --"OPT_BASE_VIRTADDR": specify base virtual address\n"
|
||||
" --"OPT_VFIO_INTR": specify desired interrupt mode for VFIO "
|
||||
"(legacy|msi|msix)\n"
|
||||
" --"OPT_CREATE_UIO_DEV": create /dev/uioX (usually done by hotplug)\n"
|
||||
"\nEAL options for DEBUG use only:\n"
|
||||
" --"OPT_NO_HUGE" : use malloc instead of hugetlbfs\n"
|
||||
@ -578,6 +581,28 @@ eal_parse_base_virtaddr(const char *arg)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
eal_parse_vfio_intr(const char *mode)
|
||||
{
|
||||
unsigned i;
|
||||
static struct {
|
||||
const char *name;
|
||||
enum rte_intr_mode value;
|
||||
} map[] = {
|
||||
{ "legacy", RTE_INTR_MODE_LEGACY },
|
||||
{ "msi", RTE_INTR_MODE_MSI },
|
||||
{ "msix", RTE_INTR_MODE_MSIX },
|
||||
};
|
||||
|
||||
for (i = 0; i < RTE_DIM(map); i++) {
|
||||
if (!strcmp(mode, map[i].name)) {
|
||||
internal_config.vfio_intr_mode = map[i].value;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
static inline size_t
|
||||
eal_get_hugepage_mem_size(void)
|
||||
{
|
||||
@ -632,6 +657,7 @@ eal_parse_args(int argc, char **argv)
|
||||
{OPT_PCI_BLACKLIST, 1, 0, 0},
|
||||
{OPT_VDEV, 1, 0, 0},
|
||||
{OPT_SYSLOG, 1, NULL, 0},
|
||||
{OPT_VFIO_INTR, 1, NULL, 0},
|
||||
{OPT_BASE_VIRTADDR, 1, 0, 0},
|
||||
{OPT_XEN_DOM0, 0, 0, 0},
|
||||
{OPT_CREATE_UIO_DEV, 1, NULL, 0},
|
||||
@ -828,6 +854,14 @@ eal_parse_args(int argc, char **argv)
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else if (!strcmp(lgopts[option_index].name, OPT_VFIO_INTR)) {
|
||||
if (eal_parse_vfio_intr(optarg) < 0) {
|
||||
RTE_LOG(ERR, EAL, "invalid parameters for --"
|
||||
OPT_VFIO_INTR "\n");
|
||||
eal_usage(prgname);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else if (!strcmp(lgopts[option_index].name, OPT_CREATE_UIO_DEV)) {
|
||||
internal_config.create_uio_dev = 1;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user