From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pd0-f176.google.com (mail-pd0-f176.google.com [209.85.192.176]) by dpdk.org (Postfix) with ESMTP id D83AEC324 for ; Tue, 19 May 2015 08:22:09 +0200 (CEST) Received: by pdea3 with SMTP id a3so10099277pde.2 for ; Mon, 18 May 2015 23:22:09 -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=14LcB8dqWdNf0idX7BEjmgUEvzej2ZNLxve7oT1qvj4=; b=jbFpJBNmGOXUUzbyuN7nzM2Cyb/EVLzomAepjDT4vCGrOWHZg50ipXp9gIHF/7NxEf IT5NyxZe+cofqJJA7LngQlp9qO8w074pex8t/3qfSMyctSSfu6iqO8D+UnJxxN0IcU48 dr858NVtcgak57YI8S5yOnSHJ42e3aGkPOZCngjqhno5FDZ4jdeIv7bqxkoTs50rFRj8 II7wBkIlss21wJS4TmKMiy5oxB9qB6TU/Bmqg1bkKTS89iQ7yp+vdpTaSrmSzb5+DePq s6zXL+tTZDMQIp2L2ow9iXfuYBS+GEjcRSeD4FGA5lCtr6bFor1ZKYtMmQcp1Fy7TX6D Y+5A== X-Gm-Message-State: ALoCoQmdMaiZIAKQxyrGwRH515Ph2VK5oCsnpjPviYR2Sl9upFC7qdzp2qtnCpDalTNdksZGhXb6 X-Received: by 10.70.54.164 with SMTP id k4mr51430456pdp.61.1432016529237; Mon, 18 May 2015 23:22:09 -0700 (PDT) Received: from localhost.localdomain (napt.igel.co.jp. [219.106.231.132]) by mx.google.com with ESMTPSA id e5sm11888984pdc.94.2015.05.18.23.22.05 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 18 May 2015 23:22:07 -0700 (PDT) From: Tetsuya Mukawa To: dev@dpdk.org Date: Tue, 19 May 2015 15:21:47 +0900 Message-Id: <1432016513-8456-3-git-send-email-mukawa@igel.co.jp> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1432016513-8456-1-git-send-email-mukawa@igel.co.jp> References: <1432016513-8456-1-git-send-email-mukawa@igel.co.jp> Subject: [dpdk-dev] [PATCH 2/8] eal: Add pci_uio_map_uio_resource_by_index() 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: Tue, 19 May 2015 06:22:10 -0000 This patch adds a new function called pci_uio_map_resource_by_index(). The function hides how to map uio resource in linuxapp and bsdapp. With the function, pci_uio_map_resource() will be more abstracted. Signed-off-by: Tetsuya Mukawa --- lib/librte_eal/bsdapp/eal/eal_pci.c | 107 +++++++++++++++----------- lib/librte_eal/linuxapp/eal/eal_pci_uio.c | 124 +++++++++++++++++------------- 2 files changed, 133 insertions(+), 98 deletions(-) diff --git a/lib/librte_eal/bsdapp/eal/eal_pci.c b/lib/librte_eal/bsdapp/eal/eal_pci.c index 2d9f3a5..61d1fe5 100644 --- a/lib/librte_eal/bsdapp/eal/eal_pci.c +++ b/lib/librte_eal/bsdapp/eal/eal_pci.c @@ -240,20 +240,73 @@ close_fd: return -1; } -/* map the PCI resource of a PCI device in virtual memory */ static int -pci_uio_map_resource(struct rte_pci_device *dev) +pci_uio_map_uio_resource_by_index(struct rte_pci_device *dev, int res_idx, + struct mapped_pci_resource *uio_res, int map_idx) { - int i, map_idx, ret; + int fd; char *devname; void *mapaddr; - uint64_t phaddr; uint64_t offset; uint64_t pagesz; + struct pci_map *maps; + + if ((dev == NULL) || (uio_res == NULL) || (uio_res->path == NULL)) + return -1; + + maps = uio_res->maps; + devname = uio_res->path; + pagesz = sysconf(_SC_PAGESIZE); + + /* 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)); + return -1; + } + + /* + * 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 fail; + } + + /* if matching map is found, then use it */ + offset = res_idx * pagesz; + mapaddr = pci_map_resource(NULL, fd, (off_t)offset, + (size_t)dev->mem_resource[res_idx].len, 0); + close(fd); + if (mapaddr == MAP_FAILED) + goto fail; + + maps[map_idx].phaddr = dev->mem_resource[res_idx].phys_addr; + maps[map_idx].size = dev->mem_resource[res_idx].len; + maps[map_idx].addr = mapaddr; + maps[map_idx].offset = offset; + strcpy(maps[map_idx].path, devname); + dev->mem_resource[res_idx].addr = mapaddr; + + return 0; + +fail: + rte_free(maps[map_idx].path); + return -1; +} + +/* map the PCI resource of a PCI device in virtual memory */ +static int +pci_uio_map_resource(struct rte_pci_device *dev) +{ + int i, map_idx, ret; + uint64_t phaddr; struct mapped_pci_resource *uio_res = NULL; struct mapped_pci_res_list *uio_res_list = RTE_TAILQ_CAST(rte_uio_tailq.head, mapped_pci_res_list); - struct pci_map *maps; dev->intr_handle.fd = -1; dev->intr_handle.type = RTE_INTR_HANDLE_UNKNOWN; @@ -268,53 +321,17 @@ pci_uio_map_resource(struct rte_pci_device *dev) return ret; /* Map all BARs */ - pagesz = sysconf(_SC_PAGESIZE); - devname = uio_res->path; - - maps = uio_res->maps; for (i = 0, map_idx = 0; i != PCI_MAX_RESOURCE; i++) { - int fd; - /* skip empty BAR */ if ((phaddr = dev->mem_resource[i].phys_addr) == 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 free_uio_res; - } - - /* - * 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)); - rte_free(maps[map_idx].path); - goto free_uio_res; - } - - /* if matching map is found, then use it */ - offset = i * pagesz; - mapaddr = pci_map_resource(NULL, fd, (off_t)offset, - (size_t)dev->mem_resource[i].len, 0); - close(fd); - if (mapaddr == MAP_FAILED) { - rte_free(maps[map_idx].path); + ret = pci_uio_map_uio_resource_by_index(dev, i, + uio_res, map_idx); + if (ret != 0) goto free_uio_res; - } - maps[map_idx].phaddr = dev->mem_resource[i].phys_addr; - maps[map_idx].size = dev->mem_resource[i].len; - maps[map_idx].addr = mapaddr; - maps[map_idx].offset = offset; - strcpy(maps[map_idx].path, devname); map_idx++; - dev->mem_resource[i].addr = mapaddr; } uio_res->nb_maps = map_idx; @@ -325,7 +342,7 @@ pci_uio_map_resource(struct rte_pci_device *dev) free_uio_res: for (i = 0; i < map_idx; i++) - rte_free(maps[i].path); + rte_free(uio_res->maps[i].path); rte_free(uio_res); /* close fd opened by pci_uio_alloc_uio_resource() */ diff --git a/lib/librte_eal/linuxapp/eal/eal_pci_uio.c b/lib/librte_eal/linuxapp/eal/eal_pci_uio.c index 022bd7f..23c0830 100644 --- a/lib/librte_eal/linuxapp/eal/eal_pci_uio.c +++ b/lib/librte_eal/linuxapp/eal/eal_pci_uio.c @@ -333,19 +333,82 @@ close_fd: return -1; } +static int +pci_uio_map_uio_resource_by_index(struct rte_pci_device *dev, int res_idx, + struct mapped_pci_resource *uio_res, int map_idx) +{ + int fd; + char devname[PATH_MAX]; /* contains the /dev/uioX */ + void *mapaddr; + struct rte_pci_addr *loc; + struct pci_map *maps; + + if ((dev == NULL) || (uio_res == NULL)) + return -1; + + loc = &dev->addr; + maps = uio_res->maps; + + /* update devname for mmap */ + snprintf(devname, sizeof(devname), + SYSFS_PCI_DEVICES "/" PCI_PRI_FMT "/resource%d", + loc->domain, loc->bus, loc->devid, + loc->function, res_idx); + + /* 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)); + return -1; + } + + /* + * 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 fail; + } + + /* try mapping somewhere close to the end of hugepages */ + if (pci_map_addr == NULL) + pci_map_addr = pci_find_max_end_va(); + + mapaddr = pci_map_resource(pci_map_addr, fd, 0, + (size_t)dev->mem_resource[res_idx].len, 0); + close(fd); + if (mapaddr == MAP_FAILED) + goto fail; + + pci_map_addr = RTE_PTR_ADD(mapaddr, + (size_t)dev->mem_resource[res_idx].len); + + maps[map_idx].phaddr = dev->mem_resource[res_idx].phys_addr; + maps[map_idx].size = dev->mem_resource[res_idx].len; + maps[map_idx].addr = mapaddr; + maps[map_idx].offset = 0; + strcpy(maps[map_idx].path, devname); + dev->mem_resource[res_idx].addr = mapaddr; + + return 0; + +fail: + rte_free(maps[map_idx].path); + return -1; +} + /* map the PCI resource of a PCI device in virtual memory */ int pci_uio_map_resource(struct rte_pci_device *dev) { int i, map_idx, ret; - char devname[PATH_MAX]; /* contains the /dev/uioX */ - void *mapaddr; uint64_t phaddr; - struct rte_pci_addr *loc = &dev->addr; struct mapped_pci_resource *uio_res = NULL; struct mapped_pci_res_list *uio_res_list = RTE_TAILQ_CAST(rte_uio_tailq.head, mapped_pci_res_list); - struct pci_map *maps; dev->intr_handle.fd = -1; dev->intr_handle.uio_cfg_fd = -1; @@ -361,63 +424,18 @@ pci_uio_map_resource(struct rte_pci_device *dev) return ret; /* Map all BARs */ - 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; - - /* 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); - - /* 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 free_uio_res; - } - - /* - * 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)); - rte_free(maps[map_idx].path); + ret = pci_uio_map_uio_resource_by_index(dev, i, + uio_res, map_idx); + if (ret != 0) goto free_uio_res; - } - - /* try mapping somewhere close to the end of hugepages */ - if (pci_map_addr == NULL) - pci_map_addr = pci_find_max_end_va(); - mapaddr = pci_map_resource(pci_map_addr, fd, 0, - (size_t)dev->mem_resource[i].len, 0); - close(fd); - if (mapaddr == MAP_FAILED) { - rte_free(maps[map_idx].path); - goto free_uio_res; - } - - pci_map_addr = RTE_PTR_ADD(mapaddr, - (size_t)dev->mem_resource[i].len); - - maps[map_idx].phaddr = dev->mem_resource[i].phys_addr; - maps[map_idx].size = dev->mem_resource[i].len; - maps[map_idx].addr = mapaddr; - maps[map_idx].offset = 0; - strcpy(maps[map_idx].path, devname); map_idx++; - dev->mem_resource[i].addr = mapaddr; } uio_res->nb_maps = map_idx; @@ -428,7 +446,7 @@ pci_uio_map_resource(struct rte_pci_device *dev) free_uio_res: for (i = 0; i < map_idx; i++) - rte_free(maps[i].path); + rte_free(uio_res->maps[i].path); rte_free(uio_res); /* close fd opened by pci_uio_alloc_uio_resource() */ -- 2.1.4