From patchwork Mon Feb 23 17:02:34 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bruce Richardson X-Patchwork-Id: 3635 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 42D3BAE04; Mon, 23 Feb 2015 18:02:44 +0100 (CET) Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by dpdk.org (Postfix) with ESMTP id 688DA9AF9 for ; Mon, 23 Feb 2015 18:02:40 +0100 (CET) Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga102.jf.intel.com with ESMTP; 23 Feb 2015 08:58:22 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.09,631,1418112000"; d="scan'208";a="689524930" Received: from irvmail001.ir.intel.com ([163.33.26.43]) by orsmga002.jf.intel.com with ESMTP; 23 Feb 2015 09:02:37 -0800 Received: from sivswdev01.ir.intel.com (sivswdev01.ir.intel.com [10.237.217.45]) by irvmail001.ir.intel.com (8.14.3/8.13.6/MailSET/Hub) with ESMTP id t1NH2ZWu026914; Mon, 23 Feb 2015 17:02:35 GMT Received: from sivswdev01.ir.intel.com (localhost [127.0.0.1]) by sivswdev01.ir.intel.com with ESMTP id t1NH2Zc3010945; Mon, 23 Feb 2015 17:02:35 GMT Received: (from bricha3@localhost) by sivswdev01.ir.intel.com with id t1NH2Zop010940; Mon, 23 Feb 2015 17:02:35 GMT From: Bruce Richardson To: dev@dpdk.org Date: Mon, 23 Feb 2015 17:02:34 +0000 Message-Id: <1424710955-10896-2-git-send-email-bruce.richardson@intel.com> X-Mailer: git-send-email 1.7.4.1 In-Reply-To: <1424710955-10896-1-git-send-email-bruce.richardson@intel.com> References: <1424703444-30761-1-git-send-email-bruce.richardson@intel.com> <1424710955-10896-1-git-send-email-bruce.richardson@intel.com> Subject: [dpdk-dev] [PATCH v2 1/2] eal: mmap uio resources using resourceX files 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: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Instead of distinguishing the BAR mappings via offset within a single file, originally /dev/uioX, switch to mapping each individual bar via the appropriately numbered resourceX file. Signed-off-by: Bruce Richardson --- lib/librte_eal/common/include/rte_pci.h | 2 +- lib/librte_eal/linuxapp/eal/eal_pci_init.h | 1 + lib/librte_eal/linuxapp/eal/eal_pci_uio.c | 34 ++++++++++++++++-------------- lib/librte_eal/linuxapp/eal/eal_pci_vfio.c | 1 + 4 files changed, 21 insertions(+), 17 deletions(-) diff --git a/lib/librte_eal/common/include/rte_pci.h b/lib/librte_eal/common/include/rte_pci.h index 4301c16..e34b139 100644 --- a/lib/librte_eal/common/include/rte_pci.h +++ b/lib/librte_eal/common/include/rte_pci.h @@ -117,7 +117,7 @@ struct rte_pci_resource { }; /** Maximum number of PCI resources. */ -#define PCI_MAX_RESOURCE 7 +#define PCI_MAX_RESOURCE 6 /** * A structure describing an ID for a PCI driver. Each driver provides a diff --git a/lib/librte_eal/linuxapp/eal/eal_pci_init.h b/lib/librte_eal/linuxapp/eal/eal_pci_init.h index 1070eb8..2125d7b 100644 --- a/lib/librte_eal/linuxapp/eal/eal_pci_init.h +++ b/lib/librte_eal/linuxapp/eal/eal_pci_init.h @@ -38,6 +38,7 @@ struct pci_map { void *addr; + char *path; uint64_t offset; uint64_t size; uint64_t phaddr; diff --git a/lib/librte_eal/linuxapp/eal/eal_pci_uio.c b/lib/librte_eal/linuxapp/eal/eal_pci_uio.c index 2b16fcb..ecf385a 100644 --- a/lib/librte_eal/linuxapp/eal/eal_pci_uio.c +++ b/lib/librte_eal/linuxapp/eal/eal_pci_uio.c @@ -137,10 +137,10 @@ pci_uio_map_secondary(struct rte_pci_device *dev) /* * open devname, to mmap it */ - fd = open(uio_res->path, O_RDWR); + fd = open(uio_res->maps[i].path, O_RDWR); if (fd < 0) { RTE_LOG(ERR, EAL, "Cannot open %s: %s\n", - uio_res->path, strerror(errno)); + uio_res->maps[i].path, strerror(errno)); return -1; } @@ -149,7 +149,8 @@ pci_uio_map_secondary(struct rte_pci_device *dev) (size_t)uio_res->maps[i].size) != uio_res->maps[i].addr) { RTE_LOG(ERR, EAL, - "Cannot mmap device resource\n"); + "Cannot mmap device resource file: %s\n", + uio_res->maps[i].path); close(fd); return -1; } @@ -294,8 +295,6 @@ pci_uio_map_resource(struct rte_pci_device *dev) void *mapaddr; int uio_num; uint64_t phaddr; - uint64_t offset; - uint64_t pagesz; int nb_maps; struct rte_pci_addr *loc = &dev->addr; struct mapped_pci_resource *uio_res; @@ -336,11 +335,6 @@ pci_uio_map_resource(struct rte_pci_device *dev) return -1; } - /* update devname for mmap */ - snprintf(devname, sizeof(devname), - SYSFS_PCI_DEVICES "/" PCI_PRI_FMT "/resource%d", - loc->domain, loc->bus, loc->devid, loc->function, 0); - /* set bus master that is not done by uio_pci_generic */ if (rte_eal_process_type() == RTE_PROC_PRIMARY) { if (pci_uio_set_bus_master(dev->intr_handle.uio_cfg_fd)) { @@ -370,8 +364,6 @@ pci_uio_map_resource(struct rte_pci_device *dev) uio_res->nb_maps = nb_maps; /* Map all BARs */ - pagesz = sysconf(_SC_PAGESIZE); - maps = uio_res->maps; for (i = 0; i != PCI_MAX_RESOURCE; i++) { int fd; @@ -389,10 +381,15 @@ pci_uio_map_resource(struct rte_pci_device *dev) /* if matching map is found, then use it */ if (j != nb_maps) { int fail = 0; - offset = j * pagesz; + + /* update devname for mmap */ + snprintf(devname, sizeof(devname), + SYSFS_PCI_DEVICES "/" PCI_PRI_FMT "/resource%d", + loc->domain, loc->bus, loc->devid, loc->function, + i); /* - * open devname, to mmap it + * open resource file, to mmap it */ fd = open(devname, O_RDWR); if (fd < 0) { @@ -408,7 +405,7 @@ pci_uio_map_resource(struct rte_pci_device *dev) if (pci_map_addr == NULL) pci_map_addr = pci_find_max_end_va(); - mapaddr = pci_map_resource(pci_map_addr, fd, (off_t)offset, + mapaddr = pci_map_resource(pci_map_addr, fd, 0, (size_t)maps[j].size); if (mapaddr == MAP_FAILED) fail = 1; @@ -416,6 +413,10 @@ pci_uio_map_resource(struct rte_pci_device *dev) pci_map_addr = RTE_PTR_ADD(mapaddr, (size_t) maps[j].size); } + maps[j].path = rte_malloc(NULL, strlen(devname) + 1, 0); + if (maps[j].path == NULL) + fail = 1; + if (fail) { rte_free(uio_res); close(fd); @@ -424,7 +425,8 @@ pci_uio_map_resource(struct rte_pci_device *dev) close(fd); maps[j].addr = mapaddr; - maps[j].offset = offset; + maps[j].offset = 0; + strcpy(maps[j].path, devname); dev->mem_resource[i].addr = mapaddr; } } diff --git a/lib/librte_eal/linuxapp/eal/eal_pci_vfio.c b/lib/librte_eal/linuxapp/eal/eal_pci_vfio.c index 20e0977..7a57d0f 100644 --- a/lib/librte_eal/linuxapp/eal/eal_pci_vfio.c +++ b/lib/librte_eal/linuxapp/eal/eal_pci_vfio.c @@ -751,6 +751,7 @@ pci_vfio_map_resource(struct rte_pci_device *dev) maps[i].addr = bar_addr; maps[i].offset = reg.offset; maps[i].size = reg.size; + maps[i].path = NULL; /* vfio doesn't have per-resource paths */ dev->mem_resource[i].addr = bar_addr; }