On Tue, Mar 3, 2015 at 9:01 AM, Kavanagh, Mark B
<mark.b.kavan...@intel.com> wrote:
>> Currently dp-packet make use of ofpbuf for managing packet
>> buffers. That complicates ofpbuf, by making dp-packet
>> independent of ofpbuf both libraries can be optimized for
>> their own use case.
>> This avoids mapping operation between ofpbuf and dp_packet
>> in datapath upcalls.
>>
>> Signed-off-by: Pravin B Shelar <pshe...@nicira.com>
>> ---
>>  lib/bfd.c                      |   23 +-
>>  lib/bfd.h                      |    6 +-
>>  lib/cfm.c                      |   12 +-
>>  lib/cfm.h                      |    6 +-
>>  lib/dp-packet.c                |  556 
>> +++++++++++++++++++++++++++++++++++++--
>>  lib/dp-packet.h                |  442 ++++++++++++++++++++++++++++++--
>>  lib/dpif-netdev.c              |   44 ++--
>>  lib/dpif-netdev.h              |    8 +-
>>  lib/dpif-netlink.c             |   20 +-
>>  lib/dpif.c                     |   31 +--
>>  lib/dpif.h                     |   11 +-
>>  lib/flow.c                     |   79 +++---
>>  lib/flow.h                     |   32 +--
>>  lib/lacp.c                     |    8 +-
>>  lib/lacp.h                     |    2 +-
>>  lib/learning-switch.c          |   11 +-
>>  lib/netdev-bsd.c               |   31 +--
>>  lib/netdev-dpdk.c              |   11 +-
>>  lib/netdev-dummy.c             |   94 ++++----
>>  lib/netdev-linux.c             |   35 ++--
>>  lib/netdev-vport.c             |   47 ++--
>>  lib/netdev.c                   |    4 +-
>>  lib/odp-execute.c              |  105 ++++----
>>  lib/ofp-print.c                |   22 +-
>>  lib/packets.c                  |  158 ++++++------
>>  lib/packets.h                  |   34 ++--
>>  lib/pcap-file.c                |   48 ++--
>>  lib/pcap-file.h                |   10 +-
>>  lib/rstp-common.h              |    2 +-
>>  lib/rstp-state-machines.c      |   15 +-
>>  lib/rstp.c                     |    3 +-
>>  lib/rstp.h                     |    4 +-
>>  lib/stp.c                      |   19 +-
>>  lib/stp.h                      |    4 +-
>>  ofproto/bond.c                 |    7 +-
>>  ofproto/bond.h                 |    2 +-
>>  ofproto/connmgr.c              |    2 +-
>>  ofproto/connmgr.h              |    2 +-
>>  ofproto/fail-open.c            |   15 +-
>>  ofproto/ofproto-dpif-ipfix.c   |  101 ++++----
>>  ofproto/ofproto-dpif-ipfix.h   |    6 +-
>>  ofproto/ofproto-dpif-monitor.c |   19 +-
>>  ofproto/ofproto-dpif-sflow.c   |    8 +-
>>  ofproto/ofproto-dpif-sflow.h   |    2 +-
>>  ofproto/ofproto-dpif-upcall.c  |   35 ++--
>>  ofproto/ofproto-dpif-xlate.c   |   54 ++--
>>  ofproto/ofproto-dpif-xlate.h   |    7 +-
>>  ofproto/ofproto-dpif.c         |   91 ++++----
>>  ofproto/ofproto-dpif.h         |    6 +-
>>  ofproto/ofproto-provider.h     |    4 +-
>>  ofproto/ofproto.c              |   19 +-
>>  ofproto/pktbuf.c               |   16 +-
>>  ofproto/pktbuf.h               |    4 +-
>>  tests/test-flows.c             |   11 +-
>>  tests/test-rstp.c              |    9 +-
>>  tests/test-stp.c               |    9 +-
>>  utilities/ovs-ofctl.c          |   42 ++--
>>  57 files changed, 1639 insertions(+), 769 deletions(-)
>
> General: what impacts (if any) to performance do these changes have? Are any 
> figures available (e.g. for Phy-Phy use case)?
>>
There should not be any performance impact due to this patch.

