get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/1253/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 1253,
    "url": "https://patches.dpdk.org/api/patches/1253/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1415700565-19157-1-git-send-email-anatoly.burakov@intel.com/",
    "project": {
        "id": 1,
        "url": "https://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<1415700565-19157-1-git-send-email-anatoly.burakov@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1415700565-19157-1-git-send-email-anatoly.burakov@intel.com",
    "date": "2014-11-11T10:09:25",
    "name": "[dpdk-dev,v8] eal: map PCI memory resources after hugepages",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "3083393569968f395b668a357ed257c4a669a54b",
    "submitter": {
        "id": 4,
        "url": "https://patches.dpdk.org/api/people/4/?format=api",
        "name": "Anatoly Burakov",
        "email": "anatoly.burakov@intel.com"
    },
    "delegate": null,
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/1415700565-19157-1-git-send-email-anatoly.burakov@intel.com/mbox/",
    "series": [],
    "comments": "https://patches.dpdk.org/api/patches/1253/comments/",
    "check": "pending",
    "checks": "https://patches.dpdk.org/api/patches/1253/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [IPv6:::1])\n\tby dpdk.org (Postfix) with ESMTP id 6C3DD7F30;\n\tTue, 11 Nov 2014 10:59:48 +0100 (CET)",
            "from mga09.intel.com (mga09.intel.com [134.134.136.24])\n\tby dpdk.org (Postfix) with ESMTP id 25AEB7F2C\n\tfor <dev@dpdk.org>; Tue, 11 Nov 2014 10:59:45 +0100 (CET)",
            "from orsmga002.jf.intel.com ([10.7.209.21])\n\tby orsmga102.jf.intel.com with ESMTP; 11 Nov 2014 02:07:42 -0800",
            "from irvmail001.ir.intel.com ([163.33.26.43])\n\tby orsmga002.jf.intel.com with ESMTP; 11 Nov 2014 02:09:33 -0800",
            "from sivswdev02.ir.intel.com (sivswdev02.ir.intel.com\n\t[10.237.217.46])\n\tby irvmail001.ir.intel.com (8.14.3/8.13.6/MailSET/Hub) with ESMTP id\n\tsABA9WkY009594; Tue, 11 Nov 2014 10:09:32 GMT",
            "from sivswdev02.ir.intel.com (localhost [127.0.0.1])\n\tby sivswdev02.ir.intel.com with ESMTP id sABA9Vme019223;\n\tTue, 11 Nov 2014 10:09:32 GMT",
            "(from aburakov@localhost)\n\tby sivswdev02.ir.intel.com with  id sABA9P6j019188;\n\tTue, 11 Nov 2014 10:09:25 GMT"
        ],
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.07,360,1413270000\"; d=\"scan'208\";a=\"634968459\"",
        "From": "Anatoly Burakov <anatoly.burakov@intel.com>",
        "To": "dev@dpdk.org",
        "Date": "Tue, 11 Nov 2014 10:09:25 +0000",
        "Message-Id": "<1415700565-19157-1-git-send-email-anatoly.burakov@intel.com>",
        "X-Mailer": "git-send-email 1.7.4.1",
        "In-Reply-To": "<1415619272-8281-1-git-send-email-anatoly.burakov@intel.com>",
        "References": "<1415619272-8281-1-git-send-email-anatoly.burakov@intel.com>",
        "Subject": "[dpdk-dev] [PATCH v8] eal: map PCI memory resources after hugepages",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "patches and discussions about DPDK <dev.dpdk.org>",
        "List-Unsubscribe": "<http://dpdk.org/ml/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://dpdk.org/ml/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<http://dpdk.org/ml/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Multi-process DPDK application must mmap hugepages and PCI resources\ninto the same virtual address space. By default the virtual addresses\nare chosen by the primary process automatically when calling the mmap.\nBut sometimes the chosen virtual addresses aren't usable in secondary\nprocess - for example, secondary process is linked with more libraries\nthan primary process, and the library occupies the same address space\nthat the primary process has requested for PCI mappings.\n\nThis patch makes EAL try and map PCI BARs right after the hugepages\n(instead of location chosen by mmap) in virtual memory, so that PCI BARs\nhave less chance of ending up in random places in virtual memory.\n\nSigned-off-by: Liang Xu <liang.xu@cinfotech.cn>\nSigned-off-by: Anatoly Burakov <anatoly.burakov@intel.com>\n---\n lib/librte_eal/linuxapp/eal/eal_pci.c              | 30 ++++++++++++++++------\n lib/librte_eal/linuxapp/eal/eal_pci_uio.c          | 13 ++++++++--\n lib/librte_eal/linuxapp/eal/eal_pci_vfio.c         | 19 +++++++++++---\n lib/librte_eal/linuxapp/eal/include/eal_pci_init.h |  6 +++++\n 4 files changed, 55 insertions(+), 13 deletions(-)",
    "diff": "diff --git a/lib/librte_eal/linuxapp/eal/eal_pci.c b/lib/librte_eal/linuxapp/eal/eal_pci.c\nindex 5fe3961..79fbbb8 100644\n--- a/lib/librte_eal/linuxapp/eal/eal_pci.c\n+++ b/lib/librte_eal/linuxapp/eal/eal_pci.c\n@@ -97,6 +97,25 @@ error:\n \treturn -1;\n }\n \n+void *\n+pci_find_max_end_va(void)\n+{\n+\tconst struct rte_memseg *seg = rte_eal_get_physmem_layout();\n+\tconst struct rte_memseg *last = seg;\n+\tunsigned i = 0;\n+\n+\tfor (i = 0; i < RTE_MAX_MEMSEG; i++, seg++) {\n+\t\tif (seg->addr == NULL)\n+\t\t\tbreak;\n+\n+\t\tif (seg->addr > last->addr)\n+\t\t\tlast = seg;\n+\n+\t}\n+\treturn RTE_PTR_ADD(last->addr, last->len);\n+}\n+\n+\n /* map a particular resource from a file */\n void *\n pci_map_resource(void *requested_addr, int fd, off_t offset, size_t size)\n@@ -106,21 +125,16 @@ pci_map_resource(void *requested_addr, int fd, off_t offset, size_t size)\n \t/* Map the PCI memory resource of device */\n \tmapaddr = mmap(requested_addr, size, PROT_READ | PROT_WRITE,\n \t\t\tMAP_SHARED, fd, offset);\n-\tif (mapaddr == MAP_FAILED ||\n-\t\t\t(requested_addr != NULL && mapaddr != requested_addr)) {\n+\tif (mapaddr == MAP_FAILED) {\n \t\tRTE_LOG(ERR, EAL, \"%s(): cannot mmap(%d, %p, 0x%lx, 0x%lx): %s (%p)\\n\",\n \t\t\t__func__, fd, requested_addr,\n \t\t\t(unsigned long)size, (unsigned long)offset,\n \t\t\tstrerror(errno), mapaddr);\n-\t\tgoto fail;\n+\t} else {\n+\t\tRTE_LOG(DEBUG, EAL, \"  PCI memory mapped at %p\\n\", mapaddr);\n \t}\n \n-\tRTE_LOG(DEBUG, EAL, \"  PCI memory mapped at %p\\n\", mapaddr);\n-\n \treturn mapaddr;\n-\n-fail:\n-\treturn NULL;\n }\n \n /* parse the \"resource\" sysfs file */\ndiff --git a/lib/librte_eal/linuxapp/eal/eal_pci_uio.c b/lib/librte_eal/linuxapp/eal/eal_pci_uio.c\nindex 7e62266..e53f06b 100644\n--- a/lib/librte_eal/linuxapp/eal/eal_pci_uio.c\n+++ b/lib/librte_eal/linuxapp/eal/eal_pci_uio.c\n@@ -35,6 +35,7 @@\n #include <fcntl.h>\n #include <dirent.h>\n #include <sys/stat.h>\n+#include <sys/mman.h>\n \n #include <rte_log.h>\n #include <rte_pci.h>\n@@ -48,6 +49,8 @@\n \n static int pci_parse_sysfs_value(const char *filename, uint64_t *val);\n \n+void *pci_map_addr = NULL;\n+\n \n #define OFF_MAX              ((uint64_t)(off_t)-1)\n static int\n@@ -371,10 +374,16 @@ pci_uio_map_resource(struct rte_pci_device *dev)\n \t\t\tif (maps[j].addr != NULL)\n \t\t\t\tfail = 1;\n \t\t\telse {\n-\t\t\t\tmapaddr = pci_map_resource(NULL, fd, (off_t)offset,\n+\t\t\t\t/* try mapping somewhere close to the end of hugepages */\n+\t\t\t\tif (pci_map_addr == NULL)\n+\t\t\t\t\tpci_map_addr = pci_find_max_end_va();\n+\n+\t\t\t\tmapaddr = pci_map_resource(pci_map_addr, fd, (off_t)offset,\n \t\t\t\t\t\t(size_t)maps[j].size);\n-\t\t\t\tif (mapaddr == NULL)\n+\t\t\t\tif (mapaddr == MAP_FAILED)\n \t\t\t\t\tfail = 1;\n+\n+\t\t\t\tpci_map_addr = RTE_PTR_ADD(mapaddr, (size_t) maps[j].size);\n \t\t\t}\n \n \t\t\tif (fail) {\ndiff --git a/lib/librte_eal/linuxapp/eal/eal_pci_vfio.c b/lib/librte_eal/linuxapp/eal/eal_pci_vfio.c\nindex c776ddc..c1246e8 100644\n--- a/lib/librte_eal/linuxapp/eal/eal_pci_vfio.c\n+++ b/lib/librte_eal/linuxapp/eal/eal_pci_vfio.c\n@@ -37,6 +37,7 @@\n #include <sys/eventfd.h>\n #include <sys/socket.h>\n #include <sys/ioctl.h>\n+#include <sys/mman.h>\n \n #include <rte_log.h>\n #include <rte_pci.h>\n@@ -720,10 +721,22 @@ pci_vfio_map_resource(struct rte_pci_device *dev)\n \t\tif (i == msix_bar)\n \t\t\tcontinue;\n \n-\t\tbar_addr = pci_map_resource(maps[i].addr, vfio_dev_fd, reg.offset,\n-\t\t\t\treg.size);\n+\t\tif (internal_config.process_type == RTE_PROC_PRIMARY) {\n+\t\t\t/* try mapping somewhere close to the end of hugepages */\n+\t\t\tif (pci_map_addr == NULL)\n+\t\t\t\tpci_map_addr = pci_find_max_end_va();\n+\n+\t\t\tbar_addr = pci_map_resource(pci_map_addr, vfio_dev_fd, reg.offset,\n+\t\t\t\t\treg.size);\n+\t\t\tpci_map_addr = RTE_PTR_ADD(bar_addr, (size_t) reg.size);\n+\t\t} else {\n+\t\t\tbar_addr = pci_map_resource(maps[i].addr, vfio_dev_fd, reg.offset,\n+\t\t\t\t\treg.size);\n+\t\t}\n \n-\t\tif (bar_addr == NULL) {\n+\t\tif (bar_addr == MAP_FAILED ||\n+\t\t\t\t(internal_config.process_type == RTE_PROC_SECONDARY &&\n+\t\t\t\t\t\tbar_addr != maps[i].addr)) {\n \t\t\tRTE_LOG(ERR, EAL, \"  %s mapping BAR%i failed: %s\\n\", pci_addr, i,\n \t\t\t\t\tstrerror(errno));\n \t\t\tclose(vfio_dev_fd);\ndiff --git a/lib/librte_eal/linuxapp/eal/include/eal_pci_init.h b/lib/librte_eal/linuxapp/eal/include/eal_pci_init.h\nindex d758bee..1070eb8 100644\n--- a/lib/librte_eal/linuxapp/eal/include/eal_pci_init.h\n+++ b/lib/librte_eal/linuxapp/eal/include/eal_pci_init.h\n@@ -59,6 +59,12 @@ struct mapped_pci_resource {\n TAILQ_HEAD(mapped_pci_res_list, mapped_pci_resource);\n extern struct mapped_pci_res_list *pci_res_list;\n \n+/*\n+ * Helper function to map PCI resources right after hugepages in virtual memory\n+ */\n+extern void *pci_map_addr;\n+void *pci_find_max_end_va(void);\n+\n void *pci_map_resource(void *requested_addr, int fd, off_t offset,\n \t\tsize_t size);\n \n",
    "prefixes": [
        "dpdk-dev",
        "v8"
    ]
}