From patchwork Mon Sep 30 15:27:16 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Hemminger X-Patchwork-Id: 60233 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 1DB021BEB1; Mon, 30 Sep 2019 17:27:35 +0200 (CEST) Received: from mail-pl1-f196.google.com (mail-pl1-f196.google.com [209.85.214.196]) by dpdk.org (Postfix) with ESMTP id A6CC51BE9D for ; Mon, 30 Sep 2019 17:27:30 +0200 (CEST) Received: by mail-pl1-f196.google.com with SMTP id s17so4045599plp.6 for ; Mon, 30 Sep 2019 08:27:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=networkplumber-org.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Q4INw0jXclEiki3qquDLRi7spTdZl6ftU0aD9i1ySi8=; b=fffF5NlXGSn262QLzQyP/YZPiWgO02Y2DOmV8cXBDlqRyeGNwDRhobAjBY6JwR99SU Vo7XP0P89egS6G4JoYUfw6iW2kDJHELCp/WM1l603wZlCFlp9G3c5R8VWgf7kCDe33JV ngpjRoG5p/bbutwobYK7Wqa7ePlUbq97fpercDg/ZDYqjGY3x59LsJ3UVipvjw6znmgV sx33CSGNsNHwcN4m8EpO9wIJrf1NkcHQLf1L2hlUPfuXn4SQqlSjY9WBAyshiHl9KXnt KnYsgFC/cIwVtRmVGNk7QXfQR2La8zLqn1lOoBZsa9lCVNhrqtsgBNLBKjTLnoAQHCUt fZGQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Q4INw0jXclEiki3qquDLRi7spTdZl6ftU0aD9i1ySi8=; b=q/vtgbJ0dJN3KTunOcdZMaj0X5nh/fEn509U6x5RtJvHPzJYt4OTlFg825sxdC8xFP dttmlh81inh3oilTavDcVydh7PlSqII479gbvOhBAePGCh0MKqm5e6kyMKMB1e9WqVUi Wc2NfA5WtTJbC2X3CjsrGaDYSWKgQ52u8ggC8k0zC1LUrvgvwfhX7nzH2UO6LzylMCcr bFVsjgHfvh+K6pZ6uOrdzxDIcXe8PnXUuVkNHtusfQV6kE31VCfoaIGbrhjVRaEAQ7J8 5cU/GYvyUaRTz7iCiJOgnhDDZJ7WG9TkREmd/sFtywFiCCP4AkY4FwcsVOFYymmw9NTq AJtg== X-Gm-Message-State: APjAAAXRpOONN53Q+uPrOzBPT+40yRb3EbLBm7FOFz63t3MhNG3lcygi tRdo/kZOmPId+36hftTYc0fOktPItM4= X-Google-Smtp-Source: APXvYqxH3BQBjtkgZnum0EWWcAtRnokACkICjRMuCyugYgcaqpoXhvW/wdcE0gvyRTn/pcuG4S/LPg== X-Received: by 2002:a17:902:6545:: with SMTP id d5mr21213858pln.333.1569857249649; Mon, 30 Sep 2019 08:27:29 -0700 (PDT) Received: from hermes.lan (204-195-22-127.wavecable.com. [204.195.22.127]) by smtp.gmail.com with ESMTPSA id w14sm30521021pge.56.2019.09.30.08.27.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 30 Sep 2019 08:27:28 -0700 (PDT) From: Stephen Hemminger To: dev@dpdk.org Cc: Stephen Hemminger Date: Mon, 30 Sep 2019 08:27:16 -0700 Message-Id: <20190930152721.8029-2-stephen@networkplumber.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190930152721.8029-1-stephen@networkplumber.org> References: <20190928003758.18489-1-stephen@networkplumber.org> <20190930152721.8029-1-stephen@networkplumber.org> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v2 1/6] mbuf: don't generate invalid mbuf in clone test X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" The test for cloning changed mbuf would generate an mbuf whose length and segments were invalid. This would cause a crash if test was run with mbuf debugging enabled. Fixes: f1022aba76a5 ("app/test: rename mbuf variable") Signed-off-by: Stephen Hemminger --- app/test/test_mbuf.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/test/test_mbuf.c b/app/test/test_mbuf.c index 2a97afe2044a..aafad0cf6206 100644 --- a/app/test/test_mbuf.c +++ b/app/test/test_mbuf.c @@ -332,8 +332,11 @@ testclone_testupdate_testdetach(struct rte_mempool *pktmbuf_pool) m->next = rte_pktmbuf_alloc(pktmbuf_pool); if (m->next == NULL) GOTO_FAIL("Next Pkt Null\n"); + m->nb_segs = 2; rte_pktmbuf_append(m->next, sizeof(uint32_t)); + m->pkt_len = 2 * sizeof(uint32_t); + data = rte_pktmbuf_mtod(m->next, unaligned_uint32_t *); *data = MAGIC_DATA; From patchwork Mon Sep 30 15:27:17 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Hemminger X-Patchwork-Id: 60234 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id E5FD01BECC; Mon, 30 Sep 2019 17:27:37 +0200 (CEST) Received: from mail-pl1-f194.google.com (mail-pl1-f194.google.com [209.85.214.194]) by dpdk.org (Postfix) with ESMTP id 077351BE9C for ; Mon, 30 Sep 2019 17:27:31 +0200 (CEST) Received: by mail-pl1-f194.google.com with SMTP id e5so4042354pls.9 for ; Mon, 30 Sep 2019 08:27:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=networkplumber-org.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=gRflN8H9eElX6H7evRBTF7Kb/KaGOFgABWhGCuz163Y=; b=fSIn+IcqONwmPLsJ5hCNKfAnrU5Nt4EmnwHOapCBl+bickLfs2iBdIf64tIUsZml09 aOfzt8+rwjXGUJc8NEQTehSo92/o/eWb7nOSXc3Lmwy8HImORdahTs7bTmC+0mJUkh0K pYKxJtOy2goYF0WIRMIa9bOiKHLV+LaFniQWn4wsEAeVv4vsWTWDyWASwSQrEnxaaqQZ Q770TukwInmt0i0eGvVeCxnnNEw4hV/frHo/pfhjFGpKdFJ6EB89Pgq0VB0DW3gB44KK 9jBFikv00a1JlO7HIcqg7iCfwsBPPhhZpbgwzYUImFGYJH2tLdD/S73W/Xh8X51pKHR8 IuSA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=gRflN8H9eElX6H7evRBTF7Kb/KaGOFgABWhGCuz163Y=; b=qUMif+AGaGpWMBd+mTzDEqRRjrr7IeHqNdEbrToOmWOLw5S1TLKzwXjLjPFC9KHh0b bsIB7cMCtqZkfZUmFtvbWgpBs3gQy3rrm5uKmf5FM4Ji3bjOjA2/DpawgphHUzzL9BNx iYkN6EqgN+GCd2vzxF+Extyha+nHSiV7jVXBu+V1jZPpKGiIkbjn8MzUG5E1qC/zS54n XWGUP/ZIy3gAVMpAT37KpoNQ3rd7hXx4jTvj8X943oXi/SBoEzjRZtB7e0qcQUL0ocp5 7SBzDLg8ToAKPOPFPuJxN/5Q++GUwS+LnReOVFf2Wk0POzgdBI746DC7D91mQK902IMh NEgg== X-Gm-Message-State: APjAAAW/wJ7tQ4+AKRcdSiG3eGtHrqPiKnqCKcy374S3F3oATd3dARi/ PuNYaP/bCpx8Am5wJ5BXazxV71iYU+E= X-Google-Smtp-Source: APXvYqzv77gjgLV+EUp75B2c1/eK9Crc3J0KO628JLrNdSpt+hAZh9GyWAF2c/qutOCkwnIW/aYudA== X-Received: by 2002:a17:902:7045:: with SMTP id h5mr20458784plt.161.1569857250798; Mon, 30 Sep 2019 08:27:30 -0700 (PDT) Received: from hermes.lan (204-195-22-127.wavecable.com. [204.195.22.127]) by smtp.gmail.com with ESMTPSA id w14sm30521021pge.56.2019.09.30.08.27.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 30 Sep 2019 08:27:29 -0700 (PDT) From: Stephen Hemminger To: dev@dpdk.org Cc: Stephen Hemminger Date: Mon, 30 Sep 2019 08:27:17 -0700 Message-Id: <20190930152721.8029-3-stephen@networkplumber.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190930152721.8029-1-stephen@networkplumber.org> References: <20190928003758.18489-1-stephen@networkplumber.org> <20190930152721.8029-1-stephen@networkplumber.org> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v2 2/6] mbuf: delinline rte_pktmbuf_linearize X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" This function is too big to be put inline. The places it is used are only in special exception paths where a highly fragmented mbuf arrives at a device that can't handle it. Signed-off-by: Stephen Hemminger --- lib/librte_mbuf/rte_mbuf.c | 40 ++++++++++++++++++++++++++++ lib/librte_mbuf/rte_mbuf.h | 40 ++-------------------------- lib/librte_mbuf/rte_mbuf_version.map | 6 +++++ 3 files changed, 48 insertions(+), 38 deletions(-) diff --git a/lib/librte_mbuf/rte_mbuf.c b/lib/librte_mbuf/rte_mbuf.c index 37718d49c148..922bce6f0f93 100644 --- a/lib/librte_mbuf/rte_mbuf.c +++ b/lib/librte_mbuf/rte_mbuf.c @@ -245,6 +245,46 @@ int rte_mbuf_check(const struct rte_mbuf *m, int is_header, return 0; } +/* convert multi-segment mbuf to single mbuf */ +int +rte_pktmbuf_linearize(struct rte_mbuf *mbuf) +{ + size_t seg_len, copy_len; + struct rte_mbuf *m; + struct rte_mbuf *m_next; + char *buffer; + + if (rte_pktmbuf_is_contiguous(mbuf)) + return 0; + + /* Extend first segment to the total packet length */ + copy_len = rte_pktmbuf_pkt_len(mbuf) - rte_pktmbuf_data_len(mbuf); + + if (unlikely(copy_len > rte_pktmbuf_tailroom(mbuf))) + return -1; + + buffer = rte_pktmbuf_mtod_offset(mbuf, char *, mbuf->data_len); + mbuf->data_len = (uint16_t)(mbuf->pkt_len); + + /* Append data from next segments to the first one */ + m = mbuf->next; + while (m != NULL) { + m_next = m->next; + + seg_len = rte_pktmbuf_data_len(m); + rte_memcpy(buffer, rte_pktmbuf_mtod(m, char *), seg_len); + buffer += seg_len; + + rte_pktmbuf_free_seg(m); + m = m_next; + } + + mbuf->next = NULL; + mbuf->nb_segs = 1; + + return 0; +} + /* dump a mbuf on console */ void rte_pktmbuf_dump(FILE *f, const struct rte_mbuf *m, unsigned dump_len) diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h index 98225ec80bf1..d25356b58cba 100644 --- a/lib/librte_mbuf/rte_mbuf.h +++ b/lib/librte_mbuf/rte_mbuf.h @@ -2412,44 +2412,8 @@ rte_validate_tx_offload(const struct rte_mbuf *m) * - 0, on success * - -1, on error */ -static inline int -rte_pktmbuf_linearize(struct rte_mbuf *mbuf) -{ - size_t seg_len, copy_len; - struct rte_mbuf *m; - struct rte_mbuf *m_next; - char *buffer; - - if (rte_pktmbuf_is_contiguous(mbuf)) - return 0; - - /* Extend first segment to the total packet length */ - copy_len = rte_pktmbuf_pkt_len(mbuf) - rte_pktmbuf_data_len(mbuf); - - if (unlikely(copy_len > rte_pktmbuf_tailroom(mbuf))) - return -1; - - buffer = rte_pktmbuf_mtod_offset(mbuf, char *, mbuf->data_len); - mbuf->data_len = (uint16_t)(mbuf->pkt_len); - - /* Append data from next segments to the first one */ - m = mbuf->next; - while (m != NULL) { - m_next = m->next; - - seg_len = rte_pktmbuf_data_len(m); - rte_memcpy(buffer, rte_pktmbuf_mtod(m, char *), seg_len); - buffer += seg_len; - - rte_pktmbuf_free_seg(m); - m = m_next; - } - - mbuf->next = NULL; - mbuf->nb_segs = 1; - - return 0; -} +int +rte_pktmbuf_linearize(struct rte_mbuf *mbuf); /** * Dump an mbuf structure to a file. diff --git a/lib/librte_mbuf/rte_mbuf_version.map b/lib/librte_mbuf/rte_mbuf_version.map index 2662a37bf674..528681ba263a 100644 --- a/lib/librte_mbuf/rte_mbuf_version.map +++ b/lib/librte_mbuf/rte_mbuf_version.map @@ -46,6 +46,12 @@ DPDK_18.08 { rte_pktmbuf_pool_create_by_ops; } DPDK_16.11; +DPDK_19.11 { + global: + + rte_pktmbuf_linearize; +} DPDK_18.08; + EXPERIMENTAL { global: From patchwork Mon Sep 30 15:27:18 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Hemminger X-Patchwork-Id: 60235 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id A599D1BED7; Mon, 30 Sep 2019 17:27:39 +0200 (CEST) Received: from mail-pl1-f194.google.com (mail-pl1-f194.google.com [209.85.214.194]) by dpdk.org (Postfix) with ESMTP id 69B571BEA6 for ; Mon, 30 Sep 2019 17:27:33 +0200 (CEST) Received: by mail-pl1-f194.google.com with SMTP id d22so4057606pls.0 for ; Mon, 30 Sep 2019 08:27:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=networkplumber-org.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=otLljKJLik2d6Cq1uFOqCw0v1a/DuGc5nPCEEs/IOzM=; b=MFA25/EMs8nx36Ph0c3yUeycgRFQMNpWJ0uTLRpWhnl5/9ZXtafOwlg8FCX0j+UUGD DkV5FhDH3RCJABbNUJKPiBDN0yZ0qA58fXz2zpTlDKfYGnzmA8tbk49vXf08or9riVdC X+bwFvbdyFUJXVUy9BwU4VMecOOLaOlYUcD4+fwy1z2JQ9JlX8OlChN+1mAY5/WxZS3E I9usDD4kSHpf1YnuKMf91mhtNghaps+BG55o7zza3TS3xgPBea/tbfz+aXnZp0rozWoM j99ebbZ80k5G9fU6RFT3GSeq/qRYhi0OjnqjDeS516o7paTSlk9yv6F6mWY11Kv8FgtX dU/w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=otLljKJLik2d6Cq1uFOqCw0v1a/DuGc5nPCEEs/IOzM=; b=WOYHG5M4RxoAuf2TWKd3+yHdJj/8d+OBjVbA6KMJDp7DxFr/f9Lrzw3y/IOgsF6O4e JX5aygz+PI+Vpmh2tCiTOLDUd/4NVqoW5OD6Hy3sVMB4vuGRMLDvVa/u91CcPlkOy0pX 0Bhj9+93cljQ7QnS6olI0lOyyTRL64+KxIGmkhdOhKsDIvomRZHbtf4JFr78nTiJWlT1 H7daa9jIkUdLZQN0gl0GEoaNsiFZ62zXL0tX5f/S06UFtlus/X6beOUzXE2zotPVWoU5 UxhuwheDe1OvJ/wqmL7TVykDUjuZzWc+odJB8zlyCDPEsb8BOsQIKjjhsF2y1u44PLWh j5NQ== X-Gm-Message-State: APjAAAUp0sEJYe5t4/xDhwW7qSfomSBl7DsKIUxW9ZP4i1HnaFve1pcG 2VEzm9qK6/Nh65V+TvEx5g8tGESuwCo= X-Google-Smtp-Source: APXvYqwe4FF3C2P3IQNh5fDFHfIgGtpvinhmY95E8QeqRH0/SXzWnLCRTtNtHMgRtJmIXnenzqZ+jA== X-Received: by 2002:a17:902:6b07:: with SMTP id o7mr11858899plk.44.1569857252278; Mon, 30 Sep 2019 08:27:32 -0700 (PDT) Received: from hermes.lan (204-195-22-127.wavecable.com. [204.195.22.127]) by smtp.gmail.com with ESMTPSA id w14sm30521021pge.56.2019.09.30.08.27.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 30 Sep 2019 08:27:31 -0700 (PDT) From: Stephen Hemminger To: dev@dpdk.org Cc: Stephen Hemminger Date: Mon, 30 Sep 2019 08:27:18 -0700 Message-Id: <20190930152721.8029-4-stephen@networkplumber.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190930152721.8029-1-stephen@networkplumber.org> References: <20190928003758.18489-1-stephen@networkplumber.org> <20190930152721.8029-1-stephen@networkplumber.org> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v2 3/6] mbuf: deinline rte_pktmbuf_clone X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Cloning mbufs requires allocations and iteration and therefore should not be an inline. Signed-off-by: Stephen Hemminger --- lib/librte_mbuf/rte_mbuf.c | 39 ++++++++++++++++++++++++++++ lib/librte_mbuf/rte_mbuf.h | 38 ++------------------------- lib/librte_mbuf/rte_mbuf_version.map | 1 + 3 files changed, 42 insertions(+), 36 deletions(-) diff --git a/lib/librte_mbuf/rte_mbuf.c b/lib/librte_mbuf/rte_mbuf.c index 922bce6f0f93..12d0258a120d 100644 --- a/lib/librte_mbuf/rte_mbuf.c +++ b/lib/librte_mbuf/rte_mbuf.c @@ -245,6 +245,45 @@ int rte_mbuf_check(const struct rte_mbuf *m, int is_header, return 0; } +/* Creates a shallow copy of mbuf */ +struct rte_mbuf * +rte_pktmbuf_clone(struct rte_mbuf *md, struct rte_mempool *mp) +{ + struct rte_mbuf *mc, *mi, **prev; + uint32_t pktlen; + uint16_t nseg; + + mc = rte_pktmbuf_alloc(mp); + if (unlikely(mc == NULL)) + return NULL; + + mi = mc; + prev = &mi->next; + pktlen = md->pkt_len; + nseg = 0; + + do { + nseg++; + rte_pktmbuf_attach(mi, md); + *prev = mi; + prev = &mi->next; + } while ((md = md->next) != NULL && + (mi = rte_pktmbuf_alloc(mp)) != NULL); + + *prev = NULL; + mc->nb_segs = nseg; + mc->pkt_len = pktlen; + + /* Allocation of new indirect segment failed */ + if (unlikely(mi == NULL)) { + rte_pktmbuf_free(mc); + return NULL; + } + + __rte_mbuf_sanity_check(mc, 1); + return mc; +} + /* convert multi-segment mbuf to single mbuf */ int rte_pktmbuf_linearize(struct rte_mbuf *mbuf) diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h index d25356b58cba..a6e78e4ea7a6 100644 --- a/lib/librte_mbuf/rte_mbuf.h +++ b/lib/librte_mbuf/rte_mbuf.h @@ -1924,42 +1924,8 @@ static inline void rte_pktmbuf_free(struct rte_mbuf *m) * - The pointer to the new "clone" mbuf on success. * - NULL if allocation fails. */ -static inline struct rte_mbuf *rte_pktmbuf_clone(struct rte_mbuf *md, - struct rte_mempool *mp) -{ - struct rte_mbuf *mc, *mi, **prev; - uint32_t pktlen; - uint16_t nseg; - - if (unlikely ((mc = rte_pktmbuf_alloc(mp)) == NULL)) - return NULL; - - mi = mc; - prev = &mi->next; - pktlen = md->pkt_len; - nseg = 0; - - do { - nseg++; - rte_pktmbuf_attach(mi, md); - *prev = mi; - prev = &mi->next; - } while ((md = md->next) != NULL && - (mi = rte_pktmbuf_alloc(mp)) != NULL); - - *prev = NULL; - mc->nb_segs = nseg; - mc->pkt_len = pktlen; - - /* Allocation of new indirect segment failed */ - if (unlikely (mi == NULL)) { - rte_pktmbuf_free(mc); - return NULL; - } - - __rte_mbuf_sanity_check(mc, 1); - return mc; -} +struct rte_mbuf * +rte_pktmbuf_clone(struct rte_mbuf *md, struct rte_mempool *mp); /** * Adds given value to the refcnt of all packet mbuf segments. diff --git a/lib/librte_mbuf/rte_mbuf_version.map b/lib/librte_mbuf/rte_mbuf_version.map index 528681ba263a..aeec3f90f3fe 100644 --- a/lib/librte_mbuf/rte_mbuf_version.map +++ b/lib/librte_mbuf/rte_mbuf_version.map @@ -49,6 +49,7 @@ DPDK_18.08 { DPDK_19.11 { global: + rte_pktmbuf_clone; rte_pktmbuf_linearize; } DPDK_18.08; From patchwork Mon Sep 30 15:27:19 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Hemminger X-Patchwork-Id: 60236 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id DD9AE1BEDD; Mon, 30 Sep 2019 17:27:41 +0200 (CEST) Received: from mail-pf1-f195.google.com (mail-pf1-f195.google.com [209.85.210.195]) by dpdk.org (Postfix) with ESMTP id E6CA11BEAD for ; Mon, 30 Sep 2019 17:27:34 +0200 (CEST) Received: by mail-pf1-f195.google.com with SMTP id y22so5822144pfr.3 for ; Mon, 30 Sep 2019 08:27:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=networkplumber-org.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=00Vzr/C5heiPvoqwsahNL1dLUjUkGiVfyZ2wgTuDXzo=; b=QWBm9L/ez/fCcMI2VDE8mdR09PUbtEfmyvAdl+gadccfun6RdBXNdgwnDzpqYvSH4X rcWer+xgjx1/Umj5jCGRBkGl0DzKeYKf+NJcsDXLr1AEhAgutUVbIaHcT/sh4WGuO/Qs v5TpAxZwEdIwMDbaCv7RnK9SqtgGv6pxND+7ffT2swn1YjX0lNZk7zHxUqMmgrSWpeYO j3c9moT0VKr/J0Q0vAhlNp9Qqf38SDpaT/Zyc86SKwirgaVVesDtAxZvrdK3+ZgJM1CC 43tZVXX7+ARwWf3NVzlYNuidexb0HBedK3I5rKutNAiKXDo89CKFvuST0QvQ/AVqyj1t EmfA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=00Vzr/C5heiPvoqwsahNL1dLUjUkGiVfyZ2wgTuDXzo=; b=Raq/5rrJdaVABQLgfQzVGcQ0ojgXscnJrMGyxWNZy8rXvwEL9cF9FKfxX/oCgwcRlF 2vgaCUrNTEeRYlDkczpj7Df6T/oP/iJKDoLS+zGxmE+d2FaTVzIdUpXvnVdH3kvpAXYx Gkk0QXca3rKN3IT+jmYhPGOQakvlhdPwi9/+xjyFe5aNh/KMjZ2GDcWwByhw6V96dH7z nAe0n8a+LnQRXfE7kJZrZUlPJJxu6m9Z1FmTwTQZits2gQEtQdG2J3+LiXW6ffxCdpzD Z4Q0IIxshfXBpbLEPjz+3CyFubJpbywlyqxKWdvz+qrlTOW1iFe4p+Yv3wTNiCIta8pi 34GQ== X-Gm-Message-State: APjAAAV2duovrLoJWXCaYTVKcLnS8gATFHF4fjuuazcr/UeQAaT73sGm 8j6fp+OQGgNOcHzK7OzjGR127sbWtdg= X-Google-Smtp-Source: APXvYqw0Ww2PS22eYiIwf/xbUWyOIjJzP5BIm2KpMewpd5eTdb3wzXadc3FPjGglcDcU5nqtLoT5RA== X-Received: by 2002:a17:90b:903:: with SMTP id bo3mr27236045pjb.52.1569857253481; Mon, 30 Sep 2019 08:27:33 -0700 (PDT) Received: from hermes.lan (204-195-22-127.wavecable.com. [204.195.22.127]) by smtp.gmail.com with ESMTPSA id w14sm30521021pge.56.2019.09.30.08.27.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 30 Sep 2019 08:27:32 -0700 (PDT) From: Stephen Hemminger To: dev@dpdk.org Cc: Stephen Hemminger Date: Mon, 30 Sep 2019 08:27:19 -0700 Message-Id: <20190930152721.8029-5-stephen@networkplumber.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190930152721.8029-1-stephen@networkplumber.org> References: <20190928003758.18489-1-stephen@networkplumber.org> <20190930152721.8029-1-stephen@networkplumber.org> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v2 4/6] mbuf: add a pktmbuf copy routine X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" This is a commonly used operation that surprisingly the DPDK has not supported. The new rte_pktmbuf_copy does a deep copy of packet. This is a complete copy including meta-data. It handles the case where the source mbuf comes from a pool with larger data area than the destination pool. The routine also has options for skipping data, or truncating at a fixed length. Signed-off-by: Stephen Hemminger --- lib/librte_mbuf/rte_mbuf.c | 70 ++++++++++++++++++++++++++++ lib/librte_mbuf/rte_mbuf.h | 26 +++++++++++ lib/librte_mbuf/rte_mbuf_version.map | 1 + 3 files changed, 97 insertions(+) diff --git a/lib/librte_mbuf/rte_mbuf.c b/lib/librte_mbuf/rte_mbuf.c index 12d0258a120d..6888d6bd5dfc 100644 --- a/lib/librte_mbuf/rte_mbuf.c +++ b/lib/librte_mbuf/rte_mbuf.c @@ -324,6 +324,76 @@ rte_pktmbuf_linearize(struct rte_mbuf *mbuf) return 0; } +/* Create a deep copy of mbuf */ +struct rte_mbuf * +rte_pktmbuf_copy(const struct rte_mbuf *m, struct rte_mempool *mp, + uint32_t off, uint32_t len) +{ + const struct rte_mbuf *seg = m; + struct rte_mbuf *mc, *m_last, **prev; + + if (unlikely(off >= m->pkt_len)) + return NULL; + + mc = rte_pktmbuf_alloc(mp); + if (unlikely(mc == NULL)) + return NULL; + + if (len > m->pkt_len - off) + len = m->pkt_len - off; + + /* clone meta data from original */ + mc->port = m->port; + mc->vlan_tci = m->vlan_tci; + mc->vlan_tci_outer = m->vlan_tci_outer; + mc->tx_offload = m->tx_offload; + mc->hash = m->hash; + mc->packet_type = m->packet_type; + mc->timestamp = m->timestamp; + + prev = &mc->next; + m_last = mc; + while (len > 0) { + uint32_t copy_len; + + while (off >= seg->data_len) { + off -= seg->data_len; + seg = seg->next; + } + + /* current buffer is full, chain a new one */ + if (rte_pktmbuf_tailroom(m_last) == 0) { + m_last = rte_pktmbuf_alloc(mp); + if (unlikely(m_last == NULL)) { + rte_pktmbuf_free(mc); + return NULL; + } + ++mc->nb_segs; + *prev = m_last; + prev = &m_last->next; + } + + copy_len = RTE_MIN(seg->data_len - off, len); + if (copy_len > rte_pktmbuf_tailroom(m_last)) + copy_len = rte_pktmbuf_tailroom(m_last); + + /* append from seg to m_last */ + rte_memcpy(rte_pktmbuf_mtod_offset(m_last, char *, + m_last->data_len), + rte_pktmbuf_mtod_offset(seg, char *, + off), + copy_len); + + m_last->data_len += copy_len; + mc->pkt_len += copy_len; + off += copy_len; + len -= copy_len; + } + + __rte_mbuf_sanity_check(mc, 1); + return mc; +} + /* dump a mbuf on console */ void rte_pktmbuf_dump(FILE *f, const struct rte_mbuf *m, unsigned dump_len) diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h index a6e78e4ea7a6..77266a07c75b 100644 --- a/lib/librte_mbuf/rte_mbuf.h +++ b/lib/librte_mbuf/rte_mbuf.h @@ -1927,6 +1927,32 @@ static inline void rte_pktmbuf_free(struct rte_mbuf *m) struct rte_mbuf * rte_pktmbuf_clone(struct rte_mbuf *md, struct rte_mempool *mp); +/** + * Creates a full copy of a given packet mbuf. + * + * Copies all the data from a given packet mbuf to a newly allocated + * set of mbufs. + * + * @param m + * The packet mbuf to be cloned. + * @param mp + * The mempool from which the "clone" mbufs are allocated. + * @param offset + * The number of bytes to skip before copying. + * If the mbuf does not have that many bytes, it is an error + * and NULL is returned. + * @param length + * The upper limit on bytes to copy. Passing UINT32_MAX + * means all data (after offset). + * @return + * - The pointer to the new "clone" mbuf on success. + * - NULL if allocation fails. + */ +__rte_experimental +struct rte_mbuf * +rte_pktmbuf_copy(const struct rte_mbuf *m, struct rte_mempool *mp, + uint32_t offset, uint32_t length); + /** * Adds given value to the refcnt of all packet mbuf segments. * diff --git a/lib/librte_mbuf/rte_mbuf_version.map b/lib/librte_mbuf/rte_mbuf_version.map index aeec3f90f3fe..f471bbcaa2df 100644 --- a/lib/librte_mbuf/rte_mbuf_version.map +++ b/lib/librte_mbuf/rte_mbuf_version.map @@ -57,4 +57,5 @@ EXPERIMENTAL { global: rte_mbuf_check; + rte_pktmbuf_copy; } DPDK_18.08; From patchwork Mon Sep 30 15:27:20 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Hemminger X-Patchwork-Id: 60237 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 15F251BEE5; Mon, 30 Sep 2019 17:27:44 +0200 (CEST) Received: from mail-pl1-f196.google.com (mail-pl1-f196.google.com [209.85.214.196]) by dpdk.org (Postfix) with ESMTP id 97EBF1BE9C for ; Mon, 30 Sep 2019 17:27:35 +0200 (CEST) Received: by mail-pl1-f196.google.com with SMTP id u20so4053789plq.4 for ; Mon, 30 Sep 2019 08:27:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=networkplumber-org.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=hnJVNme230AHorC9MqsxxOvVRW7V8JTUGHH+CXxU7nQ=; b=cuplx2MVSKsRVG6OFg/oujYxkQxoCtgr0/cSn5I+gwSrZ8wehSSaPQhqeAh3Hqp2AI oyQl7bFuSh05gpOSAKFXpyiH6f1BGj47Y8Z97W50UPPIPl19HpEiJ+U45UTr0sOId0Bt HTYkc1KqyGDpG8zAgdzft/HcZ/y0AdXjmyNRyR80uT2ThsrAZra/NHOMojVvgq9SV3ZI RWehd5iXyf2UY8AlvsjF9FWxV/MlQPzhiRAhpIJQ0yZIT+0wwIg+6zCpJE3C45cySs5g Ufoo5kINOxdZ0sjD4GFYp6pp3kNo9+mLZYRJtWLL6DC6VBVJD4hDns6WExk5Wpkbdn93 9VKw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=hnJVNme230AHorC9MqsxxOvVRW7V8JTUGHH+CXxU7nQ=; b=SY3plhNyP7kFSh2e7cQZYPB0f6xOxYmvOmGBK6C5IObIy+kzBE7cdBhFkzbLhEeYxt PPU5GzGRJF+0/ZricLWHaQuQPcAduPjiH+ZANuOZ2aIgdfj1O04iLV7rflA36csdACun rbIYaHsU/NzvROHLduOVo8NGtJhW/KuhS7rZBy79oix0p4zjUR+yP8YNQD2dHkV2bToM 3cdMfM1X6qu0f+0m6WOofcAlaVjBaArlbmHqaLCtbrMTXugUcC4MGTcyzOCTW4WNVBVJ 5+ZJfXWCmhCJO83AjriyEBGVr2yjSxI2cf+B3itevGcL5LnHTILTQzkJahELMH+BYWDI LEEw== X-Gm-Message-State: APjAAAVnHf6A9mIZYxNGyVz9K8cy68SC4uhP4/oPdxk6mP6p1krF1/98 YjDbGyAuQbqHct4GY2JdvMUjliqlDfc= X-Google-Smtp-Source: APXvYqy1TiZujz7ONJGtaC0x8AwgLAe1mFkiQsqZQd5JUjXVfXdTgFDMKcBzPGGkmOu286R6T3CA5g== X-Received: by 2002:a17:902:820f:: with SMTP id x15mr19823890pln.230.1569857254310; Mon, 30 Sep 2019 08:27:34 -0700 (PDT) Received: from hermes.lan (204-195-22-127.wavecable.com. [204.195.22.127]) by smtp.gmail.com with ESMTPSA id w14sm30521021pge.56.2019.09.30.08.27.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 30 Sep 2019 08:27:33 -0700 (PDT) From: Stephen Hemminger To: dev@dpdk.org Cc: Stephen Hemminger Date: Mon, 30 Sep 2019 08:27:20 -0700 Message-Id: <20190930152721.8029-6-stephen@networkplumber.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190930152721.8029-1-stephen@networkplumber.org> References: <20190928003758.18489-1-stephen@networkplumber.org> <20190930152721.8029-1-stephen@networkplumber.org> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v2 5/6] mbuf: add pktmbuf copy test X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" New test for rte_pktmbuf_copy based of the clone tests. Signed-off-by: Stephen Hemminger --- app/test/test_mbuf.c | 126 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) diff --git a/app/test/test_mbuf.c b/app/test/test_mbuf.c index aafad0cf6206..49c3a5f7893c 100644 --- a/app/test/test_mbuf.c +++ b/app/test/test_mbuf.c @@ -399,6 +399,127 @@ testclone_testupdate_testdetach(struct rte_mempool *pktmbuf_pool) return -1; } +static int +test_pktmbuf_copy(struct rte_mempool *pktmbuf_pool) +{ + struct rte_mbuf *m = NULL; + struct rte_mbuf *copy = NULL; + struct rte_mbuf *copy2 = NULL; + unaligned_uint32_t *data; + + /* alloc a mbuf */ + m = rte_pktmbuf_alloc(pktmbuf_pool); + if (m == NULL) + GOTO_FAIL("ooops not allocating mbuf"); + + if (rte_pktmbuf_pkt_len(m) != 0) + GOTO_FAIL("Bad length"); + + rte_pktmbuf_append(m, sizeof(uint32_t)); + data = rte_pktmbuf_mtod(m, unaligned_uint32_t *); + *data = MAGIC_DATA; + + /* copy the allocated mbuf */ + copy = rte_pktmbuf_copy(m, pktmbuf_pool, 0, UINT32_MAX); + if (copy == NULL) + GOTO_FAIL("cannot copy data\n"); + + if (rte_pktmbuf_pkt_len(copy) != sizeof(uint32_t)) + GOTO_FAIL("copy length incorrect\n"); + + if (rte_pktmbuf_data_len(copy) != sizeof(uint32_t)) + GOTO_FAIL("copy data length incorrect\n"); + + data = rte_pktmbuf_mtod(copy, unaligned_uint32_t *); + if (*data != MAGIC_DATA) + GOTO_FAIL("invalid data in copy\n"); + + /* free the copy */ + rte_pktmbuf_free(copy); + copy = NULL; + + /* same test with a chained mbuf */ + m->next = rte_pktmbuf_alloc(pktmbuf_pool); + if (m->next == NULL) + GOTO_FAIL("Next Pkt Null\n"); + m->nb_segs = 2; + + rte_pktmbuf_append(m->next, sizeof(uint32_t)); + m->pkt_len = 2 * sizeof(uint32_t); + data = rte_pktmbuf_mtod(m->next, unaligned_uint32_t *); + *data = MAGIC_DATA + 1; + + copy = rte_pktmbuf_copy(m, pktmbuf_pool, 0, UINT32_MAX); + if (copy == NULL) + GOTO_FAIL("cannot copy data\n"); + + if (rte_pktmbuf_pkt_len(copy) != 2 * sizeof(uint32_t)) + GOTO_FAIL("chain copy length incorrect\n"); + + if (rte_pktmbuf_data_len(copy) != 2 * sizeof(uint32_t)) + GOTO_FAIL("chain copy data length incorrect\n"); + + data = rte_pktmbuf_mtod(copy, unaligned_uint32_t *); + if (data[0] != MAGIC_DATA || data[1] != MAGIC_DATA + 1) + GOTO_FAIL("invalid data in copy\n"); + + rte_pktmbuf_free(copy2); + + /* test offset copy */ + copy2 = rte_pktmbuf_copy(copy, pktmbuf_pool, + sizeof(uint32_t), UINT32_MAX); + if (copy2 == NULL) + GOTO_FAIL("cannot copy the copy\n"); + + if (rte_pktmbuf_pkt_len(copy2) != sizeof(uint32_t)) + GOTO_FAIL("copy with offset, length incorrect\n"); + + if (rte_pktmbuf_data_len(copy2) != sizeof(uint32_t)) + GOTO_FAIL("copy with offset, data length incorrect\n"); + + data = rte_pktmbuf_mtod(copy2, unaligned_uint32_t *); + if (data[0] != MAGIC_DATA + 1) + GOTO_FAIL("copy with offset, invalid data\n"); + + rte_pktmbuf_free(copy2); + + /* test truncation copy */ + copy2 = rte_pktmbuf_copy(copy, pktmbuf_pool, + 0, sizeof(uint32_t)); + if (copy2 == NULL) + GOTO_FAIL("cannot copy the copy\n"); + + if (rte_pktmbuf_pkt_len(copy2) != sizeof(uint32_t)) + GOTO_FAIL("copy with truncate, length incorrect\n"); + + if (rte_pktmbuf_data_len(copy2) != sizeof(uint32_t)) + GOTO_FAIL("copy with truncate, data length incorrect\n"); + + data = rte_pktmbuf_mtod(copy2, unaligned_uint32_t *); + if (data[0] != MAGIC_DATA) + GOTO_FAIL("copy with truncate, invalid data\n"); + + /* free mbuf */ + rte_pktmbuf_free(m); + rte_pktmbuf_free(copy); + rte_pktmbuf_free(copy2); + + m = NULL; + copy = NULL; + copy2 = NULL; + printf("%s ok\n", __func__); + return 0; + +fail: + if (m) + rte_pktmbuf_free(m); + if (copy) + rte_pktmbuf_free(copy); + if (copy2) + rte_pktmbuf_free(copy2); + return -1; +} + static int test_attach_from_different_pool(struct rte_mempool *pktmbuf_pool, struct rte_mempool *pktmbuf_pool2) @@ -1203,6 +1324,11 @@ test_mbuf(void) goto err; } + if (test_pktmbuf_copy(pktmbuf_pool) < 0) { + printf("test_pktmbuf_copy() failed.\n"); + goto err; + } + if (test_attach_from_different_pool(pktmbuf_pool, pktmbuf_pool2) < 0) { printf("test_attach_from_different_pool() failed\n"); goto err; From patchwork Mon Sep 30 15:27:21 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Hemminger X-Patchwork-Id: 60238 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 7AD451BEEF; Mon, 30 Sep 2019 17:27:46 +0200 (CEST) Received: from mail-pg1-f195.google.com (mail-pg1-f195.google.com [209.85.215.195]) by dpdk.org (Postfix) with ESMTP id 369CB1BE9C for ; Mon, 30 Sep 2019 17:27:36 +0200 (CEST) Received: by mail-pg1-f195.google.com with SMTP id d26so2125604pgl.7 for ; Mon, 30 Sep 2019 08:27:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=networkplumber-org.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=zdsVTY0D8zVTp25c2Ag/LpUnnCKhJ2sj1djQsUGrXUo=; b=u7/FJOnDMRRb0pRFyBD85tBo3MRG0vufEgOwbeKy2whsNSzYlY/LXnuUbbupztuhch Q7xedtHmoQlEISS3INYHG6Wi38kxmdWzeohzg0tYEkkHs8KAaXNMSp3mQGEGX/7DG82I oqUQvgkDm3NdvL/pfqqwSZAxHKowmmMp63/KTjzUy3EY+VsybfvHTbKY6H7VY7b9hXbE fDHK8i7vbr0Vy5n7MnIkccS2rj7bLjSW9zwh8mPizEsyelJuQnbrUkx9IlKb8mqM7KKB PlvJdSwNztbJOdJj7+aH/yusz/RDIRom3ZKrSf9ereEKuiJLIwibr4f7/XUuVwnylB63 8Tzg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=zdsVTY0D8zVTp25c2Ag/LpUnnCKhJ2sj1djQsUGrXUo=; b=puHMBeOyvAD0ujbmfEYTlOwR7fzABL2LlKqayDv3eIjVY4XSyi/4RpT6cwOUPf4DMm 463QZC9xcAVJ5I14GzYnEIeDjGKnR0f/27jJHTs1FwnMU9klEmAc0Lwkm4kh+/8qBPm7 zjhtuM7+brN7d7Rdoo0MdlOPefdMm3mgs7jx36/VyXJ499gj6CzojrxEqN5bFYFkAnTn oDgG7rEvOMTcGZdfe5z0pKEkES9BMgYGzl6qmZ/JNI1fb9hWRiNHTh4iC7KPvxkCNeLv SG4O89BpyO7LC/6eUMp+TsAF8tr/r/JRYjDwqaje5NbG6Xl0ZSifGEYg15CESl5DnK/z vnkw== X-Gm-Message-State: APjAAAXIixU555/wCy2Fh2KRGZJy9yMsZaeHkFHLV7lFstY3nTQFccEe YZgU2ybjCwsrRn8Ex/HDzsCIbkSgwMI= X-Google-Smtp-Source: APXvYqwhB/v181bOpp+pg1gj15iaTgbJ4w0XQpq9Q4auDfasuWzRx3NAUqB1ORVz53iqOzu4HPhxvA== X-Received: by 2002:a17:90a:ae0e:: with SMTP id t14mr27325527pjq.48.1569857255050; Mon, 30 Sep 2019 08:27:35 -0700 (PDT) Received: from hermes.lan (204-195-22-127.wavecable.com. [204.195.22.127]) by smtp.gmail.com with ESMTPSA id w14sm30521021pge.56.2019.09.30.08.27.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 30 Sep 2019 08:27:34 -0700 (PDT) From: Stephen Hemminger To: dev@dpdk.org Cc: Stephen Hemminger Date: Mon, 30 Sep 2019 08:27:21 -0700 Message-Id: <20190930152721.8029-7-stephen@networkplumber.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190930152721.8029-1-stephen@networkplumber.org> References: <20190928003758.18489-1-stephen@networkplumber.org> <20190930152721.8029-1-stephen@networkplumber.org> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v2 6/6] pdump: use new pktmbuf copy function X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" The rte_pktmbuf_copy handles varying size mbuf pools correctly. Signed-off-by: Stephen Hemminger --- lib/librte_pdump/rte_pdump.c | 69 +----------------------------------- 1 file changed, 1 insertion(+), 68 deletions(-) diff --git a/lib/librte_pdump/rte_pdump.c b/lib/librte_pdump/rte_pdump.c index cd24dd010951..c665cf237f65 100644 --- a/lib/librte_pdump/rte_pdump.c +++ b/lib/librte_pdump/rte_pdump.c @@ -64,73 +64,6 @@ static struct pdump_rxtx_cbs { } rx_cbs[RTE_MAX_ETHPORTS][RTE_MAX_QUEUES_PER_PORT], tx_cbs[RTE_MAX_ETHPORTS][RTE_MAX_QUEUES_PER_PORT]; -static inline int -pdump_pktmbuf_copy_data(struct rte_mbuf *seg, const struct rte_mbuf *m) -{ - if (rte_pktmbuf_tailroom(seg) < m->data_len) { - RTE_LOG(ERR, PDUMP, - "User mempool: insufficient data_len of mbuf\n"); - return -EINVAL; - } - - seg->port = m->port; - seg->vlan_tci = m->vlan_tci; - seg->hash = m->hash; - seg->tx_offload = m->tx_offload; - seg->ol_flags = m->ol_flags; - seg->packet_type = m->packet_type; - seg->vlan_tci_outer = m->vlan_tci_outer; - seg->data_len = m->data_len; - seg->pkt_len = seg->data_len; - rte_memcpy(rte_pktmbuf_mtod(seg, void *), - rte_pktmbuf_mtod(m, void *), - rte_pktmbuf_data_len(seg)); - - return 0; -} - -static inline struct rte_mbuf * -pdump_pktmbuf_copy(struct rte_mbuf *m, struct rte_mempool *mp) -{ - struct rte_mbuf *m_dup, *seg, **prev; - uint32_t pktlen; - uint16_t nseg; - - m_dup = rte_pktmbuf_alloc(mp); - if (unlikely(m_dup == NULL)) - return NULL; - - seg = m_dup; - prev = &seg->next; - pktlen = m->pkt_len; - nseg = 0; - - do { - nseg++; - if (pdump_pktmbuf_copy_data(seg, m) < 0) { - if (seg != m_dup) - rte_pktmbuf_free_seg(seg); - rte_pktmbuf_free(m_dup); - return NULL; - } - *prev = seg; - prev = &seg->next; - } while ((m = m->next) != NULL && - (seg = rte_pktmbuf_alloc(mp)) != NULL); - - *prev = NULL; - m_dup->nb_segs = nseg; - m_dup->pkt_len = pktlen; - - /* Allocation of new indirect segment failed */ - if (unlikely(seg == NULL)) { - rte_pktmbuf_free(m_dup); - return NULL; - } - - __rte_mbuf_sanity_check(m_dup, 1); - return m_dup; -} static inline void pdump_copy(struct rte_mbuf **pkts, uint16_t nb_pkts, void *user_params) @@ -148,7 +81,7 @@ pdump_copy(struct rte_mbuf **pkts, uint16_t nb_pkts, void *user_params) ring = cbs->ring; mp = cbs->mp; for (i = 0; i < nb_pkts; i++) { - p = pdump_pktmbuf_copy(pkts[i], mp); + p = rte_pktmbuf_copy(pkts[i], mp, 0, UINT32_MAX); if (p) dup_bufs[d_pkts++] = p; }