From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by dpdk.org (Postfix) with ESMTP id 68540B0CB for ; Wed, 28 May 2014 16:38:57 +0200 (CEST) Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga101.jf.intel.com with ESMTP; 28 May 2014 07:38:34 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.98,928,1392192000"; d="scan'208";a="519068982" Received: from irvmail001.ir.intel.com ([163.33.26.43]) by orsmga001.jf.intel.com with ESMTP; 28 May 2014 07:38:32 -0700 Received: from sivswdev02.ir.intel.com (sivswdev02.ir.intel.com [10.237.217.46]) by irvmail001.ir.intel.com (8.14.3/8.13.6/MailSET/Hub) with ESMTP id s4SEcWgO017318; Wed, 28 May 2014 15:38:32 +0100 Received: from sivswdev02.ir.intel.com (localhost [127.0.0.1]) by sivswdev02.ir.intel.com with ESMTP id s4SEcV7Z008811; Wed, 28 May 2014 15:38:31 +0100 Received: (from aburakov@localhost) by sivswdev02.ir.intel.com with id s4SEcVei008807; Wed, 28 May 2014 15:38:31 +0100 From: Anatoly Burakov To: dev@dpdk.org Date: Wed, 28 May 2014 15:38:12 +0100 Message-Id: <6d55849dd45dc9981d90f57f4435d0e0bc2d67e7.1401287651.git.anatoly.burakov@intel.com> X-Mailer: git-send-email 1.7.0.7 In-Reply-To: <1400514709-24087-1-git-send-email-anatoly.burakov@intel.com> References: <1400514709-24087-1-git-send-email-anatoly.burakov@intel.com> In-Reply-To: References: Subject: [dpdk-dev] [PATCH v3 15/20] eal: added support for selecting VFIO interrupt type from EAL command-line X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 28 May 2014 14:38:59 -0000 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). Signed-off-by: Anatoly Burakov --- lib/librte_eal/linuxapp/eal/eal.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/lib/librte_eal/linuxapp/eal/eal.c b/lib/librte_eal/linuxapp/eal/eal.c index 18a3e04..e87a2e9 100644 --- a/lib/librte_eal/linuxapp/eal/eal.c +++ b/lib/librte_eal/linuxapp/eal/eal.c @@ -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 @@ -361,6 +362,7 @@ eal_usage(const char *prgname) " --"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 (intx|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" @@ -579,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) { @@ -633,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}, @@ -829,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; } -- 1.8.1.4