From: Maxime Coquelin Date: Tue, 4 Oct 2016 12:05:23 +0000 (+0200) Subject: mbuf: add function to reset headroom X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=febf2bb46d727563e0de7a6f43d5a2da9f68e17a;p=dpdk.git mbuf: add function to reset headroom Some application use rte_mbuf_raw_alloc() function to improve performance by not resetting mbuf's fields to their default state. This can be however problematic for mbuf consumers that need some headroom, meaning that data_off field gets decremented after allocation. When the mbuf is re-used afterwards, there might not be enough room for the consumer to prepend anything, if the data_off field is not reset to its default value. This patch adds a new rte_pktmbuf_reset_headroom() function that applications can call to reset the data_off field. This patch also replaces current data_off affectations in the mbuf lib with a call to this function. Signed-off-by: Maxime Coquelin Acked-by: Olivier Matz --- diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h index 23b7bf8282..85a653c27a 100644 --- a/lib/librte_mbuf/rte_mbuf.h +++ b/lib/librte_mbuf/rte_mbuf.h @@ -1386,6 +1386,19 @@ rte_pktmbuf_priv_size(struct rte_mempool *mp) return mbp_priv->mbuf_priv_size; } +/** + * Reset the data_off field of a packet mbuf to its default value. + * + * The given mbuf must have only one segment, which should be empty. + * + * @param m + * The packet mbuf's data_off field has to be reset. + */ +static inline void rte_pktmbuf_reset_headroom(struct rte_mbuf *m) +{ + m->data_off = RTE_MIN(RTE_PKTMBUF_HEADROOM, (uint16_t)m->buf_len); +} + /** * Reset the fields of a packet mbuf to their default values. * @@ -1406,8 +1419,7 @@ static inline void rte_pktmbuf_reset(struct rte_mbuf *m) m->ol_flags = 0; m->packet_type = 0; - m->data_off = (RTE_PKTMBUF_HEADROOM <= m->buf_len) ? - RTE_PKTMBUF_HEADROOM : m->buf_len; + rte_pktmbuf_reset_headroom(m); m->data_len = 0; __rte_mbuf_sanity_check(m, 1); @@ -1571,7 +1583,7 @@ static inline void rte_pktmbuf_detach(struct rte_mbuf *m) m->buf_addr = (char *)m + mbuf_size; m->buf_physaddr = rte_mempool_virt2phy(mp, m) + mbuf_size; m->buf_len = (uint16_t)buf_len; - m->data_off = RTE_MIN(RTE_PKTMBUF_HEADROOM, (uint16_t)m->buf_len); + rte_pktmbuf_reset_headroom(m); m->data_len = 0; m->ol_flags = 0;