mbuf: rework check on mbuf freeing
authorBruce Richardson <bruce.richardson@intel.com>
Mon, 17 Feb 2014 19:15:19 +0000 (20:15 +0100)
committerDavid Marchand <david.marchand@6wind.com>
Tue, 25 Feb 2014 20:29:18 +0000 (21:29 +0100)
Allow poll-mode drivers to maintain their own caches of mbufs, by allowing them
to check if it's ok to free an mbuf (to their local cache) without actually
freeing it back to the memory pool itself.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Signed-off-by: David Marchand <david.marchand@6wind.com>
lib/librte_mbuf/rte_mbuf.h

index 22ddccb..954e990 100644 (file)
@@ -659,17 +659,9 @@ static inline void rte_pktmbuf_detach(struct rte_mbuf *m)
 
 #endif /* RTE_MBUF_SCATTER_GATHER */
 
-/**
- * Free a segment of a packet mbuf into its original mempool.
- *
- * Free an mbuf, without parsing other segments in case of chained
- * buffers.
- *
- * @param m
- *   The packet mbuf segment to be freed.
- */
-static inline void __attribute__((always_inline))
-rte_pktmbuf_free_seg(struct rte_mbuf *m)
+
+static inline struct rte_mbuf* __attribute__((always_inline))
+__rte_pktmbuf_prefree_seg(struct rte_mbuf *m)
 {
        __rte_mbuf_sanity_check(m, RTE_MBUF_PKT, 0);
 
@@ -690,12 +682,29 @@ rte_pktmbuf_free_seg(struct rte_mbuf *m)
                                __rte_mbuf_raw_free(md);
                }
 #endif
-               __rte_mbuf_raw_free(m);
+               return(m);
 #ifdef RTE_MBUF_SCATTER_GATHER
        }
+       return (NULL);
 #endif
 }
 
+/**
+ * Free a segment of a packet mbuf into its original mempool.
+ *
+ * Free an mbuf, without parsing other segments in case of chained
+ * buffers.
+ *
+ * @param m
+ *   The packet mbuf segment to be freed.
+ */
+static inline void __attribute__((always_inline))
+rte_pktmbuf_free_seg(struct rte_mbuf *m)
+{
+       if (likely(NULL != (m = __rte_pktmbuf_prefree_seg(m))))
+               __rte_mbuf_raw_free(m);
+}
+
 /**
  * Free a packet mbuf back into its original mempool.
  *