Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/75035/?format=api
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" ] }{ "id": 75035, "url": "