get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 9048,
    "url": "http://patches.dpdk.org/api/patches/9048/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1448289889-9590-5-git-send-email-adrien.mazarguil@6wind.com/",
    "project": {
        "id": 1,
        "url": "http://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": "<1448289889-9590-5-git-send-email-adrien.mazarguil@6wind.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1448289889-9590-5-git-send-email-adrien.mazarguil@6wind.com",
    "date": "2015-11-23T14:44:39",
    "name": "[dpdk-dev,04/14] mlx4: fix TX packet loss after initialization",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "d44208603ed8fe943466d9514ec4705631017c4f",
    "submitter": {
        "id": 165,
        "url": "http://patches.dpdk.org/api/people/165/?format=api",
        "name": "Adrien Mazarguil",
        "email": "adrien.mazarguil@6wind.com"
    },
    "delegate": null,
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/1448289889-9590-5-git-send-email-adrien.mazarguil@6wind.com/mbox/",
    "series": [],
    "comments": "http://patches.dpdk.org/api/patches/9048/comments/",
    "check": "pending",
    "checks": "http://patches.dpdk.org/api/patches/9048/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 CAD0E8F9E;\n\tMon, 23 Nov 2015 15:45:26 +0100 (CET)",
            "from mail-wm0-f48.google.com (mail-wm0-f48.google.com\n\t[74.125.82.48]) by dpdk.org (Postfix) with ESMTP id DFC4F8F9D\n\tfor <dev@dpdk.org>; Mon, 23 Nov 2015 15:45:25 +0100 (CET)",
            "by wmuu63 with SMTP id u63so57117047wmu.0\n\tfor <dev@dpdk.org>; Mon, 23 Nov 2015 06:45:25 -0800 (PST)",
            "from 6wind.com (guy78-3-82-239-227-177.fbx.proxad.net.\n\t[82.239.227.177]) by smtp.gmail.com with ESMTPSA id\n\t186sm13586675wmv.9.2015.11.23.06.45.24\n\t(version=TLSv1/SSLv3 cipher=OTHER);\n\tMon, 23 Nov 2015 06:45:25 -0800 (PST)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=6wind-com.20150623.gappssmtp.com; s=20150623;\n\th=from:to:cc:subject:date:message-id:in-reply-to:references;\n\tbh=OG/8VeQtYkl8qQQ3tFxWSncr1VIdtnAVvQuPCKORKVw=;\n\tb=ZEa9Tuud1RPFJUs+WvYD8+wViNimQB9YIAZ66W1W/KdqSFlCXDvKpF48JQIAf/HMv1\n\tD2lA2o6i+XGDzlAAbDuMcQit1bBXcTi+IenzdZlLs7Jt6SrLY6Fc6zKhSCG7Bo+7bzIZ\n\thhLw+ZcremCJbg8s+pL3JViqClh7Fh8NqraevS/OALUvIk3Uo8tMODZUZrV/SuXnHLMb\n\tm49S1oCyQJy/2B1p7bRQQQOjeoUWQsSAoOa5VMQ07UExbX/mMyvvqdlwaVgCFAF12sB6\n\t3tAL0vO9gCF0H7hSz+SCcR1WpuJpfvYvMSijRvdq1X6r0yA/wAEShh3plTo+PKXMEmDU\n\tanCw==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20130820;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references;\n\tbh=OG/8VeQtYkl8qQQ3tFxWSncr1VIdtnAVvQuPCKORKVw=;\n\tb=JonXVHkX310m7VSn9F6ycV49T0XMm73wPdAlelx9APy6R62NfUJT+WbBiDUgd+VpKw\n\thACIVeDJdU0jbKaqFjB6iNCEarPEjP3AE2O2eKY7lSyQ9GFXiLObRGTKBhVOpjB41AwW\n\t82iT3S1jcJ4YvgpzRrEPYg1ZPOH8npeT8zHCcEAVSCVArRKQlxwpZCavFK2Sn8d2qoj0\n\t37w5Pef3JwX4c/v+X9v6G4VlSqyozXR5P5KJu9rHuX2I1Yw+yZHgzcmJBfKLFyN1JMQS\n\tPgPO7E2YEaXJB8ZjPe8TUcSGSP64W5Rr7ooGEJL5F3fE/swf8a/h6KSRdaIFOMgF0zYu\n\tDqqA==",
        "X-Gm-Message-State": "ALoCoQm5wJcAGbaIRRf7ENtYzlLwQTAlIKtm08Z0YpUD2b7IhyfwDiG+IclelhJ0q6OT17EQ4oTg",
        "X-Received": "by 10.28.47.212 with SMTP id v203mr18535189wmv.37.1448289925760; \n\tMon, 23 Nov 2015 06:45:25 -0800 (PST)",
        "From": "Adrien Mazarguil <adrien.mazarguil@6wind.com>",
        "To": "dev@dpdk.org",
        "Date": "Mon, 23 Nov 2015 15:44:39 +0100",
        "Message-Id": "<1448289889-9590-5-git-send-email-adrien.mazarguil@6wind.com>",
        "X-Mailer": "git-send-email 2.1.0",
        "In-Reply-To": "<1448289889-9590-1-git-send-email-adrien.mazarguil@6wind.com>",
        "References": "<1448289889-9590-1-git-send-email-adrien.mazarguil@6wind.com>",
        "Subject": "[dpdk-dev] [PATCH 04/14] mlx4: fix TX packet loss after\n\tinitialization",
        "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": "From: Olga Shern <olgas@mellanox.com>\n\nPre-registering mbuf memory pools when creating TX queues avoids costly\nregistrations later in the data path.\n\nFixes: 7fae69eeff13 (\"mlx4: new poll mode driver\")\n\nSigned-off-by: Olga Shern <olgas@mellanox.com>\nSigned-off-by: Adrien Mazarguil <adrien.mazarguil@6wind.com>\n---\n drivers/net/mlx4/mlx4.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++---\n 1 file changed, 84 insertions(+), 5 deletions(-)",
    "diff": "diff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c\nindex 75543bb..4bd0ecd 100644\n--- a/drivers/net/mlx4/mlx4.c\n+++ b/drivers/net/mlx4/mlx4.c\n@@ -229,7 +229,7 @@ typedef uint8_t linear_t[16384];\n struct txq {\n \tstruct priv *priv; /* Back pointer to private data. */\n \tstruct {\n-\t\tstruct rte_mempool *mp; /* Cached Memory Pool. */\n+\t\tconst struct rte_mempool *mp; /* Cached Memory Pool. */\n \t\tstruct ibv_mr *mr; /* Memory Region (for mp). */\n \t\tuint32_t lkey; /* mr->lkey */\n \t} mp2mr[MLX4_PMD_TX_MP_CACHE]; /* MP to MR translation table. */\n@@ -1016,7 +1016,7 @@ txq_mb2mp(struct rte_mbuf *buf)\n  *   mr->lkey on success, (uint32_t)-1 on failure.\n  */\n static uint32_t\n-txq_mp2mr(struct txq *txq, struct rte_mempool *mp)\n+txq_mp2mr(struct txq *txq, const struct rte_mempool *mp)\n {\n \tunsigned int i;\n \tstruct ibv_mr *mr;\n@@ -1033,7 +1033,8 @@ txq_mp2mr(struct txq *txq, struct rte_mempool *mp)\n \t\t}\n \t}\n \t/* Add a new entry, register MR first. */\n-\tDEBUG(\"%p: discovered new memory pool %p\", (void *)txq, (void *)mp);\n+\tDEBUG(\"%p: discovered new memory pool \\\"%s\\\" (%p)\",\n+\t      (void *)txq, mp->name, (const void *)mp);\n \tmr = ibv_reg_mr(txq->priv->pd,\n \t\t\t(void *)mp->elt_va_start,\n \t\t\t(mp->elt_va_end - mp->elt_va_start),\n@@ -1056,11 +1057,87 @@ txq_mp2mr(struct txq *txq, struct rte_mempool *mp)\n \ttxq->mp2mr[i].mp = mp;\n \ttxq->mp2mr[i].mr = mr;\n \ttxq->mp2mr[i].lkey = mr->lkey;\n-\tDEBUG(\"%p: new MR lkey for MP %p: 0x%08\" PRIu32,\n-\t      (void *)txq, (void *)mp, txq->mp2mr[i].lkey);\n+\tDEBUG(\"%p: new MR lkey for MP \\\"%s\\\" (%p): 0x%08\" PRIu32,\n+\t      (void *)txq, mp->name, (const void *)mp, txq->mp2mr[i].lkey);\n \treturn txq->mp2mr[i].lkey;\n }\n \n+struct txq_mp2mr_mbuf_check_data {\n+\tconst struct rte_mempool *mp;\n+\tint ret;\n+};\n+\n+/**\n+ * Callback function for rte_mempool_obj_iter() to check whether a given\n+ * mempool object looks like a mbuf.\n+ *\n+ * @param[in, out] arg\n+ *   Context data (struct txq_mp2mr_mbuf_check_data). Contains mempool pointer\n+ *   and return value.\n+ * @param[in] start\n+ *   Object start address.\n+ * @param[in] end\n+ *   Object end address.\n+ * @param index\n+ *   Unused.\n+ *\n+ * @return\n+ *   Nonzero value when object is not a mbuf.\n+ */\n+static void\n+txq_mp2mr_mbuf_check(void *arg, void *start, void *end,\n+\t\t     uint32_t index __rte_unused)\n+{\n+\tstruct txq_mp2mr_mbuf_check_data *data = arg;\n+\tstruct rte_mbuf *buf =\n+\t\t(void *)((uintptr_t)start + data->mp->header_size);\n+\n+\t(void)index;\n+\t/* Check whether mbuf structure fits element size and whether mempool\n+\t * pointer is valid. */\n+\tif (((uintptr_t)end >= (uintptr_t)(buf + 1)) &&\n+\t    (buf->pool == data->mp))\n+\t\tdata->ret = 0;\n+\telse\n+\t\tdata->ret = -1;\n+}\n+\n+/**\n+ * Iterator function for rte_mempool_walk() to register existing mempools and\n+ * fill the MP to MR cache of a TX queue.\n+ *\n+ * @param[in] mp\n+ *   Memory Pool to register.\n+ * @param *arg\n+ *   Pointer to TX queue structure.\n+ */\n+static void\n+txq_mp2mr_iter(const struct rte_mempool *mp, void *arg)\n+{\n+\tstruct txq *txq = arg;\n+\tstruct txq_mp2mr_mbuf_check_data data = {\n+\t\t.mp = mp,\n+\t\t.ret = -1,\n+\t};\n+\n+\t/* Discard empty mempools. */\n+\tif (mp->size == 0)\n+\t\treturn;\n+\t/* Register mempool only if the first element looks like a mbuf. */\n+\trte_mempool_obj_iter((void *)mp->elt_va_start,\n+\t\t\t     1,\n+\t\t\t     mp->header_size + mp->elt_size + mp->trailer_size,\n+\t\t\t     1,\n+\t\t\t     mp->elt_pa,\n+\t\t\t     mp->pg_num,\n+\t\t\t     mp->pg_shift,\n+\t\t\t     txq_mp2mr_mbuf_check,\n+\t\t\t     &data);\n+\tif (data.ret)\n+\t\treturn;\n+\ttxq_mp2mr(txq, mp);\n+}\n+\n #if MLX4_PMD_SGE_WR_N > 1\n \n /**\n@@ -1571,6 +1648,8 @@ txq_setup(struct rte_eth_dev *dev, struct txq *txq, uint16_t desc,\n \ttxq_cleanup(txq);\n \t*txq = tmpl;\n \tDEBUG(\"%p: txq updated with %p\", (void *)txq, (void *)&tmpl);\n+\t/* Pre-register known mempools. */\n+\trte_mempool_walk(txq_mp2mr_iter, txq);\n \tassert(ret == 0);\n \treturn 0;\n error:\n",
    "prefixes": [
        "dpdk-dev",
        "04/14"
    ]
}