>> diff --git a/lib/bfd.c b/lib/bfd.c
>> index 3db1d57..62ace8f 100644
>> --- a/lib/bfd.c
>> +++ b/lib/bfd.c
>> @@ -35,6 +35,7 @@
>
> (snip)
>
>> @@ -741,7 +742,7 @@ bfd_process_packet(struct bfd *bfd, const struct flow 
>> *flow,
>>       * If the Length field is greater than the payload of the encapsulating
>>       * protocol, the packet MUST be discarded.
>>       *
>> -     * Note that we make this check implicity.  Above we use ofpbuf_at() to
>> +     * Note that we make this check implicity.  Above we use dp_packet_at() 
>> to
>
> Typo in comment: 'implicity' (sic)
>
> (snip)
>
>> diff --git a/lib/dp-packet.c b/lib/dp-packet.c
>> index d77f8e4..b90f678 100644
>> --- a/lib/dp-packet.c
>> +++ b/lib/dp-packet.c
>> @@ -1,5 +1,5 @@
>>  /*
>> - * Copyright (c) 2014 Nicira, Inc.
>> + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013 Nicira, Inc.
>>   *
>>   * Licensed under the Apache License, Version 2.0 (the "License");
>>   * you may not use this file except in compliance with the License.
>> @@ -15,57 +15,555 @@
>>   */
>>
>>  #include <config.h>
>> +#include <stdlib.h>
>> +#include <string.h>
>> +#include "dynamic-string.h"
>> +#include "netdev-dpdk.h"
>>  #include "dp-packet.h"
>> +#include "util.h"
>>
>
> (snip)
>
>> +/* Frees memory that 'b' points to. */
>> +void
>> +dp_packet_uninit(struct dp_packet *b)
>> +{
>> +    if (b) {
>> +        if (b->source == DPBUF_MALLOC) {
>> +            free(dp_packet_base(b));
>> +        } else if (b->source == DPBUF_DPDK) {
>> +#ifdef DPDK_NETDEV
>> +            /* If this dp_packet was allocated by DPDK it must have been
>> +             * created as a dp_packet */
>> +            free_dpdk_buf((struct dp_packet*) b);
>> +#else
>> +            ovs_assert(b->source != DPBUF_DPDK);
>
> The else condition ensures that b->source is DPBUF_DPDK - how can this assert 
> ever be true?
>
right. I will remove it.


>> +#endif
>> +        }
>> +    }
>> +}
>> +
>>
>> +/* Reallocates 'b' so that it has exactly 'new_headroom' and 'new_tailroom'
>> + * bytes of headroom and tailroom, respectively. */
>> +static void
>> +dp_packet_resize__(struct dp_packet *b, size_t new_headroom, size_t 
>> new_tailroom)
>> +{
>> +    void *new_base, *new_data;
>> +    size_t new_allocated;
>> +
>> +    new_allocated = new_headroom + dp_packet_size(b) + new_tailroom;
>> +
>> +    switch (b->source) {
>> +    case DPBUF_DPDK:
>> +        OVS_NOT_REACHED();
>> +
>> +    case DPBUF_MALLOC:
>> +        if (new_headroom == dp_packet_headroom(b)) {
>> +            new_base = xrealloc(dp_packet_base(b), new_allocated);
>> +        } else {
>> +            new_base = xmalloc(new_allocated);
>> +            dp_packet_copy__(b, new_base, new_headroom, new_tailroom);
>> +            free(dp_packet_base(b));
>> +        }
>> +        break;
>>
>> -        p->ofpbuf.frame = (char *) b->frame + data_delta;
>> +    case DPBUF_STACK:
>> +        OVS_NOT_REACHED();
>> +
>> +    case DPBUF_STUB:
>> +        b->source = DPBUF_MALLOC;
>> +        new_base = xmalloc(new_allocated);
>> +        dp_packet_copy__(b, new_base, new_headroom, new_tailroom);
>> +        break;
>> +
>> +    default:
>> +        OVS_NOT_REACHED();
>>      }
>> -    p->ofpbuf.l2_5_ofs = b->l2_5_ofs;
>> -    p->ofpbuf.l3_ofs = b->l3_ofs;
>> -    p->ofpbuf.l4_ofs = b->l4_ofs;
>>
>> +    b->allocated = new_allocated;
>> +    dp_packet_set_base(b, new_base);
>> +
>> +    new_data = (char *) new_base + new_headroom;
>> +    if (dp_packet_data(b) != new_data) {
>> +        if (b->frame) {
>> +            uintptr_t data_delta = (char *) new_data - (char *) 
>> dp_packet_data(b);
>> +
>
> General: You already know this, but just to state it explicitly: these 
> changes won't work with DPDK versions > 1.7.1
>
There is assert for DPDK case.

>> +            b->frame = (char *) b->frame + data_delta;
>> +        }
>> +        dp_packet_set_data(b, new_data);
>
> (snip)
>
>> +/* Shifts all of the data within the allocated space in 'b' by 'delta' 
>> bytes.
>> + * For example, a 'delta' of 1 would cause each byte of data to move one 
>> byte
>> + * forward (from address 'p' to 'p+1'), and a 'delta' of -1 would cause each
>> + * byte to move one byte backward (from 'p' to 'p-1'). */
>> +void
>> +dp_packet_shift(struct dp_packet *b, int delta)
>> +{
>> +    ovs_assert(delta > 0 ? delta <= dp_packet_tailroom(b)
>> +               : delta < 0 ? -delta <= dp_packet_headroom(b)
>> +               : true);
>> +
>> +    if (delta != 0) {
>> +        char *dst = (char *) dp_packet_data(b) + delta;
>> +        memmove(dst, dp_packet_data(b), dp_packet_size(b));
>
> Presumably, it is the caller's responsibility to ensure that the memory at 
> 'dst' is not in use?
>
yes.

>> +        dp_packet_set_data(b, dst);
>> +    }
>> +}
>> +
>
> (snip)
>
>> +
>> +static inline void
>> +dp_packet_adjust_layer_offset(uint16_t *offset, int increment)
>>  {
>> -    struct dp_packet *newp;
>> +    if (*offset != UINT16_MAX) {
>> +        *offset += increment;
>
> Is a warning needed if offset wraps around?
>
Caller should make sure it does not wraps around.

> (snip)
>
>> diff --git a/lib/dp-packet.h b/lib/dp-packet.h
>> index 74abdec..e23660d 100644
>> --- a/lib/dp-packet.h
>> +++ b/lib/dp-packet.h
>> @@ -1,5 +1,5 @@
>>  /*
>> - * Copyright (c) 2014 Nicira, Inc.
>> + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013 Nicira, Inc.
>>   *
>>   * Licensed under the Apache License, Version 2.0 (the "License");
>>   * you may not use this file except in compliance with the License.
>> @@ -14,43 +14,451 @@
>>   * limitations under the License.
>>   */
>>
>> -#ifndef PACKET_DPIF_H
>> -#define PACKET_DPIF_H 1
>> +#ifndef DPBUF_H
>> +#define DPBUF_H 1
>>
>> -#include "ofpbuf.h"
>> +#include <stddef.h>
>> +#include <stdint.h>
>> +#include "list.h"
>> +#include "packets.h"
>> +#include "util.h"
>> +#include "netdev-dpdk.h"
>
> General: Rearrange includes alphabetically, if possible
>
>>
>>  #ifdef  __cplusplus
>>  extern "C" {
>>  #endif
>>
>> -/* A packet received from a netdev and passed to a dpif. */
>> +enum OVS_PACKED_ENUM dp_packet_source {
>> +    DPBUF_MALLOC,              /* Obtained via malloc(). */
>> +    DPBUF_STACK,               /* Un-movable stack space or static buffer. 
>> */
>> +    DPBUF_STUB,                /* Starts on stack, may expand into heap. */
>> +    DPBUF_DPDK,                /* buffer data is from DPDK allocated memory.
>> +                                   ref to build_dp_packet() in netdev-dpdk. 
>> */
>
> Alignment is off on second line of comment above
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to