get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 139828,
    "url": "http://patchwork.dpdk.org/api/patches/139828/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20240503094615.1427-1-thj@freebsd.org/",
    "project": {
        "id": 1,
        "url": "http://patchwork.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": "<20240503094615.1427-1-thj@freebsd.org>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20240503094615.1427-1-thj@freebsd.org",
    "date": "2024-05-03T09:46:15",
    "name": "freebsd: Add support for multiple dpdk instances on FreeBSD",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "6999acd42bccc2d5a091db61f204ee6e788de37f",
    "submitter": {
        "id": 3293,
        "url": "http://patchwork.dpdk.org/api/people/3293/?format=api",
        "name": "Tom Jones",
        "email": "thj@freebsd.org"
    },
    "delegate": {
        "id": 1,
        "url": "http://patchwork.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/20240503094615.1427-1-thj@freebsd.org/mbox/",
    "series": [
        {
            "id": 31874,
            "url": "http://patchwork.dpdk.org/api/series/31874/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=31874",
            "date": "2024-05-03T09:46:15",
            "name": "freebsd: Add support for multiple dpdk instances on FreeBSD",
            "version": 1,
            "mbox": "http://patchwork.dpdk.org/series/31874/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/139828/comments/",
    "check": "fail",
    "checks": "http://patchwork.dpdk.org/api/patches/139828/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id AA01843F76;\n\tFri,  3 May 2024 14:48:33 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 72B3B402D0;\n\tFri,  3 May 2024 14:48:33 +0200 (CEST)",
            "from mx2.freebsd.org (mx2.freebsd.org [96.47.72.81])\n by mails.dpdk.org (Postfix) with ESMTP id 3F190402CF\n for <dev@dpdk.org>; Fri,  3 May 2024 10:46:27 +0200 (CEST)",
            "from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (4096 bits)\n client-signature RSA-PSS (4096 bits))\n (Client CN \"mx1.freebsd.org\", Issuer \"R3\" (verified OK))\n by mx2.freebsd.org (Postfix) with ESMTPS id 4VW4Ck2h2xz3Ngj;\n Fri,  3 May 2024 08:46:26 +0000 (UTC) (envelope-from thj@freebsd.org)",
            "from smtp.freebsd.org (smtp.freebsd.org\n [IPv6:2610:1c1:1:606c::24b:4])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256\n client-signature RSA-PSS (4096 bits) client-digest SHA256)\n (Client CN \"smtp.freebsd.org\", Issuer \"R3\" (verified OK))\n by mx1.freebsd.org (Postfix) with ESMTPS id 4VW4Ck2808z4PS0;\n Fri,  3 May 2024 08:46:26 +0000 (UTC) (envelope-from thj@freebsd.org)",
            "from vpp.my.domain (unknown [188.74.83.122])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest\n SHA256)\n (Client did not present a certificate) (Authenticated sender: thj)\n by smtp.freebsd.org (Postfix) with ESMTPSA id 4VW4Cj58bFzPWr;\n Fri,  3 May 2024 08:46:25 +0000 (UTC) (envelope-from thj@freebsd.org)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim;\n t=1714725986;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:cc:mime-version:mime-version:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=v4cxY33kQZ0yuY4/7kzDm0+KfEvN5ReHx0nboDXT/48=;\n b=iyNcu1gvvl35cbdmiBQ9ImUAxwOJsqD571zOsPE/sMG3VjZxTdNupeXjishkH0DvfWC7XZ\n M6QrcrsNh7AJzlfr3D/PkxsF25Vj98pr/OxJ3JZBqMj0yTbJ5oopaNg4s/3Y3aHUQ29a6j\n QpN4IQCAtYOCCsdp6OEAZqTtaBHQSc5QYETMOmGdr8KMzFId918aBQlxFuNLPsrN0ePira\n Exe8DbuRY/Qm6LsSNfkc9v7yh9vQ1GRjJxyPJq53YwCiSNAGTRaXwWyhLGheTzSue81nIj\n XueqTR58j9lTeQPKmvgq9l/k1yUKfYlQ2Gr/DiFlFF/42jufYfCvYAwL171gAw==",
        "ARC-Seal": "i=1; s=dkim; d=freebsd.org; t=1714725986; a=rsa-sha256; cv=none;\n b=Odgjf2MyPwCgxvfmMNJx4ZDDLsScYjy23g1g3rUWmDDN2+YFj2C4avhv2yR6zZM4IHRZJT\n H8JDtl/Ik/7s+L+mq4nAOqEmm/P2t1nY0BrE8DLDStijwrfcUektOWvjBiH8vwv48pge9n\n a1so4hb8acDaBqvMPlWQPrfASMlz+GQczYY09zX/+a5XO9RZVxoe698+UjqlVoOaXOMSSH\n Lf5sSq8kUzFs+oU1f8SoSpbkf+S5vuSqraejV/rXJvDX+sN/6xGRDQODSqou5g4fsZkzIe\n bPmQvgbYsDF5sUy3cQ0vyXrZQYJSJfgVuypa+w+J82Xr5eU599XNRV/1W/wv4g==",
        "ARC-Authentication-Results": "i=1;\n\tmx1.freebsd.org;\n\tnone",
        "ARC-Message-Signature": "i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org;\n s=dkim; t=1714725986;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:cc:mime-version:mime-version:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=v4cxY33kQZ0yuY4/7kzDm0+KfEvN5ReHx0nboDXT/48=;\n b=mj/4RyVrXZGPTyvi5NQPVentnh4uQxvTUZzJwk1egrisKEPAAKlyWZV+a7bnazl23meym2\n BZ3q7uNiX4lRFc0WMXKCVRGX9jxqdOPwxM2120IHqwRySiGsaLm3liN0BujgwV9Si6ukU2\n sHF+A7rPBctOeDlgU8xRz06QLJgRk8CId0TJHXRwAItqEBPD5vkiBj4hGVVg4xZQ5vTROY\n qlsUPGBWk1RxEm9fV/7cqsbQhB/2CTm3JgtjFDVjC7eCwpa4vdNUqA9IcpcxHXiOjYK7RI\n Tuq73f7SJfodUWrsaHvIQGgVb/tnYByWXWayztHwYRhBP4wLPPmNgPrAzlxAWw==",
        "From": "Tom Jones <thj@freebsd.org>",
        "To": "dev@dpdk.org",
        "Cc": "Tom Jones <thj@freebsd.org>",
        "Subject": "[PATCH] freebsd: Add support for multiple dpdk instances on FreeBSD",
        "Date": "Fri,  3 May 2024 09:46:15 +0000",
        "Message-ID": "<20240503094615.1427-1-thj@freebsd.org>",
        "X-Mailer": "git-send-email 2.44.0",
        "In-Reply-To": "<20240502135541.47142-1-thj@freebsd.org>",
        "References": "<20240502135541.47142-1-thj@freebsd.org>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "X-Mailman-Approved-At": "Fri, 03 May 2024 14:48:33 +0200",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org"
    },
    "content": "Add support to the contigmem module on FreeBSD for multiple concurrent\nfiles, this enables running multiple dpdk instances with the nic_uio\ndriver.\n\nAdd relevant parts in dpdk to support this.\n\nSigned-off-by: Tom Jones <thj@freebsd.org>\n---\n config/rte_config.h                  |   2 +\n kernel/freebsd/contigmem/contigmem.c | 225 ++++++++++++++++++---------\n lib/eal/common/eal_common_options.c  |   2 +\n lib/eal/freebsd/eal.c                |  12 ++\n lib/eal/freebsd/eal_hugepage_info.c  |  12 +-\n lib/eal/freebsd/eal_memory.c         |   3 +-\n 6 files changed, 180 insertions(+), 76 deletions(-)",
    "diff": "diff --git a/config/rte_config.h b/config/rte_config.h\nindex dd7bb0d35b..d4d4e3506c 100644\n--- a/config/rte_config.h\n+++ b/config/rte_config.h\n@@ -51,6 +51,8 @@\n #define RTE_MAX_VFIO_CONTAINERS 64\n \n /* bsd module defines */\n+#define RTE_CONTIGMEM_DEFAULT_NUM_DEVS 1\n+#define RTE_CONTIGMEM_MAX_NUM_DEVS 64\n #define RTE_CONTIGMEM_MAX_NUM_BUFS 64\n #define RTE_CONTIGMEM_DEFAULT_NUM_BUFS 1\n #define RTE_CONTIGMEM_DEFAULT_BUF_SIZE (512*1024*1024)\ndiff --git a/kernel/freebsd/contigmem/contigmem.c b/kernel/freebsd/contigmem/contigmem.c\nindex 7dd87599d9..839fd6b2f0 100644\n--- a/kernel/freebsd/contigmem/contigmem.c\n+++ b/kernel/freebsd/contigmem/contigmem.c\n@@ -1,5 +1,9 @@\n /* SPDX-License-Identifier: BSD-3-Clause\n  * Copyright(c) 2010-2014 Intel Corporation\n+ * Copyright(c) 2024 FreeBSD Foundation\n+ *\n+ * Part of this software was developed by Tom Jones <thj@freebsd.org> under\n+ * sponsorship from the FreeBSD Foundation.\n  */\n \n #include <sys/cdefs.h>\n@@ -37,8 +41,17 @@ struct contigmem_buffer {\n \tstruct mtx      mtx;\n };\n \n+struct contigmem_device {\n+\tstruct contigmem_buffer\tcm_buffers[RTE_CONTIGMEM_MAX_NUM_BUFS];\n+\tstruct cdev\t\t*cm_cdev;\n+\tint\t\t\tcm_refcnt;\n+\tint\t\t\tcm_device_index;\n+\teventhandler_tag contigmem_eh_tag;\n+};\n+\n struct contigmem_vm_handle {\n \tint             buffer_index;\n+\tint\t\tdevice_index;\n };\n \n static int              contigmem_load(void);\n@@ -49,29 +62,18 @@ static d_mmap_single_t  contigmem_mmap_single;\n static d_open_t         contigmem_open;\n static d_close_t        contigmem_close;\n \n+static struct           sysctl_ctx_list sysctl_ctx;\n+static struct           contigmem_device contigmem_device_list[RTE_CONTIGMEM_MAX_NUM_DEVS];\n+\n+static int              contigmem_num_devices = RTE_CONTIGMEM_DEFAULT_NUM_DEVS;\n static int              contigmem_num_buffers = RTE_CONTIGMEM_DEFAULT_NUM_BUFS;\n static int64_t          contigmem_buffer_size = RTE_CONTIGMEM_DEFAULT_BUF_SIZE;\n-\n-static eventhandler_tag contigmem_eh_tag;\n-static struct contigmem_buffer contigmem_buffers[RTE_CONTIGMEM_MAX_NUM_BUFS];\n-static struct cdev     *contigmem_cdev = NULL;\n static int              contigmem_refcnt;\n \n+TUNABLE_INT(\"hw.contigmem.num_devices\", &contigmem_num_devices);\n TUNABLE_INT(\"hw.contigmem.num_buffers\", &contigmem_num_buffers);\n TUNABLE_QUAD(\"hw.contigmem.buffer_size\", &contigmem_buffer_size);\n \n-static SYSCTL_NODE(_hw, OID_AUTO, contigmem, CTLFLAG_RD, 0, \"contigmem\");\n-\n-SYSCTL_INT(_hw_contigmem, OID_AUTO, num_buffers, CTLFLAG_RD,\n-\t&contigmem_num_buffers, 0, \"Number of contigmem buffers allocated\");\n-SYSCTL_QUAD(_hw_contigmem, OID_AUTO, buffer_size, CTLFLAG_RD,\n-\t&contigmem_buffer_size, 0, \"Size of each contiguous buffer\");\n-SYSCTL_INT(_hw_contigmem, OID_AUTO, num_references, CTLFLAG_RD,\n-\t&contigmem_refcnt, 0, \"Number of references to contigmem\");\n-\n-static SYSCTL_NODE(_hw_contigmem, OID_AUTO, physaddr, CTLFLAG_RD, 0,\n-\t\"physaddr\");\n-\n MALLOC_DEFINE(M_CONTIGMEM, \"contigmem\", \"contigmem(4) allocations\");\n \n static int contigmem_modevent(module_t mod, int type, void *arg)\n@@ -114,16 +116,9 @@ static int\n contigmem_load(void)\n {\n \tchar index_string[8], description[32];\n-\tint  i, error = 0;\n+\tint  i, j, created_devs = 0, error = 0;\n \tvoid *addr;\n \n-\tif (contigmem_num_buffers > RTE_CONTIGMEM_MAX_NUM_BUFS) {\n-\t\tprintf(\"%d buffers requested is greater than %d allowed\\n\",\n-\t\t\t\tcontigmem_num_buffers, RTE_CONTIGMEM_MAX_NUM_BUFS);\n-\t\terror = EINVAL;\n-\t\tgoto error;\n-\t}\n-\n \tif (contigmem_buffer_size < PAGE_SIZE ||\n \t\t\t(contigmem_buffer_size & (contigmem_buffer_size - 1)) != 0) {\n \t\tprintf(\"buffer size 0x%lx is not greater than PAGE_SIZE and \"\n@@ -132,83 +127,156 @@ contigmem_load(void)\n \t\tgoto error;\n \t}\n \n-\tfor (i = 0; i < contigmem_num_buffers; i++) {\n-\t\taddr = contigmalloc(contigmem_buffer_size, M_CONTIGMEM, M_ZERO,\n-\t\t\t0, BUS_SPACE_MAXADDR, contigmem_buffer_size, 0);\n-\t\tif (addr == NULL) {\n-\t\t\tprintf(\"contigmalloc failed for buffer %d\\n\", i);\n-\t\t\terror = ENOMEM;\n-\t\t\tgoto error;\n-\t\t}\n+\tif (contigmem_num_devices > RTE_CONTIGMEM_MAX_NUM_BUFS) {\n+\t\tprintf(\"%d buffers requested is greater than %d allowed\\n\",\n+\t\t\t\tcontigmem_num_buffers, RTE_CONTIGMEM_MAX_NUM_BUFS);\n+\t\terror = EINVAL;\n+\t\tgoto error;\n+\t}\n \n-\t\tprintf(\"%2u: virt=%p phys=%p\\n\", i, addr,\n-\t\t\t(void *)pmap_kextract((vm_offset_t)addr));\n+\tif (contigmem_num_buffers > RTE_CONTIGMEM_MAX_NUM_DEVS) {\n+\t\tprintf(\"%d devices requested is greater than %d allowed\\n\",\n+\t\t\t\tcontigmem_num_buffers, RTE_CONTIGMEM_MAX_NUM_DEVS);\n+\t\terror = EINVAL;\n+\t\tgoto error;\n+\t}\n \n-\t\tmtx_init(&contigmem_buffers[i].mtx, \"contigmem\", NULL, MTX_DEF);\n-\t\tcontigmem_buffers[i].addr = addr;\n-\t\tcontigmem_buffers[i].refcnt = 0;\n+\tif (contigmem_num_devices == 0) {\n+\t\tprintf(\"contigmem_num_devices set to 0, not creating any allocations\\n\");\n+\t\terror = EINVAL;\n+\t\tgoto error;\n+\t}\n \n-\t\tsnprintf(index_string, sizeof(index_string), \"%d\", i);\n-\t\tsnprintf(description, sizeof(description),\n-\t\t\t\t\"phys addr for buffer %d\", i);\n-\t\tSYSCTL_ADD_PROC(NULL,\n-\t\t\t\t&SYSCTL_NODE_CHILDREN(_hw_contigmem, physaddr), OID_AUTO,\n+\tsysctl_ctx_init(&sysctl_ctx);\n+\n+\tstatic struct sysctl_oid *sysctl_root;\n+\tsysctl_root = SYSCTL_ADD_NODE(&sysctl_ctx, SYSCTL_STATIC_CHILDREN(_hw),\n+\t\t\tOID_AUTO, \"contigmem\", CTLFLAG_RD, 0, \"contigmem\");\n+\n+\tSYSCTL_ADD_INT(&sysctl_ctx, SYSCTL_CHILDREN(sysctl_root), OID_AUTO,\n+\t\t\"num_devices\", CTLFLAG_RD, &contigmem_num_devices, 0,\n+\t\t\"Number of contigmem devices\");\n+\tSYSCTL_ADD_INT(&sysctl_ctx, SYSCTL_CHILDREN(sysctl_root), OID_AUTO,\n+\t\t\"num_buffers\", CTLFLAG_RD, &contigmem_num_buffers, 0,\n+\t\t\"Number of contigmem buffers allocated\");\n+\tSYSCTL_ADD_QUAD(&sysctl_ctx, SYSCTL_CHILDREN(sysctl_root), OID_AUTO,\n+\t\t\"buffer_size\", CTLFLAG_RD, &contigmem_buffer_size,\n+\t\t\"Size of each contiguous buffer\");\n+\tSYSCTL_ADD_INT(&sysctl_ctx, SYSCTL_CHILDREN(sysctl_root), OID_AUTO,\n+\t\t\"num_references\", CTLFLAG_RD, &contigmem_refcnt, 0,\n+\t\t\"Number of references to contigmem\");\n+\n+\tstruct contigmem_device *cd;\n+\tfor (i = 0; i < contigmem_num_devices; i++) {\n+\t\tcd = &contigmem_device_list[i];\n+\t\tstruct sysctl_oid *sysctl_dev;\n+\t\tchar namebuf[32];\n+\t\tsnprintf(namebuf, sizeof(namebuf), \"contigmem%d\", i);\n+\n+\t\tcd->cm_device_index = i;\n+\n+\t\tprintf(\"Adding node at index %d\\n\", i);\n+\t\tsysctl_dev = SYSCTL_ADD_NODE(&sysctl_ctx, SYSCTL_CHILDREN(sysctl_root),\n+\t\t\t\tOID_AUTO, namebuf, CTLFLAG_RD, 0,\n+\t\t\t\t\"contigmem\");\n+\t\tSYSCTL_ADD_INT(&sysctl_ctx,\n+\t\t\t\tSYSCTL_CHILDREN(sysctl_dev), OID_AUTO,\n+\t\t\t\t\"num_references\", CTLFLAG_RD, &cd->cm_refcnt, 0,\n+\t\t\t\t\"Number of references to contigmem device\");\n+\n+\t\tfor (j = 0; j < contigmem_num_buffers; j++) {\n+\t\t\taddr = contigmalloc(contigmem_buffer_size, M_CONTIGMEM, M_ZERO,\n+\t\t\t\t0, BUS_SPACE_MAXADDR, contigmem_buffer_size, 0);\n+\t\t\tif (addr == NULL) {\n+\t\t\t\tprintf(\"contigmalloc failed for device %d buffer %d\\n\",\n+\t\t\t\t\ti, j);\n+\t\t\t\terror = ENOMEM;\n+\t\t\t\tgoto error;\n+\t\t\t}\n+\n+\t\t\tprintf(\"dev: %2u %2u: virt=%p phys=%p\\n\", i, j, addr,\n+\t\t\t\t(void *)pmap_kextract((vm_offset_t)addr));\n+\n+\t\t\tmtx_init(&cd->cm_buffers[j].mtx, \"contigmem\", NULL, MTX_DEF);\n+\t\t\tcd->cm_buffers[j].addr = addr;\n+\t\t\tcd->cm_buffers[j].refcnt = 0;\n+\n+\t\t\tsnprintf(index_string, sizeof(index_string), \"%d\", j);\n+\t\t\tsnprintf(description, sizeof(description),\n+\t\t\t\t\t\"phys addr for buffer %d\", j);\n+\n+\t\t\tSYSCTL_ADD_PROC(&sysctl_ctx,\n+\t\t\t\tSYSCTL_CHILDREN(sysctl_dev), OID_AUTO,\n \t\t\t\tindex_string, CTLTYPE_U64 | CTLFLAG_RD,\n-\t\t\t\t(void *)(uintptr_t)i, 0, contigmem_physaddr, \"LU\",\n+\t\t\t\t(void *)&cd->cm_buffers[j], 0, contigmem_physaddr, \"LU\",\n \t\t\t\tdescription);\n-\t}\n+\t\t}\n \n-\tcontigmem_cdev = make_dev_credf(0, &contigmem_ops, 0, NULL, UID_ROOT,\n-\t\t\tGID_WHEEL, 0600, \"contigmem\");\n+\t\tcd->cm_cdev = make_dev_credf(0, &contigmem_ops, i, NULL,\n+\t\t\t\tUID_ROOT, GID_WHEEL, 0600, \"contigmem%d\", i);\n+\t\tcd->cm_cdev->si_drv1 = cd;\n+\t\tcreated_devs++;\n+\t}\n \n \treturn 0;\n \n error:\n-\tfor (i = 0; i < contigmem_num_buffers; i++) {\n-\t\tif (contigmem_buffers[i].addr != NULL) {\n-\t\t\tcontigfree(contigmem_buffers[i].addr,\n-\t\t\t\tcontigmem_buffer_size, M_CONTIGMEM);\n-\t\t\tcontigmem_buffers[i].addr = NULL;\n+\tfor (i = 0; i < created_devs; i++) {\n+\t\tcd = &contigmem_device_list[i];\n+\t\tfor (j = 0; j < contigmem_num_buffers; j++) {\n+\t\t\tif (cd->cm_buffers[j].addr != NULL) {\n+\t\t\t\tcontigfree(cd->cm_buffers[j].addr,\n+\t\t\t\t\tcontigmem_buffer_size, M_CONTIGMEM);\n+\t\t\t\tcd->cm_buffers[j].addr = NULL;\n+\t\t\t}\n+\t\t\tif (mtx_initialized(&cd->cm_buffers[j].mtx))\n+\t\t\t\tmtx_destroy(&cd->cm_buffers[j].mtx);\n \t\t}\n-\t\tif (mtx_initialized(&contigmem_buffers[i].mtx))\n-\t\t\tmtx_destroy(&contigmem_buffers[i].mtx);\n \t}\n \n+\tsysctl_ctx_free(&sysctl_ctx);\n \treturn error;\n }\n \n static int\n contigmem_unload(void)\n {\n-\tint i;\n+\tstruct contigmem_device *cd;\n \n \tif (contigmem_refcnt > 0)\n \t\treturn EBUSY;\n \n-\tif (contigmem_cdev != NULL)\n-\t\tdestroy_dev(contigmem_cdev);\n+\tfor (int i = 0; i < contigmem_num_devices; i++) {\n+\t\tcd = &contigmem_device_list[i];\n+\t\tif (cd->cm_cdev != NULL)\n+\t\t\tdestroy_dev(cd->cm_cdev);\n \n-\tif (contigmem_eh_tag != NULL)\n-\t\tEVENTHANDLER_DEREGISTER(process_exit, contigmem_eh_tag);\n+\t\tif (cd->contigmem_eh_tag != NULL)\n+\t\t\tEVENTHANDLER_DEREGISTER(process_exit, cd->contigmem_eh_tag);\n \n-\tfor (i = 0; i < RTE_CONTIGMEM_MAX_NUM_BUFS; i++) {\n-\t\tif (contigmem_buffers[i].addr != NULL)\n-\t\t\tcontigfree(contigmem_buffers[i].addr,\n-\t\t\t\tcontigmem_buffer_size, M_CONTIGMEM);\n-\t\tif (mtx_initialized(&contigmem_buffers[i].mtx))\n-\t\t\tmtx_destroy(&contigmem_buffers[i].mtx);\n+\t\tfor (int j = 0; j < RTE_CONTIGMEM_MAX_NUM_BUFS; j++) {\n+\t\t\tif (cd->cm_buffers[j].addr != NULL)\n+\t\t\t\tcontigfree(cd->cm_buffers[j].addr,\n+\t\t\t\t\tcontigmem_buffer_size, M_CONTIGMEM);\n+\t\t\tif (mtx_initialized(&cd->cm_buffers[j].mtx))\n+\t\t\t\tmtx_destroy(&cd->cm_buffers[j].mtx);\n+\t\t}\n \t}\n \n+\tsysctl_ctx_free(&sysctl_ctx);\n+\n \treturn 0;\n }\n \n static int\n contigmem_physaddr(SYSCTL_HANDLER_ARGS)\n {\n-\tuint64_t\tphysaddr;\n-\tint\t\tindex = (int)(uintptr_t)arg1;\n+\tuint64_t physaddr;\n+\tstruct contigmem_buffer *buf;\n \n-\tphysaddr = (uint64_t)vtophys(contigmem_buffers[index].addr);\n+\tbuf = (struct contigmem_buffer *)arg1;\n+\n+\tphysaddr = (uint64_t)vtophys(buf->addr);\n \treturn sysctl_handle_64(oidp, &physaddr, 0, req);\n }\n \n@@ -216,8 +284,11 @@ static int\n contigmem_open(struct cdev *cdev, int fflags, int devtype,\n \t\tstruct thread *td)\n {\n+\tstruct contigmem_device *cd;\n+\tcd = cdev->si_drv1;\n \n \tatomic_add_int(&contigmem_refcnt, 1);\n+\tatomic_add_int(&cd->cm_refcnt, 1);\n \n \treturn 0;\n }\n@@ -226,8 +297,11 @@ static int\n contigmem_close(struct cdev *cdev, int fflags, int devtype,\n \t\tstruct thread *td)\n {\n+\tstruct contigmem_device *cd;\n+\tcd = cdev->si_drv1;\n \n \tatomic_subtract_int(&contigmem_refcnt, 1);\n+\tatomic_subtract_int(&cd->cm_refcnt, 1);\n \n \treturn 0;\n }\n@@ -238,10 +312,14 @@ contigmem_cdev_pager_ctor(void *handle, vm_ooffset_t size, vm_prot_t prot,\n {\n \tstruct contigmem_vm_handle *vmh = handle;\n \tstruct contigmem_buffer *buf;\n+\tstruct contigmem_device *cd;\n \n-\tbuf = &contigmem_buffers[vmh->buffer_index];\n+\tcd = &contigmem_device_list[vmh->device_index];\n+\tbuf = &cd->cm_buffers[vmh->buffer_index];\n+\t\tvmh, vmh->buffer_index, vmh->device_index, cd, buf, buf->refcnt);\n \n \tatomic_add_int(&contigmem_refcnt, 1);\n+\tatomic_add_int(&cd->cm_refcnt, 1);\n \n \tmtx_lock(&buf->mtx);\n \tif (buf->refcnt == 0)\n@@ -257,8 +335,10 @@ contigmem_cdev_pager_dtor(void *handle)\n {\n \tstruct contigmem_vm_handle *vmh = handle;\n \tstruct contigmem_buffer *buf;\n+\tstruct contigmem_device *cd;\n \n-\tbuf = &contigmem_buffers[vmh->buffer_index];\n+\tcd = &contigmem_device_list[vmh->device_index];\n+\tbuf = &cd->cm_buffers[vmh->buffer_index];\n \n \tmtx_lock(&buf->mtx);\n \tbuf->refcnt--;\n@@ -267,6 +347,7 @@ contigmem_cdev_pager_dtor(void *handle)\n \tfree(vmh, M_CONTIGMEM);\n \n \tatomic_subtract_int(&contigmem_refcnt, 1);\n+\tatomic_subtract_int(&cd->cm_refcnt, 1);\n }\n \n static int\n@@ -334,8 +415,11 @@ contigmem_mmap_single(struct cdev *cdev, vm_ooffset_t *offset, vm_size_t size,\n \t\tstruct vm_object **obj, int nprot)\n {\n \tstruct contigmem_vm_handle *vmh;\n+\tstruct contigmem_device *cd;\n \tuint64_t buffer_index;\n \n+\tcd = (struct contigmem_device *)cdev->si_drv1;\n+\n \t/*\n \t * The buffer index is encoded in the offset.  Divide the offset by\n \t *  PAGE_SIZE to get the index of the buffer requested by the user\n@@ -352,8 +436,9 @@ contigmem_mmap_single(struct cdev *cdev, vm_ooffset_t *offset, vm_size_t size,\n \tif (vmh == NULL)\n \t\treturn ENOMEM;\n \tvmh->buffer_index = buffer_index;\n+\tvmh->device_index = cd->cm_device_index;\n \n-\t*offset = (vm_ooffset_t)vtophys(contigmem_buffers[buffer_index].addr);\n+\t*offset = (vm_ooffset_t)vtophys(cd->cm_buffers[buffer_index].addr);\n \t*obj = cdev_pager_allocate(vmh, OBJT_DEVICE, &contigmem_cdev_pager_ops,\n \t\t\tsize, nprot, *offset, curthread->td_ucred);\n \ndiff --git a/lib/eal/common/eal_common_options.c b/lib/eal/common/eal_common_options.c\nindex e541f07939..4801ef469d 100644\n--- a/lib/eal/common/eal_common_options.c\n+++ b/lib/eal/common/eal_common_options.c\n@@ -313,11 +313,13 @@ eal_option_device_parse(void)\n const char *\n eal_get_hugefile_prefix(void)\n {\n+#ifndef RTE_EXEC_ENV_FREEBSD\n \tconst struct internal_config *internal_conf =\n \t\teal_get_internal_configuration();\n \n \tif (internal_conf->hugefile_prefix != NULL)\n \t\treturn internal_conf->hugefile_prefix;\n+#endif\n \treturn HUGEFILE_PREFIX_DEFAULT;\n }\n \ndiff --git a/lib/eal/freebsd/eal.c b/lib/eal/freebsd/eal.c\nindex bab77118e9..3bb46ca9ee 100644\n--- a/lib/eal/freebsd/eal.c\n+++ b/lib/eal/freebsd/eal.c\n@@ -464,6 +464,18 @@ eal_parse_args(int argc, char **argv)\n \t\t\t}\n \t\t\tbreak;\n \t\t}\n+\t\tcase OPT_FILE_PREFIX_NUM:\n+\t\t{\n+\t\t\tchar *prefix = strdup(optarg);\n+\t\t\tif (prefix == NULL)\n+\t\t\t\tEAL_LOG(ERR, \"Could not store file prefix\");\n+\t\t\telse {\n+\t\t\t\t/* free old prefix */\n+\t\t\t\tfree(internal_conf->hugefile_prefix);\n+\t\t\t\tinternal_conf->hugefile_prefix = prefix;\n+\t\t\t}\n+\t\t\tbreak;\n+\t\t}\n \t\tcase OPT_HELP_NUM:\n \t\t\teal_usage(prgname);\n \t\t\texit(EXIT_SUCCESS);\ndiff --git a/lib/eal/freebsd/eal_hugepage_info.c b/lib/eal/freebsd/eal_hugepage_info.c\nindex b6772e0701..f77d4de030 100644\n--- a/lib/eal/freebsd/eal_hugepage_info.c\n+++ b/lib/eal/freebsd/eal_hugepage_info.c\n@@ -14,8 +14,6 @@\n #include \"eal_internal_cfg.h\"\n #include \"eal_filesystem.h\"\n \n-#define CONTIGMEM_DEV \"/dev/contigmem\"\n-\n /*\n  * Uses mmap to create a shared memory area for storage of data\n  * Used in this file to store the hugepage file map on disk\n@@ -85,9 +83,13 @@ eal_hugepage_info_init(void)\n \t\treturn -1;\n \t}\n \n-\tfd = open(CONTIGMEM_DEV, O_RDWR);\n+\tchar contigmemdev[64];\n+\tsnprintf(contigmemdev, sizeof(contigmemdev), \"/dev/%s\",\n+\t\tinternal_conf->hugefile_prefix);\n+\n+\tfd = open(contigmemdev, O_RDWR);\n \tif (fd < 0) {\n-\t\tEAL_LOG(ERR, \"could not open \"CONTIGMEM_DEV);\n+\t\tEAL_LOG(ERR, \"could not open %s\", contigmemdev);\n \t\treturn -1;\n \t}\n \tif (flock(fd, LOCK_EX | LOCK_NB) < 0) {\n@@ -105,7 +107,7 @@ eal_hugepage_info_init(void)\n \t\tEAL_LOG(INFO, \"Contigmem driver has %d buffers, each of size %dKB\",\n \t\t\t\tnum_buffers, (int)(buffer_size>>10));\n \n-\tstrlcpy(hpi->hugedir, CONTIGMEM_DEV, sizeof(hpi->hugedir));\n+\tstrlcpy(hpi->hugedir, contigmemdev, sizeof(hpi->hugedir));\n \thpi->hugepage_sz = buffer_size;\n \thpi->num_pages[0] = num_buffers;\n \thpi->lock_descriptor = fd;\ndiff --git a/lib/eal/freebsd/eal_memory.c b/lib/eal/freebsd/eal_memory.c\nindex a6f3ba226e..a9ba3f89b6 100644\n--- a/lib/eal/freebsd/eal_memory.c\n+++ b/lib/eal/freebsd/eal_memory.c\n@@ -128,7 +128,8 @@ rte_eal_hugepage_init(void)\n \t\t\t * the previous one.\n \t\t\t */\n \t\t\tsnprintf(physaddr_str, sizeof(physaddr_str),\n-\t\t\t\t\t\"hw.contigmem.physaddr.%d\", j);\n+\t\t\t\t\t\"hw.contigmem.%s.%d\",\n+\t\t\t\t\tinternal_conf->hugefile_prefix, j);\n \t\t\terror = sysctlbyname(physaddr_str, &physaddr,\n \t\t\t\t\t&sysctl_size, NULL, 0);\n \t\t\tif (error < 0) {\n",
    "prefixes": []
}