get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 75035,
    "url": "http://patches.dpdk.org/api/patches/75035/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20200730120900.108232-3-yang_y_yi@163.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": "<20200730120900.108232-3-yang_y_yi@163.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20200730120900.108232-3-yang_y_yi@163.com",
    "date": "2020-07-30T12:08:59",
    "name": "[V1,2/3] mbuf: change free_cb interface to adapt to GSO case",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "0e63daff2dc8717bbefda74912b1bd3bbc246edd",
    "submitter": {
        "id": 1806,
        "url": "http://patches.dpdk.org/api/people/1806/?format=api",
        "name": "yang_y_yi",
        "email": "yang_y_yi@163.com"
    },
    "delegate": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20200730120900.108232-3-yang_y_yi@163.com/mbox/",
    "series": [
        {
            "id": 11418,
            "url": "http://patches.dpdk.org/api/series/11418/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=11418",
            "date": "2020-07-30T12:08:59",
            "name": "Fix external mbuf free issue in GSO case",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/11418/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/75035/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/75035/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 dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id D65B2A052B;\n\tThu, 30 Jul 2020 14:09:07 +0200 (CEST)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id AA172E07;\n\tThu, 30 Jul 2020 14:09:06 +0200 (CEST)",
            "from mail-m974.mail.163.com (mail-m974.mail.163.com [123.126.97.4])\n by dpdk.org (Postfix) with ESMTP id 684F7255\n for <dev@dpdk.org>; Thu, 30 Jul 2020 14:09:04 +0200 (CEST)",
            "from yangyi0100.home.langchao.com (unknown [61.48.210.155])\n by smtp4 (Coremail) with SMTP id HNxpCgBXekNcuCJfZo1vIA--.3698S4;\n Thu, 30 Jul 2020 20:09:02 +0800 (CST)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=163.com;\n s=s110527; h=From:Subject:Date:Message-Id:MIME-Version; bh=QmRC5\n GXh3xemHC43lm06RloUCxVu8+cRnAdujpGeuoc=; b=HnIFCRw/avrWWeKMcI8KO\n 5zmuHpX/SjOrhFQaLUq5/ByxiToL8rq6xizh3tDkar9jBzm4Cyqtt6i62ie9Ien9\n lYsJEgpcFY2HNfSGd9uPo9hqEFp2KQ1eW5v57814hECeXt7WMaD6JI1E4U66UpLH\n P8pz48k5TT15y/5sNgkx9E=",
        "From": "yang_y_yi@163.com",
        "To": "dev@dpdk.org",
        "Cc": "jiayu.hu@intel.com, thomas@monjalon.net, yangyi01@inspur.com,\n yang_y_yi@163.com",
        "Date": "Thu, 30 Jul 2020 20:08:59 +0800",
        "Message-Id": "<20200730120900.108232-3-yang_y_yi@163.com>",
        "X-Mailer": "git-send-email 2.19.2.windows.1",
        "In-Reply-To": "<20200730120900.108232-1-yang_y_yi@163.com>",
        "References": "<20200730120900.108232-1-yang_y_yi@163.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "X-CM-TRANSID": "HNxpCgBXekNcuCJfZo1vIA--.3698S4",
        "X-Coremail-Antispam": "1Uf129KBjvJXoW3Ww1fCr18CFy5KFyfuF47XFb_yoW3Cw4fpF\n srCryjkrs8JF48uFs7Jr4Sqrn3KFWkKay7KrWkJ34F9F1YqryvqFWFka48Zr1YgrWkCrZF\n vF4kJa47Ga18CwUanT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2\n 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x07jsManUUUUU=",
        "X-Originating-IP": "[61.48.210.155]",
        "X-CM-SenderInfo": "51dqwsp1b1xqqrwthudrp/1tbiqBBxi1c7RBg7zAAAsF",
        "Subject": "[dpdk-dev] [PATCH V1 2/3] mbuf: change free_cb interface to adapt\n\tto GSO case",
        "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 <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",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "From: Yi Yang <yangyi01@inspur.com>\n\nIn GSO case, segmented mbufs are attached to original\nmbuf which can't be freed when it is external. The issue\nis free_cb doesn't know original mbuf and doesn't free\nit when refcnt of shinfo is 0.\n\nOriginal mbuf can be freed by rte_pktmbuf_free segmented\nmbufs or by rte_pktmbuf_free original mbuf. Two kind of\ncases should have different behaviors. free_cb won't\nexplicitly call rte_pktmbuf_free to free original mbuf\nif it is freed by rte_pktmbuf_free original mbuf, but it\nhas to call rte_pktmbuf_free to free original mbuf if it\nis freed by rte_pktmbuf_free segmented mbufs.\n\nIn order to fix this issue, free_cb interface has to been\nchanged, __rte_pktmbuf_free_extbuf must deliver called\nmbuf pointer to free_cb, argument opaque can be defined\nas a custom struct by user, it can includes original mbuf\npointer, user-defined free_cb can compare caller mbuf with\nmbuf in opaque struct, free_cb should free original mbuf\nif they are not same, this corresponds to rte_pktmbuf_free\nsegmented mbufs case, otherwise, free_cb won't free original\nmbuf because the caller explicitly called rte_pktmbuf_free\nto free it.\n\nHere is pseduo code to show two kind of cases.\n\ncase 1. rte_pktmbuf_free segmented mbufs\n\nnb_tx = rte_gso_segment(original_mbuf, /* original mbuf */\n                      &gso_ctx,\n                      /* segmented mbuf */\n                      (struct rte_mbuf **)&gso_mbufs,\n                      MAX_GSO_MBUFS);\nrte_eth_tx_burst(dev->port_id, qid, gso_mbufs, nb_tx);\n\ncase 2. rte_pktmbuf_free original mbuf\n\nrte_eth_tx_burst(dev->port_id, qid, original_mbuf, 1);\n\nHere are user defined free_cb and opaque.\n\nstruct shinfo_arg {\n\tvoid *buf;\n\tstruct rte_mbuf *mbuf;\n};\n\ncustom_free_cb(struct rte_mbuf *caller_m, void *opaque)\n{\n\tstruct shinfo_arg *arg = (struct shinfo_arg *)opaque;\n\n\trte_free(arg->buf);\n\tif (caller_m != arg->mbuf)\n\t\trte_pktmbuf_free(arg->mbuf);\n\trte_free(arg);\n}\n\nstruct shinfo_arg *arg = (struct shinfo_arg *)\nrte_malloc(NULL, sizeof(struct shinfo_arg),\n\t   RTE_CACHE_LINE_SIZE);\n\narg->buf = buf;\narg->mbuf = pkt;\nshinfo->free_cb = custom_free_cb;\nshinfo->fcb_opaque = arg;\n\nSigned-off-by: Yi Yang <yangyi01@inspur.com>\n---\n app/test-compress-perf/comp_perf_test_common.c | 2 +-\n app/test/test_compressdev.c                    | 2 +-\n app/test/test_mbuf.c                           | 2 +-\n drivers/net/mlx5/mlx5_rxtx.c                   | 2 +-\n drivers/net/mlx5/mlx5_rxtx.h                   | 2 +-\n drivers/net/netvsc/hn_rxtx.c                   | 3 ++-\n lib/librte_mbuf/rte_mbuf.c                     | 4 ++--\n lib/librte_mbuf/rte_mbuf.h                     | 2 +-\n lib/librte_mbuf/rte_mbuf_core.h                | 2 +-\n lib/librte_vhost/virtio_net.c                  | 2 +-\n 10 files changed, 12 insertions(+), 11 deletions(-)",
    "diff": "diff --git a/app/test-compress-perf/comp_perf_test_common.c b/app/test-compress-perf/comp_perf_test_common.c\nindex b402a0d..b1eb733 100644\n--- a/app/test-compress-perf/comp_perf_test_common.c\n+++ b/app/test-compress-perf/comp_perf_test_common.c\n@@ -115,7 +115,7 @@ struct cperf_buffer_info {\n }\n \n static void\n-comp_perf_extbuf_free_cb(void *addr __rte_unused, void *opaque __rte_unused)\n+comp_perf_extbuf_free_cb(struct rte_mbuf *m __rte_unused, void *opaque __rte_unused)\n {\n }\n \ndiff --git a/app/test/test_compressdev.c b/app/test/test_compressdev.c\nindex 0571c17..a4a5d7c 100644\n--- a/app/test/test_compressdev.c\n+++ b/app/test/test_compressdev.c\n@@ -778,7 +778,7 @@ struct test_private_arrays {\n }\n \n static void\n-extbuf_free_callback(void *addr __rte_unused, void *opaque __rte_unused)\n+extbuf_free_callback(struct rte_mbuf *m __rte_unused, void *opaque __rte_unused)\n {\n }\n \ndiff --git a/app/test/test_mbuf.c b/app/test/test_mbuf.c\nindex 06e44f0..f9e5ca5 100644\n--- a/app/test/test_mbuf.c\n+++ b/app/test/test_mbuf.c\n@@ -2300,7 +2300,7 @@ struct test_case {\n \n /* Define a free call back function to be used for external buffer */\n static void\n-ext_buf_free_callback_fn(void *addr __rte_unused, void *opaque)\n+ext_buf_free_callback_fn(struct rte_mbuf *caller_m __rte_unused, void *opaque)\n {\n \tvoid *ext_buf_addr = opaque;\n \ndiff --git a/drivers/net/mlx5/mlx5_rxtx.c b/drivers/net/mlx5/mlx5_rxtx.c\nindex 3eb0243..f084488 100644\n--- a/drivers/net/mlx5/mlx5_rxtx.c\n+++ b/drivers/net/mlx5/mlx5_rxtx.c\n@@ -1622,7 +1622,7 @@ enum mlx5_txcmp_code {\n }\n \n void\n-mlx5_mprq_buf_free_cb(void *addr __rte_unused, void *opaque)\n+mlx5_mprq_buf_free_cb(struct rte_mbuf *caller_m __rte_unused, void *opaque)\n {\n \tstruct mlx5_mprq_buf *buf = opaque;\n \ndiff --git a/drivers/net/mlx5/mlx5_rxtx.h b/drivers/net/mlx5/mlx5_rxtx.h\nindex c02a007..8c230c6 100644\n--- a/drivers/net/mlx5/mlx5_rxtx.h\n+++ b/drivers/net/mlx5/mlx5_rxtx.h\n@@ -499,7 +499,7 @@ struct mlx5_txq_ctrl *mlx5_txq_hairpin_new\n uint16_t mlx5_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n);\n void mlx5_rxq_initialize(struct mlx5_rxq_data *rxq);\n __rte_noinline int mlx5_rx_err_handle(struct mlx5_rxq_data *rxq, uint8_t vec);\n-void mlx5_mprq_buf_free_cb(void *addr, void *opaque);\n+void mlx5_mprq_buf_free_cb(struct rte_mbuf *caller_m, void *opaque);\n void mlx5_mprq_buf_free(struct mlx5_mprq_buf *buf);\n uint16_t mlx5_rx_burst_mprq(void *dpdk_rxq, struct rte_mbuf **pkts,\n \t\t\t    uint16_t pkts_n);\ndiff --git a/drivers/net/netvsc/hn_rxtx.c b/drivers/net/netvsc/hn_rxtx.c\nindex 86a4c0d..30af404 100644\n--- a/drivers/net/netvsc/hn_rxtx.c\n+++ b/drivers/net/netvsc/hn_rxtx.c\n@@ -519,7 +519,8 @@ int hn_dev_tx_descriptor_status(void *arg, uint16_t offset)\n \treturn 0;\n }\n \n-static void hn_rx_buf_free_cb(void *buf __rte_unused, void *opaque)\n+static void hn_rx_buf_free_cb(struct rte_mbuf *caller_m __rte_unused,\n+\t\t\t      void *opaque)\n {\n \tstruct hn_rx_bufinfo *rxb = opaque;\n \tstruct hn_data *hv = rxb->hv;\ndiff --git a/lib/librte_mbuf/rte_mbuf.c b/lib/librte_mbuf/rte_mbuf.c\nindex 8a456e5..52445b3 100644\n--- a/lib/librte_mbuf/rte_mbuf.c\n+++ b/lib/librte_mbuf/rte_mbuf.c\n@@ -118,11 +118,11 @@\n  * buffer.\n  */\n static void\n-rte_pktmbuf_free_pinned_extmem(void *addr, void *opaque)\n+rte_pktmbuf_free_pinned_extmem(struct rte_mbuf *caller_m, void *opaque)\n {\n \tstruct rte_mbuf *m = opaque;\n \n-\tRTE_SET_USED(addr);\n+\tRTE_SET_USED(caller_m);\n \tRTE_ASSERT(RTE_MBUF_HAS_EXTBUF(m));\n \tRTE_ASSERT(RTE_MBUF_HAS_PINNED_EXTBUF(m));\n \tRTE_ASSERT(m->shinfo->fcb_opaque == m);\ndiff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h\nindex 7259575..5f8626f 100644\n--- a/lib/librte_mbuf/rte_mbuf.h\n+++ b/lib/librte_mbuf/rte_mbuf.h\n@@ -1193,7 +1193,7 @@ static inline void rte_pktmbuf_attach(struct rte_mbuf *mi, struct rte_mbuf *m)\n \tRTE_ASSERT(m->shinfo != NULL);\n \n \tif (rte_mbuf_ext_refcnt_update(m->shinfo, -1) == 0)\n-\t\tm->shinfo->free_cb(m->buf_addr, m->shinfo->fcb_opaque);\n+\t\tm->shinfo->free_cb(m, m->shinfo->fcb_opaque);\n }\n \n /**\ndiff --git a/lib/librte_mbuf/rte_mbuf_core.h b/lib/librte_mbuf/rte_mbuf_core.h\nindex 8cd7137..d194429 100644\n--- a/lib/librte_mbuf/rte_mbuf_core.h\n+++ b/lib/librte_mbuf/rte_mbuf_core.h\n@@ -671,7 +671,7 @@ struct rte_mbuf {\n /**\n  * Function typedef of callback to free externally attached buffer.\n  */\n-typedef void (*rte_mbuf_extbuf_free_callback_t)(void *addr, void *opaque);\n+typedef void (*rte_mbuf_extbuf_free_callback_t)(struct rte_mbuf *, void *);\n \n /**\n  * Shared data at the end of an external buffer.\ndiff --git a/lib/librte_vhost/virtio_net.c b/lib/librte_vhost/virtio_net.c\nindex 95a0bc1..e663fd4 100644\n--- a/lib/librte_vhost/virtio_net.c\n+++ b/lib/librte_vhost/virtio_net.c\n@@ -2137,7 +2137,7 @@ uint16_t rte_vhost_poll_enqueue_completed(int vid, uint16_t queue_id,\n }\n \n static void\n-virtio_dev_extbuf_free(void *addr __rte_unused, void *opaque)\n+virtio_dev_extbuf_free(struct rte_mbuf * caller_m __rte_unused, void *opaque)\n {\n \trte_free(opaque);\n }\n",
    "prefixes": [
        "V1",
        "2/3"
    ]
}