• David Ahern's avatar
    net: mpls: change mpls_route layout · 59b20966
    David Ahern authored
    Move labels to the end of mpls_nh as a 0-sized array and within mpls_route
    move the via for a nexthop after the mpls_nh. The new layout becomes:
    
       +----------------------+
       | mpls_route           |
       +----------------------+
       | mpls_nh 0            |
       +----------------------+
       | alignment padding    |   4 bytes for odd number of labels; 0 for even
       +----------------------+
       | via[rt_max_alen] 0   |
       +----------------------+
       | alignment padding    |   via's aligned on sizeof(unsigned long)
       +----------------------+
       | ...                  |
       +----------------------+
       | mpls_nh n-1          |
       +----------------------+
       | via[rt_max_alen] n-1 |
       +----------------------+
    
    Memory allocated for nexthop + via is constant across all nexthops and
    their via. It is based on the maximum number of labels across all nexthops
    and the maximum via length. The size is saved in the mpls_route as
    rt_nh_size. Accessing a nexthop becomes rt->rt_nh + index * rt->rt_nh_size.
    
    The offset of the via address from a nexthop is saved as rt_via_offset
    so that given an mpls_nh pointer the via for that hop is simply
    nh + rt->rt_via_offset.
    
    With prior code, memory allocated per mpls_route with 1 nexthop:
         via is an ethernet address - 64 bytes
         via is an ipv4 address     - 64
         via is an ipv6 address     - 72
    
    With this patch set, memory allocated per mpls_route with 1 nexthop and
    1 or 2 labels:
         via is an ethernet address - 56 bytes
         via is an ipv4 address     - 56
         via is an ipv6 address     - 64
    
    The 8-byte reduction is due to the previous patch; the change introduced
    by this patch has no impact on the size of allocations for 1 or 2 labels.
    
    Performance impact of this change was examined using network namespaces
    with veth pairs connecting namespaces. ns0 inserts the packet to the
    label-switched path using an lwt route with encap mpls. ns1 adds 1 or 2
    labels depending on test, ns2 (and ns3 for 2-label test) pops the label
    and forwards. ns3 (or ns4) for a 2-label is the destination. Similar
    series of namespaces used for 2-nexthop test.
    
    Intent is to measure changes to latency (overhead in manipulating the
    packet) in the forwarding path. Tests used netperf with UDP_RR.
    
    IPv4:                     current   patches
       1 label, 1 nexthop      29908     30115
       2 label, 1 nexthop      29071     29612
       1 label, 2 nexthop      29582     29776
       2 label, 2 nexthop      29086     29149
    
    IPv6:                     current   patches
       1 label, 1 nexthop      24502     24960
       2 label, 1 nexthop      24041     24407
       1 label, 2 nexthop      23795     23899
       2 label, 2 nexthop      23074     22959
    
    In short, the change has no effect to a modest increase in performance.
    This is expected since this patch does not really have an impact on routes
    with 1 or 2 labels (the current limit) and 1 or 2 nexthops.
    Signed-off-by: default avatarDavid Ahern <dsa@cumulusnetworks.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    59b20966
internal.h 5.71 KB