mbuf: add userdata pointer field
authorBruce Richardson <bruce.richardson@intel.com>
Tue, 23 Sep 2014 11:08:16 +0000 (12:08 +0100)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Wed, 8 Oct 2014 12:24:59 +0000 (14:24 +0200)
While some applications may store metadata about packets in the packet
mbuf headroom, this is not a workable solution for packet metadata which
is either:
* larger than the headroom (or headroom is needed for adding pkt headers)
* needs to be shared or copied among packets

To support these use cases in applications, we reserve a general
"userdata" pointer field inside the second cache-line of the mbuf. This
is better than having the application store the pointer to the external
metadata in the packet headroom, as it saves an additional cache-line
from being used.

Apart from storing metadata, this field also provides a general 8-byte
scratch space inside the mbuf for any other application uses that are
applicable.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h
lib/librte_mbuf/rte_mbuf.h

index 25ed672..e548161 100644 (file)
@@ -116,8 +116,10 @@ struct rte_kni_mbuf {
        char pad2[2];
        uint16_t data_len;      /**< Amount of data in segment buffer. */
        uint32_t pkt_len;       /**< Total pkt len: sum of all segment data_len. */
-       char pad3[8];
-       void *pool __attribute__((__aligned__(64)));
+
+       /* fields on second cache line */
+       char pad3[8] __attribute__((__aligned__(64)));
+       void *pool;
        void *next;
 };
 
index 8e27d2e..9e70d3b 100644 (file)
@@ -172,6 +172,12 @@ struct rte_mbuf {
 
        /* second cache line - fields only used in slow path or on TX */
        MARKER cacheline1 __rte_cache_aligned;
+
+       union {
+               void *userdata;   /**< Can be used for external metadata */
+               uint64_t udata64; /**< Allow 8-byte userdata on 32-bit */
+       };
+
        struct rte_mempool *pool; /**< Pool from which mbuf was allocated. */
        struct rte_mbuf *next;    /**< Next segment of scattered packet. */