From patchwork Thu Mar 12 10:17:46 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tetsuya Mukawa X-Patchwork-Id: 3983 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 3CB649AB4; Thu, 12 Mar 2015 11:18:35 +0100 (CET) Received: from mail-pd0-f175.google.com (mail-pd0-f175.google.com [209.85.192.175]) by dpdk.org (Postfix) with ESMTP id 975BA594E for ; Thu, 12 Mar 2015 11:18:31 +0100 (CET) Received: by pdjy10 with SMTP id y10so18974135pdj.8 for ; Thu, 12 Mar 2015 03:18:30 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=qb2NOU6FkYj9AqC9cjchDMOJ+cvAmee2CkyrKVpTpBY=; b=PR0BFCD6fdUEqa66DjYOAiZSpP1dxK9ytE+0tIddTFsSsitcdcwjcpIl7mLabtQubu LII8GeYD4LDyaCzFLeCsge6h/j+8soSYh6RCahjBop3+GgcmBlFyQ1DS7IdZ4XvTv7Xz /tKpv6PgWBL1XrSKBOXZixL3WUkqBnPd3SX/t9Pd8f0z3TgGhqvPc2dsdbCDXlXPGwS3 nb1acbbrgGtoR7z1O/d1V1fDGjX2EtDbFV9onCShsnxdSHnxxo7mAaeIhFWNW1u5Kr1s 3FbTaZVz0B8Mhy2tvlfnes59J2NltjfuvoMK/m43c26Sm7VkaffaOdMbNynxeA6Et8+q PZug== X-Gm-Message-State: ALoCoQlYVhSh4RVJIzeTcPfoeHeZrXu3fjJoKGHHgraUU7jqD1Fy3ZuoHcgyrOLxOgXL3n+HXNUY X-Received: by 10.70.90.110 with SMTP id bv14mr82190508pdb.8.1426155510869; Thu, 12 Mar 2015 03:18:30 -0700 (PDT) Received: from localhost.localdomain (napt.igel.co.jp. [219.106.231.132]) by mx.google.com with ESMTPSA id z4sm10080331pdi.90.2015.03.12.03.18.29 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 12 Mar 2015 03:18:30 -0700 (PDT) From: Tetsuya Mukawa To: dev@dpdk.org Date: Thu, 12 Mar 2015 19:17:46 +0900 Message-Id: <1426155474-1596-8-git-send-email-mukawa@igel.co.jp> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1426155474-1596-1-git-send-email-mukawa@igel.co.jp> References: <1425438703-18895-1-git-send-email-mukawa@igel.co.jp> <1426155474-1596-1-git-send-email-mukawa@igel.co.jp> Subject: [dpdk-dev] [PATCH v2 07/15] eal: Fix interface of pci_map_resource() of bsdapp 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" The function is implemented in both linuxapp and bsdapp, but interface is different. The patch fixes the function of bsdapp to do same as linuxapp. After applying it, file descriptor should be opened and closed out of pci_map_resource(). Signed-off-by: Tetsuya Mukawa --- lib/librte_eal/bsdapp/eal/eal_pci.c | 117 +++++++++++++++++++----------- lib/librte_eal/linuxapp/eal/eal_pci_uio.c | 5 +- 2 files changed, 78 insertions(+), 44 deletions(-) diff --git a/lib/librte_eal/bsdapp/eal/eal_pci.c b/lib/librte_eal/bsdapp/eal/eal_pci.c index bd0f8cd..c92c624 100644 --- a/lib/librte_eal/bsdapp/eal/eal_pci.c +++ b/lib/librte_eal/bsdapp/eal/eal_pci.c @@ -100,7 +100,7 @@ struct mapped_pci_resource { struct rte_pci_addr pci_addr; char path[PATH_MAX]; - size_t nb_maps; + int nb_maps; struct pci_map maps[PCI_MAX_RESOURCE]; }; @@ -122,48 +122,31 @@ pci_unbind_kernel_driver(struct rte_pci_device *dev __rte_unused) /* map a particular resource from a file */ static void * -pci_map_resource(void *requested_addr, const char *devname, off_t offset, - size_t size) +pci_map_resource(void *requested_addr, int fd, off_t offset, size_t size, + int additional_flags) { - int fd; void *mapaddr; - /* - * open devname, to mmap it - */ - fd = open(devname, O_RDWR); - if (fd < 0) { - RTE_LOG(ERR, EAL, "Cannot open %s: %s\n", - devname, strerror(errno)); - goto fail; - } - /* Map the PCI memory resource of device */ mapaddr = mmap(requested_addr, size, PROT_READ | PROT_WRITE, - MAP_SHARED, fd, offset); - close(fd); - if (mapaddr == MAP_FAILED || - (requested_addr != NULL && mapaddr != requested_addr)) { + MAP_SHARED | additional_flags, fd, offset); + if (mapaddr == MAP_FAILED) { RTE_LOG(ERR, EAL, - "%s(): cannot mmap(%s(%d), %p, 0x%lx, 0x%lx):" - " %s (%p)\n", __func__, devname, fd, requested_addr, + "%s(): cannot mmap(%d, %p, 0x%lx, 0x%lx): %s (%p)\n", + __func__, fd, requested_addr, (unsigned long)size, (unsigned long)offset, strerror(errno), mapaddr); - goto fail; + } else { + RTE_LOG(DEBUG, EAL, " PCI memory mapped at %p\n", mapaddr); } - RTE_LOG(DEBUG, EAL, " PCI memory mapped at %p\n", mapaddr); - return mapaddr; - -fail: - return NULL; } static int pci_uio_map_secondary(struct rte_pci_device *dev) { - size_t i; + int i, fd; struct mapped_pci_resource *uio_res; struct mapped_pci_res_list *uio_res_list = RTE_TAILQ_CAST(rte_uio_tailq.head, mapped_pci_res_list); @@ -171,19 +154,42 @@ pci_uio_map_secondary(struct rte_pci_device *dev) TAILQ_FOREACH(uio_res, uio_res_list, next) { /* skip this element if it doesn't match our PCI address */ - if (memcmp(&uio_res->pci_addr, &dev->addr, sizeof(dev->addr))) + if (rte_eal_compare_pci_addr(&uio_res->pci_addr, &dev->addr)) continue; for (i = 0; i != uio_res->nb_maps; i++) { - if (pci_map_resource(uio_res->maps[i].addr, - uio_res->path, - (off_t)uio_res->maps[i].offset, - (size_t)uio_res->maps[i].size) - != uio_res->maps[i].addr) { - RTE_LOG(ERR, EAL, - "Cannot mmap device resource\n"); + /* + * open devname, to mmap it + */ + fd = open(uio_res->maps[i].path, O_RDWR); + if (fd < 0) { + RTE_LOG(ERR, EAL, "Cannot open %s: %s\n", + uio_res->maps[i].path, strerror(errno)); + return -1; + } + + void *mapaddr = pci_map_resource(uio_res->maps[i].addr, + fd, (off_t)uio_res->maps[i].offset, + (size_t)uio_res->maps[i].size, 0); + if (mapaddr != uio_res->maps[i].addr) { + if (mapaddr == MAP_FAILED) + RTE_LOG(ERR, EAL, + "Cannot mmap device resource " + "file %s: %s\n", + uio_res->maps[i].path, + strerror(errno)); + else + RTE_LOG(ERR, EAL, + "Cannot mmap device resource " + "file %s to address: %p\n", + uio_res->maps[i].path, + uio_res->maps[i].addr); + + close(fd); return -1; } + /* fd is not needed in slave process, close it */ + close(fd); } return 0; } @@ -251,25 +257,44 @@ pci_uio_map_resource(struct rte_pci_device *dev) maps = uio_res->maps; for (i = 0, map_idx = 0; i != PCI_MAX_RESOURCE; i++) { + int fd; /* skip empty BAR */ phaddr = dev->mem_resource[i].phys_addr; if (phaddr == 0) continue; + /* allocate memory to keep path */ + maps[map_idx].path = rte_malloc(NULL, strlen(devname) + 1, 0); + if (maps[map_idx].path == NULL) { + RTE_LOG(ERR, EAL, "Cannot allocate memory for " + "path: %s\n", strerror(errno)); + goto fail0; + } + + /* + * open resource file, to mmap it + */ + fd = open(devname, O_RDWR); + if (fd < 0) { + RTE_LOG(ERR, EAL, "Cannot open %s: %s\n", + devname, strerror(errno)); + goto fail0; + } + /* if matching map is found, then use it */ offset = i * pagesz; - maps[map_idx].offset = offset; + mapaddr = pci_map_resource(NULL, fd, (off_t)offset, + (size_t)dev->mem_resource[i].len, 0); + close(fd); + if (mapaddr == NULL) + goto fail1; + maps[map_idx].phaddr = dev->mem_resource[i].phys_addr; maps[map_idx].size = dev->mem_resource[i].len; - mapaddr = pci_map_resource(NULL, devname, (off_t)offset, - (size_t)maps[map_idx].size); - if ((maps[map_idx].addr != NULL) || (mapaddr == NULL)) { - rte_free(uio_res); - return -1; - } - maps[map_idx].addr = mapaddr; + maps[map_idx].offset = offset; + strcpy(maps[map_idx].path, devname); map_idx++; dev->mem_resource[i].addr = mapaddr; } @@ -279,6 +304,12 @@ pci_uio_map_resource(struct rte_pci_device *dev) TAILQ_INSERT_TAIL(uio_res_list, uio_res, next); return 0; + +fail1: + rte_free(maps[map_idx].path); +fail0: + rte_free(uio_res); + return -1; } /* Scan one pci sysfs entry, and fill the devices list from it. */ diff --git a/lib/librte_eal/linuxapp/eal/eal_pci_uio.c b/lib/librte_eal/linuxapp/eal/eal_pci_uio.c index 2741c62..f100c1a 100644 --- a/lib/librte_eal/linuxapp/eal/eal_pci_uio.c +++ b/lib/librte_eal/linuxapp/eal/eal_pci_uio.c @@ -351,8 +351,11 @@ pci_uio_map_resource(struct rte_pci_device *dev) /* allocate memory to keep path */ maps[map_idx].path = rte_malloc(NULL, strlen(devname) + 1, 0); - if (maps[map_idx].path == NULL) + if (maps[map_idx].path == NULL) { + RTE_LOG(ERR, EAL, "Cannot allocate memory for " + "path: %s\n", strerror(errno)); goto fail0; + } /* * open resource file, to mmap it