From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pd0-f181.google.com (mail-pd0-f181.google.com [209.85.192.181]) by dpdk.org (Postfix) with ESMTP id 3330CC43A for ; Tue, 30 Jun 2015 10:25:21 +0200 (CEST) Received: by pdjd13 with SMTP id d13so2207555pdj.0 for ; Tue, 30 Jun 2015 01:25:20 -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=p0os6/D6MzYNrpqZZfvfQ/z0tPJLwFftECjcE/+uJWI=; b=UHHxMOlZ8Bcdu6eMV1ave4sPNRD6e5e+OQff7Myt5xP/Hfnv0u3LUgpoIG3LMywkpv nBOuExpiy0FG15MVylu86MMxScLGUMqccokNfpOc2xGhzqdud/7Dfd17raWs80r4d9xy Ka1XVwq2h0MNRPddVy0SeRQ9eNYkMR9AiGrUrZUaSeB1lfJjs0447PHb4wrlkaIOzrWK t+E3g/ThtwsAWTl0BHociMkbOv/nhm2ZF8aLCoVs8J/EDIEshQcepawqxnvqD11JD80k IyTM7hJ+p1j/UYQ0CxmtuisrmrCJsN1dDswXCNkC/KM0ECPViyaQByHTwCNnayILclAE nHXw== X-Gm-Message-State: ALoCoQkBV7GNJ4B0L/+WFKlbj9Dx8ssjVfC9j+0D6A63Qy1+T+3ZpKCppfhAdUWAwuW6WroC+K7Y X-Received: by 10.70.101.3 with SMTP id fc3mr41283838pdb.167.1435652720619; Tue, 30 Jun 2015 01:25:20 -0700 (PDT) Received: from localhost.localdomain (napt.igel.co.jp. [219.106.231.132]) by mx.google.com with ESMTPSA id k9sm44733339pdp.60.2015.06.30.01.25.18 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 30 Jun 2015 01:25:19 -0700 (PDT) From: Tetsuya Mukawa To: dev@dpdk.org Date: Tue, 30 Jun 2015 17:24:22 +0900 Message-Id: <1435652668-3380-7-git-send-email-mukawa@igel.co.jp> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1435652668-3380-1-git-send-email-mukawa@igel.co.jp> References: <1435306705-11645-4-git-send-email-mukawa@igel.co.jp> <1435652668-3380-1-git-send-email-mukawa@igel.co.jp> Subject: [dpdk-dev] [PATCH v7 06/12] eal: Add pci_uio_alloc_resource() 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, 30 Jun 2015 08:25:21 -0000 From: "Tetsuya.Mukawa" This patch adds a new function called pci_uio_alloc_resource(). The function hides how to prepare 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 | 70 +++++++++++++++++++--------- lib/librte_eal/linuxapp/eal/eal_pci_uio.c | 77 ++++++++++++++++++++++--------- 2 files changed, 104 insertions(+), 43 deletions(-) diff --git a/lib/librte_eal/bsdapp/eal/eal_pci.c b/lib/librte_eal/bsdapp/eal/eal_pci.c index 06c564f..7d2f8b5 100644 --- a/lib/librte_eal/bsdapp/eal/eal_pci.c +++ b/lib/librte_eal/bsdapp/eal/eal_pci.c @@ -189,28 +189,17 @@ pci_uio_map_secondary(struct rte_pci_device *dev) 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_alloc_resource(struct rte_pci_device *dev, + struct mapped_pci_resource **uio_res) { - int i, map_idx; char devname[PATH_MAX]; /* contains the /dev/uioX */ - void *mapaddr; - uint64_t phaddr; - uint64_t offset; - uint64_t pagesz; - struct rte_pci_addr *loc = &dev->addr; - 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); - struct pci_map *maps; + struct rte_pci_addr *loc; - dev->intr_handle.fd = -1; - dev->intr_handle.type = RTE_INTR_HANDLE_UNKNOWN; + if ((dev == NULL) || (uio_res == NULL)) + return -1; - /* secondary processes - use already recorded details */ - if (rte_eal_process_type() != RTE_PROC_PRIMARY) - return pci_uio_map_secondary(dev); + loc = &dev->addr; snprintf(devname, sizeof(devname), "/dev/uio@pci:%u:%u:%u", dev->addr.bus, dev->addr.devid, dev->addr.function); @@ -231,18 +220,56 @@ pci_uio_map_resource(struct rte_pci_device *dev) dev->intr_handle.type = RTE_INTR_HANDLE_UIO; /* allocate the mapping details for secondary processes*/ - if ((uio_res = rte_zmalloc("UIO_RES", sizeof (*uio_res), 0)) == NULL) { + *uio_res = rte_zmalloc("UIO_RES", sizeof(**uio_res), 0); + if (*uio_res == NULL) { RTE_LOG(ERR, EAL, "%s(): cannot store uio mmap details\n", __func__); goto close_fd; } - snprintf(uio_res->path, sizeof(uio_res->path), "%s", devname); - memcpy(&uio_res->pci_addr, &dev->addr, sizeof(uio_res->pci_addr)); + snprintf((*uio_res)->path, sizeof((*uio_res)->path), "%s", devname); + memcpy(&(*uio_res)->pci_addr, &dev->addr, sizeof((*uio_res)->pci_addr)); + return 0; + +close_fd: + close(dev->intr_handle.fd); + dev->intr_handle.fd = -1; + dev->intr_handle.type = RTE_INTR_HANDLE_UNKNOWN; + + 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; + + /* secondary processes - use already recorded details */ + if (rte_eal_process_type() != RTE_PROC_PRIMARY) + return pci_uio_map_secondary(dev); + + /* allocate uio resource */ + ret = pci_uio_alloc_resource(dev, &uio_res); + if ((ret != 0) || (uio_res == NULL)) + 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++) { @@ -300,7 +327,8 @@ free_uio_res: for (i = 0; i < map_idx; i++) rte_free(maps[i].path); rte_free(uio_res); -close_fd: + + /* close fd opened by pci_uio_alloc_resource() */ close(dev->intr_handle.fd); dev->intr_handle.fd = -1; dev->intr_handle.type = RTE_INTR_HANDLE_UNKNOWN; diff --git a/lib/librte_eal/linuxapp/eal/eal_pci_uio.c b/lib/librte_eal/linuxapp/eal/eal_pci_uio.c index 19620fe..9483667 100644 --- a/lib/librte_eal/linuxapp/eal/eal_pci_uio.c +++ b/lib/librte_eal/linuxapp/eal/eal_pci_uio.c @@ -254,30 +254,20 @@ pci_get_uio_dev(struct rte_pci_device *dev, char *dstbuf, return uio_num; } -/* map the PCI resource of a PCI device in virtual memory */ -int -pci_uio_map_resource(struct rte_pci_device *dev) +static int +pci_uio_alloc_resource(struct rte_pci_device *dev, + struct mapped_pci_resource **uio_res) { - int i, map_idx; char dirname[PATH_MAX]; char cfgname[PATH_MAX]; char devname[PATH_MAX]; /* contains the /dev/uioX */ - void *mapaddr; int uio_num; - uint64_t phaddr; - struct rte_pci_addr *loc = &dev->addr; - 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); - struct pci_map *maps; + struct rte_pci_addr *loc; - dev->intr_handle.fd = -1; - dev->intr_handle.uio_cfg_fd = -1; - dev->intr_handle.type = RTE_INTR_HANDLE_UNKNOWN; + if ((dev == NULL) || (uio_res == NULL)) + return -1; - /* secondary processes - use already recorded details */ - if (rte_eal_process_type() != RTE_PROC_PRIMARY) - return pci_uio_map_secondary(dev); + loc = &dev->addr; /* find uio resource */ uio_num = pci_get_uio_dev(dev, dirname, sizeof(dirname)); @@ -318,15 +308,57 @@ pci_uio_map_resource(struct rte_pci_device *dev) } /* allocate the mapping details for secondary processes*/ - uio_res = rte_zmalloc("UIO_RES", sizeof(*uio_res), 0); - if (uio_res == NULL) { + *uio_res = rte_zmalloc("UIO_RES", sizeof(**uio_res), 0); + if (*uio_res == NULL) { RTE_LOG(ERR, EAL, "%s(): cannot store uio mmap details\n", __func__); goto close_fd; } - snprintf(uio_res->path, sizeof(uio_res->path), "%s", devname); - memcpy(&uio_res->pci_addr, &dev->addr, sizeof(uio_res->pci_addr)); + snprintf((*uio_res)->path, sizeof((*uio_res)->path), "%s", devname); + memcpy(&(*uio_res)->pci_addr, &dev->addr, sizeof((*uio_res)->pci_addr)); + + return 0; + +close_fd: + if (dev->intr_handle.uio_cfg_fd >= 0) { + close(dev->intr_handle.uio_cfg_fd); + dev->intr_handle.uio_cfg_fd = -1; + } + + close(dev->intr_handle.fd); + dev->intr_handle.fd = -1; + dev->intr_handle.type = RTE_INTR_HANDLE_UNKNOWN; + + 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; + dev->intr_handle.type = RTE_INTR_HANDLE_UNKNOWN; + + /* secondary processes - use already recorded details */ + if (rte_eal_process_type() != RTE_PROC_PRIMARY) + return pci_uio_map_secondary(dev); + + /* allocate uio resource */ + ret = pci_uio_alloc_resource(dev, &uio_res); + if ((ret != 0) || (uio_res == NULL)) + return ret; /* Map all BARs */ maps = uio_res->maps; @@ -401,7 +433,8 @@ free_uio_res: rte_free(maps[i].path); } rte_free(uio_res); -close_fd: + + /* close fd opened by pci_uio_alloc_resource() */ if (dev->intr_handle.uio_cfg_fd >= 0) { close(dev->intr_handle.uio_cfg_fd); dev->intr_handle.uio_cfg_fd = -1; -- 2.1.4