get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 45225,
    "url": "https://patches.dpdk.org/api/patches/45225/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20180924183637.16423-2-yskoh@mellanox.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": "<20180924183637.16423-2-yskoh@mellanox.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20180924183637.16423-2-yskoh@mellanox.com",
    "date": "2018-09-24T18:36:47",
    "name": "[2/2] net/mlx5: support externally allocated static memory",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "d11ec3b429d32b00e21b4e73105da185ca9f0ecf",
    "submitter": {
        "id": 636,
        "url": "https://patches.dpdk.org/api/people/636/?format=api",
        "name": "Yongseok Koh",
        "email": "yskoh@mellanox.com"
    },
    "delegate": {
        "id": 6624,
        "url": "https://patches.dpdk.org/api/users/6624/?format=api",
        "username": "shahafs",
        "first_name": "Shahaf",
        "last_name": "Shuler",
        "email": "shahafs@mellanox.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20180924183637.16423-2-yskoh@mellanox.com/mbox/",
    "series": [
        {
            "id": 1472,
            "url": "https://patches.dpdk.org/api/series/1472/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=1472",
            "date": "2018-09-24T18:36:45",
            "name": "[1/2] net/mlx4: support externally allocated static memory",
            "version": 1,
            "mbox": "https://patches.dpdk.org/series/1472/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/45225/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/45225/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 [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 490361B10C;\n\tMon, 24 Sep 2018 20:36:52 +0200 (CEST)",
            "from EUR04-DB3-obe.outbound.protection.outlook.com\n\t(mail-eopbgr60063.outbound.protection.outlook.com [40.107.6.63])\n\tby dpdk.org (Postfix) with ESMTP id EC2F61B0F7;\n\tMon, 24 Sep 2018 20:36:48 +0200 (CEST)",
            "from DB3PR0502MB3980.eurprd05.prod.outlook.com (52.134.72.27) by\n\tDB3PR0502MB3947.eurprd05.prod.outlook.com (52.134.71.159) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n\t15.20.1164.20; Mon, 24 Sep 2018 18:36:47 +0000",
            "from DB3PR0502MB3980.eurprd05.prod.outlook.com\n\t([fe80::1cb0:661b:ecab:6045]) by\n\tDB3PR0502MB3980.eurprd05.prod.outlook.com\n\t([fe80::1cb0:661b:ecab:6045%2]) with mapi id 15.20.1164.017;\n\tMon, 24 Sep 2018 18:36:47 +0000"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=Mellanox.com;\n\ts=selector1;\n\th=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n\tbh=2FajUi8rFLe9UR9RRLbmcKWRrMl7rnj8WoxhiZrPVu8=;\n\tb=sdTKsRYI4/yBHzfz35dmetJhQfWxFJqUYmRZz5LyVaeyKZTrXqXRiFSAa1q6By4SsG+t3CKI/Zt3U51g11XUZYvfWVGo8YzQ03a+b4oWPDAjW5lU9tM6zmWFCSsIV4b+E1t53DVf0fQUUH++DbZM2vxgnmfWg1l6pBhtbsRHkKA=",
        "From": "Yongseok Koh <yskoh@mellanox.com>",
        "To": "Shahaf Shuler <shahafs@mellanox.com>",
        "CC": "\"dev@dpdk.org\" <dev@dpdk.org>, Yongseok Koh <yskoh@mellanox.com>,\n\t\"stable@dpdk.org\" <stable@dpdk.org>, \"Damjan Marion (damarion)\"\n\t<damarion@cisco.com>, Ed Warnicke <hagbard@gmail.com>",
        "Thread-Topic": "[PATCH 2/2] net/mlx5: support externally allocated static\n\tmemory",
        "Thread-Index": "AQHUVDWMrZl2zT4ySUCwBf9+cA7mGA==",
        "Date": "Mon, 24 Sep 2018 18:36:47 +0000",
        "Message-ID": "<20180924183637.16423-2-yskoh@mellanox.com>",
        "References": "<20180924183637.16423-1-yskoh@mellanox.com>",
        "In-Reply-To": "<20180924183637.16423-1-yskoh@mellanox.com>",
        "Accept-Language": "en-US",
        "Content-Language": "en-US",
        "X-MS-Has-Attach": "",
        "X-MS-TNEF-Correlator": "",
        "x-clientproxiedby": "MWHPR19CA0089.namprd19.prod.outlook.com\n\t(2603:10b6:320:1f::27) To DB3PR0502MB3980.eurprd05.prod.outlook.com\n\t(2603:10a6:8:10::27)",
        "authentication-results": "spf=none (sender IP is )\n\tsmtp.mailfrom=yskoh@mellanox.com; ",
        "x-ms-exchange-messagesentrepresentingtype": "1",
        "x-originating-ip": "[209.116.155.178]",
        "x-ms-publictraffictype": "Email",
        "x-microsoft-exchange-diagnostics": "1; DB3PR0502MB3947;\n\t6:G4hNeubW7Z58YWJBReey0FS5J6r4ojKdODBFttNH8PgD2HmN1GSqTsAJbJvvsHOWfvA0BwoZjmaJlIAO5aee/it9HOQOnTeMBLJVM7CkIX6p4NZsT+4toxZQ8VGrBbCHCPsvDAOeHFTLWJpOpWm1fryWXUm0NaHvfaALlIjZ76iaqHQD4inCtUh2dICLUYefU/PyOqhz394IT9qfRGCUdLtlUgiSmC2Ri5j3RAZ6n4SbZ2iCfoOfzLMYJK9Jv9SdhDS9gE6BksMTRh9UkNuKtxzjnHHiR96KrxKV9litoq+7b1Vvu+1hKjasBtPTJMpIm2Iys08a0Fb7Nyd/Ma6+rEQcPkFS+ILRwLPEzVEe2hhM+ABldh5FwkztdyHZQMbG+OwHPqyx1txNpovUE9Q2K/ZsfO+naoU5v5cbko6zk0Ff6AU7NjYixEgUOnFItxY6bpa9DIxYCXEDY/dxZkPo8g==;\n\t5:o0P8WKY/Rq02L9uX/wqkHyPW0rAHSPyNnfpBwdnwgNm0XhuUQzaSXyzLbrNpDhw7ADCXcji42wsYXNMe/GllX4Rf7z+vMR+qR2/Xynnj2RvOiXTwVB7rUz+ARPzCJOCBCK6sjiOgEYSlLODbg9+KycCpKxxxWgE1xp4d1nrjmCo=;\n\t7:Bka40SaUygxj/cY+Nz2FYxlpBeaN26QGsJ0GSwZlvjOT/srfL5YmGDs65C+HcMZZiMxdPP6NWQBPUijwG9VzQ8sPydzkMp+kfQ1ZUa+gTTLs31Q5dCSERmc1iQnkZo8lK7JVnLzbOd4GaJPfOLliZD8K1wY4e6rNCLKYg6AoCeZy30R5bKIFzVGa7MP7hxMLUjX41XPNkQGJoKLaS+zZDpZK9PjjgBjxquMy/ifOxRdxG4LOululLOjRuDSq2iod",
        "x-ms-office365-filtering-correlation-id": "fa360701-c040-4834-2395-08d6224caf33",
        "x-ms-office365-filtering-ht": "Tenant",
        "x-microsoft-antispam": "BCL:0; PCL:0;\n\tRULEID:(7020095)(4652040)(8989299)(5600074)(711020)(4618075)(2017052603328)(7153060)(7193020);\n\tSRVR:DB3PR0502MB3947; ",
        "x-ms-traffictypediagnostic": "DB3PR0502MB3947:",
        "x-microsoft-antispam-prvs": "<DB3PR0502MB39479CA901820F5CA103D365C3170@DB3PR0502MB3947.eurprd05.prod.outlook.com>",
        "x-exchange-antispam-report-test": "UriScan:(95692535739014)(85827821059158);",
        "x-ms-exchange-senderadcheck": "1",
        "x-exchange-antispam-report-cfa-test": "BCL:0; PCL:0;\n\tRULEID:(8211001083)(6040522)(2401047)(5005006)(8121501046)(3002001)(3231355)(944501410)(52105095)(93006095)(93001095)(10201501046)(6055026)(149066)(150027)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123564045)(20161123560045)(20161123558120)(20161123562045)(201708071742011)(7699051);\n\tSRVR:DB3PR0502MB3947; BCL:0; PCL:0; RULEID:; SRVR:DB3PR0502MB3947; ",
        "x-forefront-prvs": "0805EC9467",
        "x-forefront-antispam-report": "SFV:NSPM;\n\tSFS:(10009020)(136003)(346002)(39860400002)(376002)(366004)(396003)(189003)(199004)(478600001)(86362001)(37006003)(316002)(966005)(14454004)(3846002)(6116002)(5660300001)(1076002)(6636002)(8676002)(2900100001)(8936002)(81156014)(97736004)(2906002)(5250100002)(6306002)(71200400001)(71190400001)(68736007)(99286004)(14444005)(256004)(105586002)(2616005)(476003)(81166006)(45080400002)(6862004)(76176011)(6506007)(39060400002)(386003)(486006)(305945005)(52116002)(26005)(102836004)(7736002)(53936002)(4326008)(54906003)(6436002)(106356001)(6486002)(6512007)(36756003)(66066001)(446003)(11346002)(25786009);\n\tDIR:OUT; SFP:1101; SCL:1; SRVR:DB3PR0502MB3947;\n\tH:DB3PR0502MB3980.eurprd05.prod.outlook.com; FPR:; SPF:None; LANG:en; \n\tPTR:InfoNoRecords; MX:1; A:1; ",
        "received-spf": "None (protection.outlook.com: mellanox.com does not designate\n\tpermitted sender hosts)",
        "x-microsoft-antispam-message-info": "8auw0mGRCWdzKqeqn6P8vxwJcayuTCJ+AEPEoooqorhymAbGjol7RvDEbhCFyrgu+sOdyu60SJRw5dpQqFIWarglwh6fNBVIhsZEplREBpqb/SAtSzeoGEgffA0HT8NPOeImlAl9slREWCZYSoYZTbfA3jZS7TVjkW2WLoFN9sff99IA6T8hi+QsVncVIEfwAKRh/rXsnEOWk0IfXGYPnKNO0X/7k3J5B4Br0WGoQ7OGyy2exm95aEnMR5tUMeEFRfPS40GPVNP585Q+EORkkMWhKo75v8UCA1jg7UWOMR2xAw1hxRUd2xQXeONWht/ZXTtoM5F4HNrypyIrY4zA++8C88UxwYEJo3Xs79CXELI=",
        "spamdiagnosticoutput": "1:99",
        "spamdiagnosticmetadata": "NSPM",
        "Content-Type": "text/plain; charset=\"iso-8859-1\"",
        "Content-Transfer-Encoding": "quoted-printable",
        "MIME-Version": "1.0",
        "X-OriginatorOrg": "Mellanox.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "fa360701-c040-4834-2395-08d6224caf33",
        "X-MS-Exchange-CrossTenant-originalarrivaltime": "24 Sep 2018 18:36:47.5008\n\t(UTC)",
        "X-MS-Exchange-CrossTenant-fromentityheader": "Hosted",
        "X-MS-Exchange-CrossTenant-id": "a652971c-7d2e-4d9b-a6a4-d149256f461b",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "DB3PR0502MB3947",
        "Subject": "[dpdk-dev] [PATCH 2/2] net/mlx5: support externally allocated\n\tstatic memory",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n\t<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\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "When MLX PMD registers memory for DMA, it accesses the global memseg list\nof DPDK to maximize the range of registration so that LKey search can be\nmore efficient. Granularity of MR registration is per page.\n\nExternally allocated memory shouldn't be used for DMA because it can't be\nsearched in the memseg list and free event can't be tracked by DPDK. If it\nis used, the following error will occur:\n\n\tnet_mlx5: port 0 unable to find virtually contiguous chunk for\n\taddress (0x5600017587c0). rte_memseg_contig_walk() failed.\n\nThere's a pending patchset [1] which enables externally allocated memory.\nOnce it is merged, users can register their own memory out of EAL then that\nwill resolve this issue.\n\nMeanwhile, if the external memory is static (allocated on startup and never\nfreed), such memory can also be registered by little tweak in the code.\n\n[1] http://patches.dpdk.org/project/dpdk/list/?series=1415\n\nThis patch is not a bug fix but needs to be included in stable versions.\n\nFixes: 974f1e7ef146 (\"net/mlx5: add new memory region support\")\nCc: stable@dpdk.org\nCc: \"Damjan Marion (damarion)\" <damarion@cisco.com>\nCc: Ed Warnicke <hagbard@gmail.com>\n\nSigned-off-by: Yongseok Koh <yskoh@mellanox.com>\n---\n drivers/net/mlx5/mlx5_mr.c   | 155 +++++++++++++++++++++++++++++++++++++++++++\n drivers/net/mlx5/mlx5_rxtx.h |  35 +++++++++-\n 2 files changed, 189 insertions(+), 1 deletion(-)",
    "diff": "diff --git a/drivers/net/mlx5/mlx5_mr.c b/drivers/net/mlx5/mlx5_mr.c\nindex 1d1bcb5fe..f4b15d3f6 100644\n--- a/drivers/net/mlx5/mlx5_mr.c\n+++ b/drivers/net/mlx5/mlx5_mr.c\n@@ -277,6 +277,23 @@ mr_find_next_chunk(struct mlx5_mr *mr, struct mlx5_mr_cache *entry,\n \tuintptr_t end = 0;\n \tuint32_t idx = 0;\n \n+\t/* MR for external memory doesn't have memseg list. */\n+\tif (mr->msl == NULL) {\n+\t\tstruct ibv_mr *ibv_mr = mr->ibv_mr;\n+\n+\t\tassert(mr->ms_bmp_n == 1);\n+\t\tassert(mr->ms_n == 1);\n+\t\tassert(base_idx == 0);\n+\t\t/*\n+\t\t * Can't search it from memseg list but get it directly from\n+\t\t * verbs MR as there's only one chunk.\n+\t\t */\n+\t\tentry->start = (uintptr_t)ibv_mr->addr;\n+\t\tentry->end = (uintptr_t)ibv_mr->addr + mr->ibv_mr->length;\n+\t\tentry->lkey = rte_cpu_to_be_32(mr->ibv_mr->lkey);\n+\t\t/* Returning 1 ends iteration. */\n+\t\treturn 1;\n+\t}\n \tfor (idx = base_idx; idx < mr->ms_bmp_n; ++idx) {\n \t\tif (rte_bitmap_get(mr->ms_bmp, idx)) {\n \t\t\tconst struct rte_memseg_list *msl;\n@@ -811,6 +828,7 @@ mlx5_mr_mem_event_free_cb(struct rte_eth_dev *dev, const void *addr, size_t len)\n \t\tmr = mr_lookup_dev_list(dev, &entry, start);\n \t\tif (mr == NULL)\n \t\t\tcontinue;\n+\t\tassert(mr->msl); /* Can't be external memory. */\n \t\tms = rte_mem_virt2memseg((void *)start, msl);\n \t\tassert(ms != NULL);\n \t\tassert(msl->page_sz == ms->hugepage_sz);\n@@ -1061,6 +1079,139 @@ mlx5_mr_flush_local_cache(struct mlx5_mr_ctrl *mr_ctrl)\n \t\t(void *)mr_ctrl, mr_ctrl->cur_gen);\n }\n \n+/**\n+ * Called during rte_mempool_mem_iter() by mlx5_mr_update_ext_mp().\n+ *\n+ * Externally allocated chunk is registered and a MR is created for the chunk.\n+ * The MR object is added to the global list. If memseg list of a MR object\n+ * (mr->msl) is null, the MR object can be regarded as externally allocated\n+ * memory.\n+ *\n+ * Once external memory is registered, it should be static. If the memory is\n+ * freed and the virtual address range has different physical memory mapped\n+ * again, it may cause crash on device due to the wrong translation entry. PMD\n+ * can't track the free event of the external memory for now.\n+ */\n+static void\n+mlx5_mr_update_ext_mp_cb(struct rte_mempool *mp, void *opaque,\n+\t\t\t struct rte_mempool_memhdr *memhdr,\n+\t\t\t unsigned mem_idx __rte_unused)\n+{\n+\tstruct mr_update_mp_data *data = opaque;\n+\tstruct rte_eth_dev *dev = data->dev;\n+\tstruct priv *priv = dev->data->dev_private;\n+\tstruct mlx5_mr_ctrl *mr_ctrl = data->mr_ctrl;\n+\tstruct mlx5_mr *mr = NULL;\n+\tuintptr_t addr = (uintptr_t)memhdr->addr;\n+\tsize_t len = memhdr->len;\n+\tstruct mlx5_mr_cache entry;\n+\tuint32_t lkey;\n+\n+\t/* If already registered, it should return. */\n+\trte_rwlock_read_lock(&priv->mr.rwlock);\n+\tlkey = mr_lookup_dev(dev, &entry, addr);\n+\trte_rwlock_read_unlock(&priv->mr.rwlock);\n+\tif (lkey != UINT32_MAX)\n+\t\treturn;\n+\tmr = rte_zmalloc_socket(NULL,\n+\t\t\t\tRTE_ALIGN_CEIL(sizeof(*mr),\n+\t\t\t\t\t       RTE_CACHE_LINE_SIZE),\n+\t\t\t\tRTE_CACHE_LINE_SIZE, mp->socket_id);\n+\tif (mr == NULL) {\n+\t\tDRV_LOG(WARNING,\n+\t\t\t\"port %u unable to allocate memory for a new MR of\"\n+\t\t\t\" mempool (%s).\",\n+\t\t\tdev->data->port_id, mp->name);\n+\t\tdata->ret = -1;\n+\t\treturn;\n+\t}\n+\tDRV_LOG(DEBUG, \"port %u register MR for chunk #%d of mempool (%s)\",\n+\t\tdev->data->port_id, mem_idx, mp->name);\n+\tmr->ibv_mr = mlx5_glue->reg_mr(priv->pd, (void *)addr, len,\n+\t\t\t\t       IBV_ACCESS_LOCAL_WRITE);\n+\tif (mr->ibv_mr == NULL) {\n+\t\tDRV_LOG(WARNING,\n+\t\t\t\"port %u fail to create a verbs MR for address (%p)\",\n+\t\t\tdev->data->port_id, (void *)addr);\n+\t\trte_free(mr);\n+\t\tdata->ret = -1;\n+\t\treturn;\n+\t}\n+\tmr->msl = NULL; /* Mark it is external memory. */\n+\tmr->ms_bmp = NULL;\n+\tmr->ms_n = 1;\n+\tmr->ms_bmp_n = 1;\n+\trte_rwlock_write_lock(&priv->mr.rwlock);\n+\tLIST_INSERT_HEAD(&priv->mr.mr_list, mr, mr);\n+\tDRV_LOG(DEBUG,\n+\t\t\"port %u MR CREATED (%p) for external memory %p:\\n\"\n+\t\t\"  [0x%\" PRIxPTR \", 0x%\" PRIxPTR \"),\"\n+\t\t\" lkey=0x%x base_idx=%u ms_n=%u, ms_bmp_n=%u\",\n+\t\tdev->data->port_id, (void *)mr, (void *)addr,\n+\t\taddr, addr + len, rte_cpu_to_be_32(mr->ibv_mr->lkey),\n+\t\tmr->ms_base_idx, mr->ms_n, mr->ms_bmp_n);\n+\t/* Insert to the global cache table. */\n+\tmr_insert_dev_cache(dev, mr);\n+\trte_rwlock_write_unlock(&priv->mr.rwlock);\n+\t/* Insert to the local cache table */\n+\tmlx5_mr_addr2mr_bh(dev, mr_ctrl, addr);\n+}\n+\n+/**\n+ * Register MR for entire memory chunks in a Mempool having externally allocated\n+ * memory and fill in local cache.\n+ *\n+ * @param dev\n+ *   Pointer to Ethernet device.\n+ * @param mr_ctrl\n+ *   Pointer to per-queue MR control structure.\n+ * @param mp\n+ *   Pointer to registering Mempool.\n+ *\n+ * @return\n+ *   0 on success, -1 on failure.\n+ */\n+static uint32_t\n+mlx5_mr_update_ext_mp(struct rte_eth_dev *dev, struct mlx5_mr_ctrl *mr_ctrl,\n+\t\t      struct rte_mempool *mp)\n+{\n+\tstruct mr_update_mp_data data = {\n+\t\t.dev = dev,\n+\t\t.mr_ctrl = mr_ctrl,\n+\t\t.ret = 0,\n+\t};\n+\n+\trte_mempool_mem_iter(mp, mlx5_mr_update_ext_mp_cb, &data);\n+\treturn data.ret;\n+}\n+\n+/**\n+ * Register MR entire memory chunks in a Mempool having externally allocated\n+ * memory and search LKey of the address to return.\n+ *\n+ * @param dev\n+ *   Pointer to Ethernet device.\n+ * @param addr\n+ *   Search key.\n+ * @param mp\n+ *   Pointer to registering Mempool where addr belongs.\n+ *\n+ * @return\n+ *   LKey for address on success, UINT32_MAX on failure.\n+ */\n+uint32_t\n+mlx5_tx_update_ext_mp(struct mlx5_txq_data *txq, uintptr_t addr,\n+\t\t      struct rte_mempool *mp)\n+{\n+\tstruct mlx5_txq_ctrl *txq_ctrl =\n+\t\tcontainer_of(txq, struct mlx5_txq_ctrl, txq);\n+\tstruct mlx5_mr_ctrl *mr_ctrl = &txq->mr_ctrl;\n+\tstruct priv *priv = txq_ctrl->priv;\n+\n+\tmlx5_mr_update_ext_mp(ETH_DEV(priv), mr_ctrl, mp);\n+\treturn mlx5_tx_addr2mr_bh(txq, addr);\n+}\n+\n /* Called during rte_mempool_mem_iter() by mlx5_mr_update_mp(). */\n static void\n mlx5_mr_update_mp_cb(struct rte_mempool *mp __rte_unused, void *opaque,\n@@ -1104,6 +1255,10 @@ mlx5_mr_update_mp(struct rte_eth_dev *dev, struct mlx5_mr_ctrl *mr_ctrl,\n \t};\n \n \trte_mempool_mem_iter(mp, mlx5_mr_update_mp_cb, &data);\n+\tif (data.ret < 0 && rte_errno == ENXIO) {\n+\t\t/* Mempool may have externally allocated memory. */\n+\t\treturn mlx5_mr_update_ext_mp(dev, mr_ctrl, mp);\n+\t}\n \treturn data.ret;\n }\n \ndiff --git a/drivers/net/mlx5/mlx5_rxtx.h b/drivers/net/mlx5/mlx5_rxtx.h\nindex d225b9c27..1db468c3b 100644\n--- a/drivers/net/mlx5/mlx5_rxtx.h\n+++ b/drivers/net/mlx5/mlx5_rxtx.h\n@@ -363,6 +363,8 @@ uint16_t mlx5_rx_burst_vec(void *dpdk_txq, struct rte_mbuf **pkts,\n void mlx5_mr_flush_local_cache(struct mlx5_mr_ctrl *mr_ctrl);\n uint32_t mlx5_rx_addr2mr_bh(struct mlx5_rxq_data *rxq, uintptr_t addr);\n uint32_t mlx5_tx_addr2mr_bh(struct mlx5_txq_data *txq, uintptr_t addr);\n+uint32_t mlx5_tx_update_ext_mp(struct mlx5_txq_data *txq, uintptr_t addr,\n+\t\t\t       struct rte_mempool *mp);\n \n /**\n  * Provide safe 64bit store operation to mlx5 UAR region for both 32bit and\n@@ -607,6 +609,24 @@ mlx5_tx_complete(struct mlx5_txq_data *txq)\n }\n \n /**\n+ * Get Memory Pool (MP) from mbuf. If mbuf is indirect, the pool from which the\n+ * cloned mbuf is allocated is returned instead.\n+ *\n+ * @param buf\n+ *   Pointer to mbuf.\n+ *\n+ * @return\n+ *   Memory pool where data is located for given mbuf.\n+ */\n+static struct rte_mempool *\n+mlx5_mb2mp(struct rte_mbuf *buf)\n+{\n+\tif (unlikely(RTE_MBUF_INDIRECT(buf)))\n+\t\treturn rte_mbuf_from_indirect(buf)->pool;\n+\treturn buf->pool;\n+}\n+\n+/**\n  * Query LKey from a packet buffer for Rx. No need to flush local caches for Rx\n  * as mempool is pre-configured and static.\n  *\n@@ -664,7 +684,20 @@ mlx5_tx_addr2mr(struct mlx5_txq_data *txq, uintptr_t addr)\n \treturn mlx5_tx_addr2mr_bh(txq, addr);\n }\n \n-#define mlx5_tx_mb2mr(rxq, mb) mlx5_tx_addr2mr(rxq, (uintptr_t)((mb)->buf_addr))\n+static __rte_always_inline uint32_t\n+mlx5_tx_mb2mr(struct mlx5_txq_data *txq, struct rte_mbuf *mb)\n+{\n+\tuintptr_t addr = (uintptr_t)mb->buf_addr;\n+\tuint32_t lkey = mlx5_tx_addr2mr(txq, addr);\n+\n+\tif (likely(lkey != UINT32_MAX))\n+\t\treturn lkey;\n+\tif (rte_errno == ENXIO) {\n+\t\t/* Mempool may have externally allocated memory. */\n+\t\tlkey = mlx5_tx_update_ext_mp(txq, addr, mlx5_mb2mp(mb));\n+\t}\n+\treturn lkey;\n+}\n \n /**\n  * Ring TX queue doorbell and flush the update if requested.\n",
    "prefixes": [
        "2/2"
    ]
}