[ovs-dev] [RFC PATCH V4 3/9] dp-packet: fix put_uninit for multi-seg mbufs

Chandran, Sugesh sugesh.chandran at intel.com
Fri Dec 8 17:59:36 UTC 2017



Regards
_Sugesh


> -----Original Message-----
> From: Kavanagh, Mark B
> Sent: Friday, December 8, 2017 12:02 PM
> To: dev at openvswitch.org; qiudayu at chinac.com
> Cc: Stokes, Ian <ian.stokes at intel.com>; Loftus, Ciara <ciara.loftus at intel.com>;
> santosh.shukla at caviumnetworks.com; Chandran, Sugesh
> <sugesh.chandran at intel.com>; Kavanagh, Mark B
> <mark.b.kavanagh at intel.com>
> Subject: [ovs-dev][RFC PATCH V4 3/9] dp-packet: fix put_uninit for multi-seg
> mbufs
> 
> dp_packet_put_uninit(dp_packet, size) appends 'size' bytes to the tail of a
> dp_packet. In the case of multi-segment mbufs, it is the data length of the last
> mbuf in the mbuf chain that should be adjusted by 'size' bytes.
> 
> In its current implementation, dp_packet_put_uninit() adjusts the dp_packet's
> size via a call to dp_packet_set_size(); however, this adjusts the data length of
> the first mbuf in the chain, which is incorrect in the case of multi-segment
> mbufs. Instead, traverse the mbuf chain to locate the final mbuf of said chain,
> and update its data_len[1]. To finish, increase the packet length of the entire
> mbuf[2] by 'size'.
> 
> [1] In the case of a single-segment mbuf, this is the mbuf itself.
> [2] This is stored in the first mbuf of an mbuf chain.
> 
> Signed-off-by: Mark Kavanagh <mark.b.kavanagh at intel.com>
> ---
>  lib/dp-packet.c | 20 ++++++++++++++++++++
>  1 file changed, 20 insertions(+)
> 
> diff --git a/lib/dp-packet.c b/lib/dp-packet.c index 443c225..ad71486 100644
> --- a/lib/dp-packet.c
> +++ b/lib/dp-packet.c
> @@ -322,7 +322,27 @@ dp_packet_put_uninit(struct dp_packet *b, size_t size)
>      void *p;
>      dp_packet_prealloc_tailroom(b, size);
>      p = dp_packet_tail(b);
> +#ifdef DPDK_NETDEV
> +    if (b->source == DPBUF_DPDK) {
> +        struct rte_mbuf *buf = &(b->mbuf);
> +        /* In the case of multi-segment mbufs, the data length of the last mbuf
> +         * should be adjusted by 'size' bytes. A call to dp_packet_size() would
> +         * adjust the data length of the first mbuf in the segment, so we avoid
> +         * invoking same; as a result, the packet length of the entire mbuf
> +         * chain (stored in the first mbuf of said chain) must be adjusted here
> +         * instead.
> +         */
> +        while (buf->next) {
> +            buf = buf->next;
> +        }
> +        buf->data_len += size;
[Sugesh] Just to confirm, should we have enough room in buf to accommodate the new size? If not, what will happen?
Will it allocate a new mbuf at last? Do you think it's a valid case to happen? My understanding is always mbuf data are over-provisioned previously.
The multiple mbuf case, we are allocating the exact size of packet. Wondering if it make any issues? Please ignore this if its not a valid case at all.
 
> +        b->mbuf.pkt_len += size;
> +    } else {
> +#endif
>      dp_packet_set_size(b, dp_packet_size(b) + size);
> +#ifdef DPDK_NETDEV
> +    }
> +#endif
>      return p;
>  }
> 
> --
> 1.9.3



More information about the dev mailing list