[ovs-dev] [PATCH v8 09/13] dp-packet: Handle multi-seg mbufs in resize__().

Eelco Chaudron echaudro at redhat.com
Mon Jun 18 13:06:49 UTC 2018



On 11 Jun 2018, at 18:21, Tiago Lam wrote:

> When enabled with DPDK OvS relies on mbufs allocated by mempools to
> receive and output data on DPDK ports. Until now, each OvS dp_packet 
> has
> had only one mbuf associated, which is allocated with the maximum
> possible size, taking the MTU into account. This approach, however,
> doesn't allow us to increase the allocated size in an mbuf, if needed,
> since an mbuf is allocated and initialised upon mempool creation. 
> Thus,
> in the current implementatin this is dealt with by calling
> OVS_NOT_REACHED() and terminating OvS.
>
> To avoid this, and allow the (already) allocated space to be better
> used, dp_packet_resize__() now tries to use the available room, both 
> the
> tailroom and the headroom, to make enough space for the new data. 
> Since
> this happens for packets of source DPBUF_DPDK, the single-segment mbuf
> case mentioned above is also covered by this new aproach in 
> resize__().
>
> Signed-off-by: Tiago Lam <tiago.lam at intel.com>
> ---
>  lib/dp-packet.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 46 insertions(+), 2 deletions(-)
>
> diff --git a/lib/dp-packet.c b/lib/dp-packet.c
> index 399fadb..d0fab94 100644
> --- a/lib/dp-packet.c
> +++ b/lib/dp-packet.c
> @@ -237,9 +237,51 @@ dp_packet_resize__(struct dp_packet *b, size_t 
> new_headroom, size_t new_tailroom
>      new_allocated = new_headroom + dp_packet_size(b) + new_tailroom;
>
>      switch (b->source) {
> +    /* When resizing mbufs, both a single mbuf and multi-segment 
> mbufs (where
> +     * data is not contigously held in memory), both the headroom and 
> the
> +     * tailroom available will be used to make more space for where 
> data needs
> +     * to be inserted. I.e if there's not enough headroom, data may 
> be shifted
> +     * right if there's enough tailroom.
> +     * However, this is not bulletproof and in some cases the space 
> available
> +     * won't be enough - in those cases, an error should be returned 
> and the
> +     * packet dropped. */
>      case DPBUF_DPDK:
> -        OVS_NOT_REACHED();
> +    {
> +        size_t miss_len;
> +
> +        if (new_headroom == dp_packet_headroom(b)) {
> +            /* This is a tailroom adjustment. Since there's no 
> tailroom space
> +             * left, try and shift data towards the head to free up 
> tail space,
> +             * if there's enough headroom */
> +
> +            miss_len = new_tailroom - dp_packet_tailroom(b);
> +
> +            if (miss_len <= new_headroom) {
> +                dp_packet_shift(b, -miss_len);
> +            } else {
> +                /* XXX: Handle error case and report error to caller 
> */
> +                OVS_NOT_REACHED();
Should we add another fragment here, asking as dp_packet_set_size() can 
free buffers?
> +            }
> +        } else {

Can it also be possible that we need to adjust both tail and head room?

> +            /* Otherwise, this is a headroom adjustment. Try to shift 
> data
> +             * towards the tail to free up head space, if there's 
> enough
> +             * tailroom */
> +
> +            miss_len = new_headroom - dp_packet_headroom(b);
>
> +
> +            if (miss_len <= new_tailroom) {
> +                dp_packet_shift(b, miss_len);
> +            } else {
> +                /* XXX: Handle error case and report error to caller 
> */
> +                OVS_NOT_REACHED();
See above
> +            }
> +        }
> +
> +        new_base = dp_packet_base(b);
> +
> +        break;
> +    }
>      case DPBUF_MALLOC:
>          if (new_headroom == dp_packet_headroom(b)) {
>              new_base = xrealloc(dp_packet_base(b), new_allocated);
> @@ -263,7 +305,9 @@ dp_packet_resize__(struct dp_packet *b, size_t 
> new_headroom, size_t new_tailroom
>          OVS_NOT_REACHED();
>      }
>
> -    dp_packet_set_allocated(b, new_allocated);
> +    if (b->source != DPBUF_DPDK) {
> +        dp_packet_set_allocated(b, new_allocated);
> +    }
>      dp_packet_set_base(b, new_base);
>
>      new_data = (char *) new_base + new_headroom;
> -- 
> 2.7.4


More information about the dev mailing list