From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pa0-f49.google.com (mail-pa0-f49.google.com [209.85.220.49]) by dpdk.org (Postfix) with ESMTP id C570CC5DE for ; Mon, 29 Jun 2015 04:57:32 +0200 (CEST) Received: by pabvl15 with SMTP id vl15so97705447pab.1 for ; Sun, 28 Jun 2015 19:57:32 -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=Xq5kT0YbuWL7lNxB3u21fWeEYFp05vX8I0aKElj5Zsk=; b=VT5jG1wQNgacNLAiHG8k7bAUw72RUjZqeSaqU5dCOUhb+au5JdyqgCQVFgxDgvCImD 4QAgkH1EByL/oX24Ea1qiCYb5PVX6SYQ2mwTrt8R6jJ8vmAM2lwC6T3snhwhMN2D1dVb Cf2o+GxOHMjEINrRdPPNADixVZgtxFRo03kcFNs367Sgwp1G4NfBWEqHA5CVYqXJUGzc axtxjSSy7L02P+Gs3QiLUmRP2eVwpGuNFLqeFadH0FD8stBDeduf63j27OpvDzHDiXaM HkIkZu9OExVB2EraZG1QiQNM73wqRsJT2D2ONZuXosSgM6/9SRTkf86+7loRf1d2ppRr jhkw== X-Gm-Message-State: ALoCoQlpOfreSk09ESvocedEZg9NZpj7ZW0dS/+DX2/MFYSuI9rA3r5fbmhKhLQS1akvNIdVisG4 X-Received: by 10.70.44.138 with SMTP id e10mr26659614pdm.121.1435546651943; Sun, 28 Jun 2015 19:57:31 -0700 (PDT) Received: from localhost.localdomain (napt.igel.co.jp. [219.106.231.132]) by mx.google.com with ESMTPSA id bi4sm40303927pbc.56.2015.06.28.19.57.30 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sun, 28 Jun 2015 19:57:31 -0700 (PDT) From: Tetsuya Mukawa To: dev@dpdk.org Date: Mon, 29 Jun 2015 11:56:44 +0900 Message-Id: <1435546610-4533-3-git-send-email-mukawa@igel.co.jp> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1435546610-4533-1-git-send-email-mukawa@igel.co.jp> References: <1432016513-8456-5-git-send-email-mukawa@igel.co.jp> <1435546610-4533-1-git-send-email-mukawa@igel.co.jp> Subject: [dpdk-dev] [PATCH v3 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: Mon, 29 Jun 2015 02:57:33 -0000 From: "Tetsuya.Mukawa" 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; } +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; + void *mapaddr; + 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; - char *devname; - void *mapaddr; uint64_t phaddr; - uint64_t offset; - uint64_t pagesz; 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)); + ret = pci_uio_map_uio_resource_by_index(dev, i, + uio_res, map_idx); + if (ret != 0) 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); - 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 9e0b617..7da4543 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; @@ -430,7 +448,7 @@ free_uio_res: for (i = 0; i < map_idx; i++) { pci_unmap_resource(uio_res->maps[i].addr, (size_t)uio_res->maps[i].size); - rte_free(maps[i].path); + rte_free(uio_res->maps[i].path); } rte_free(uio_res); -- 2.1.4