On Fri, 22 Jan 2016 13:40:44 +0000 "Mrzyglod, DanielX T" <danielx.t.mrzyglod at intel.com> wrote:
> > > >-----Original Message----- > >From: dev [mailto:dev-bounces at dpdk.org] On Behalf Of Stephen Hemminger > >Sent: Friday, July 10, 2015 1:38 AM > >To: dev at dpdk.org > >Cc: Mike Davison <mdavison at brocade.com>; Stephen Hemminger > ><shemming at brocade.com> > >Subject: [dpdk-dev] [PATCH 1/2] mbuf: Add rte_pktmbuf_copy > > > >From: Stephen Hemminger <shemming at brocade.com> > > > >Added rte_pktmbuf_copy() function since copying multi-part > >segments is common issue and can be problematic. > > > >Signed-off-by: Mike Davison <mdavison at brocade.com> > >Reviewed-by: Stephen Hemminger <shemming at brocade.com> > >--- > > lib/librte_mbuf/rte_mbuf.h | 59 > >++++++++++++++++++++++++++++++++++++++++++++++ > > 1 file changed, 59 insertions(+) > > > >diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h > >index 80419df..f0a543b 100644 > >--- a/lib/librte_mbuf/rte_mbuf.h > >+++ b/lib/librte_mbuf/rte_mbuf.h > >@@ -60,6 +60,7 @@ > > #include <rte_atomic.h> > > #include <rte_prefetch.h> > > #include <rte_branch_prediction.h> > >+#include <rte_memcpy.h> > > > > #ifdef __cplusplus > > extern "C" { > >@@ -1272,6 +1273,64 @@ static inline int rte_pktmbuf_is_contiguous(const > >struct rte_mbuf *m) > > return !!(m->nb_segs == 1); > > } > > > >+/* > >+ * Creates a copy of the given packet mbuf. > >+ * > >+ * Walks through all segments of the given packet mbuf, and for each of > >them: > >+ * - Creates a new packet mbuf from the given pool. > >+ * - Copy segment to newly created mbuf. > >+ * Then updates pkt_len and nb_segs of the new packet mbuf to match values > >+ * from the original packet mbuf. > >+ * > >+ * @param md > >+ * The packet mbuf to be copied. > >+ * @param mp > >+ * The mempool from which the mbufs are allocated. > >+ * @return > >+ * - The pointer to the new mbuf on success. > >+ * - NULL if allocation fails. > >+ */ > >+static inline struct rte_mbuf *rte_pktmbuf_copy(struct rte_mbuf *md, > >+ struct rte_mempool *mp) > >+{ > >+ struct rte_mbuf *mc = NULL; > >+ struct rte_mbuf **prev = &mc; > >+ > >+ do { > >+ struct rte_mbuf *mi; > >+ > >+ mi = rte_pktmbuf_alloc(mp); > >+ if (unlikely(mi == NULL)) { > >+ rte_pktmbuf_free(mc); > >+ return NULL; > >+ } > >+ > >+ mi->data_off = md->data_off; > >+ mi->data_len = md->data_len; > >+ mi->port = md->port; > >+ mi->vlan_tci = md->vlan_tci; > >+ mi->tx_offload = md->tx_offload; > >+ mi->hash = md->hash; > >+ > >+ mi->next = NULL; > >+ mi->pkt_len = md->pkt_len; > >+ mi->nb_segs = md->nb_segs; > >+ mi->ol_flags = md->ol_flags; > >+ mi->packet_type = md->packet_type; > >+ > >+ rte_memcpy(rte_pktmbuf_mtod(mi, char *), > >+ rte_pktmbuf_mtod(md, char *), > >+ md->data_len); > >+ > >+ *prev = mi; > >+ prev = &mi->next; > >+ } while ((md = md->next) != NULL); > >+ > >+ *prev = NULL; > >+ __rte_mbuf_sanity_check(mc, 1); > >+ return mc; > >+} > >+ > > /** > > * Dump an mbuf structure to the console. > > * > >-- > >2.1.4 > > Hi Stephen :> > This patch look useful in case of backup buffs. > There will be second approach ? I did bother resubmitting it since unless there are users in current code base it would likely rot.