[ovs-dev] [ovs-discuss] [PATCH v2] [PATCH] QinQ: support more vlan headers.
Eric Garver
eric at garver.life
Fri Sep 7 14:14:13 UTC 2018
On Fri, Sep 07, 2018 at 09:53:44AM +0000, Lilijun (Jerry, Cloud Networking) wrote:
> In my test, vlan-limit is set to 0 that means unlimited the count of vlan
> headers.
> ovs-vsctl set Open_vSwitch . other_config:vlan-limit=0
>
> But in fact the macro FLOW_MAX_VLAN_HEADERS is defined as 2, so we can
> only support max two vlan headers. It doesn't work as the config vlan-limit's
> description.
>
> So, when VM sends a packet already with two vlan headers, the vport configured with
> qinq mode can't add another s-vlan headers. FLOW_MAX_VLAN_HEADERS need to
> be larger to support more vlan headers.
>
> Change-Id: I8449e308d406ce3757b43a2636ff0f326ca12a9d
> Signed-off-by: Lilijun <jerry.lilijun at huawei.com>
> ---
> include/openvswitch/flow.h | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/include/openvswitch/flow.h b/include/openvswitch/flow.h
> index 5d2cf09..a09650c 100644
> --- a/include/openvswitch/flow.h
> +++ b/include/openvswitch/flow.h
> @@ -72,7 +72,7 @@ const char *flow_tun_flag_to_string(uint32_t flags);
> *
> * We require this to be a multiple of 2 so that vlans[] in struct flow is a
> * multiple of 64 bits. */
> -#define FLOW_MAX_VLAN_HEADERS 2
> +#define FLOW_MAX_VLAN_HEADERS 4
This change splits the MPLS labels and ct_ipv6_src across cache lines
and 64 byte boundary which affects the miniflow. This change may have a
performance impact for scenarios that use these fields.
On the plus side it pushes all the nsh fields into the same cache line.
Previously they were split.
With this patch:
$ pahole -C flow lib/flow.o
struct flow {
struct flow_tnl tunnel; /* 0 344 */
/* --- cacheline 5 boundary (320 bytes) was 24 bytes ago --- */
ovs_be64 metadata; /* 344 8 */
uint32_t regs[16]; /* 352 64 */
/* --- cacheline 6 boundary (384 bytes) was 32 bytes ago --- */
uint32_t skb_priority; /* 416 4 */
uint32_t pkt_mark; /* 420 4 */
uint32_t dp_hash; /* 424 4 */
union flow_in_port in_port; /* 428 4 */
uint32_t recirc_id; /* 432 4 */
uint8_t ct_state; /* 436 1 */
uint8_t ct_nw_proto; /* 437 1 */
uint16_t ct_zone; /* 438 2 */
uint32_t ct_mark; /* 440 4 */
ovs_be32 packet_type; /* 444 4 */
/* --- cacheline 7 boundary (448 bytes) --- */
ovs_u128 ct_label; /* 448 16 */
uint32_t conj_id; /* 464 4 */
ofp_port_t actset_output; /* 468 4 */
struct eth_addr dl_dst; /* 472 6 */
struct eth_addr dl_src; /* 478 6 */
ovs_be16 dl_type; /* 484 2 */
uint8_t pad1[2]; /* 486 2 */
union flow_vlan_hdr vlans[4]; /* 488 16 */
ovs_be32 mpls_lse[4]; /* 504 16 */
/* --- cacheline 8 boundary (512 bytes) was 8 bytes ago --- */
ovs_be32 nw_src; /* 520 4 */
ovs_be32 nw_dst; /* 524 4 */
ovs_be32 ct_nw_src; /* 528 4 */
ovs_be32 ct_nw_dst; /* 532 4 */
struct in6_addr ipv6_src; /* 536 16 */
struct in6_addr ipv6_dst; /* 552 16 */
struct in6_addr ct_ipv6_src; /* 568 16 */
/* --- cacheline 9 boundary (576 bytes) was 8 bytes ago --- */
struct in6_addr ct_ipv6_dst; /* 584 16 */
ovs_be32 ipv6_label; /* 600 4 */
uint8_t nw_frag; /* 604 1 */
uint8_t nw_tos; /* 605 1 */
uint8_t nw_ttl; /* 606 1 */
uint8_t nw_proto; /* 607 1 */
struct in6_addr nd_target; /* 608 16 */
struct eth_addr arp_sha; /* 624 6 */
struct eth_addr arp_tha; /* 630 6 */
ovs_be16 tcp_flags; /* 636 2 */
ovs_be16 pad2; /* 638 2 */
/* --- cacheline 10 boundary (640 bytes) --- */
struct ovs_key_nsh nsh; /* 640 24 */
ovs_be16 tp_src; /* 664 2 */
ovs_be16 tp_dst; /* 666 2 */
ovs_be16 ct_tp_src; /* 668 2 */
ovs_be16 ct_tp_dst; /* 670 2 */
ovs_be32 igmp_group_ip4; /* 672 4 */
ovs_be32 pad3; /* 676 4 */
/* size: 680, cachelines: 11, members: 47 */
/* last cacheline: 40 bytes */
};
Before this patch:
$ pahole -C flow lib/flow.o
struct flow {
struct flow_tnl tunnel; /* 0 344 */
/* --- cacheline 5 boundary (320 bytes) was 24 bytes ago --- */
ovs_be64 metadata; /* 344 8 */
uint32_t regs[16]; /* 352 64 */
/* --- cacheline 6 boundary (384 bytes) was 32 bytes ago --- */
uint32_t skb_priority; /* 416 4 */
uint32_t pkt_mark; /* 420 4 */
uint32_t dp_hash; /* 424 4 */
union flow_in_port in_port; /* 428 4 */
uint32_t recirc_id; /* 432 4 */
uint8_t ct_state; /* 436 1 */
uint8_t ct_nw_proto; /* 437 1 */
uint16_t ct_zone; /* 438 2 */
uint32_t ct_mark; /* 440 4 */
ovs_be32 packet_type; /* 444 4 */
/* --- cacheline 7 boundary (448 bytes) --- */
ovs_u128 ct_label; /* 448 16 */
uint32_t conj_id; /* 464 4 */
ofp_port_t actset_output; /* 468 4 */
struct eth_addr dl_dst; /* 472 6 */
struct eth_addr dl_src; /* 478 6 */
ovs_be16 dl_type; /* 484 2 */
uint8_t pad1[2]; /* 486 2 */
union flow_vlan_hdr vlans[2]; /* 488 8 */
ovs_be32 mpls_lse[4]; /* 496 16 */
/* --- cacheline 8 boundary (512 bytes) --- */
ovs_be32 nw_src; /* 512 4 */
ovs_be32 nw_dst; /* 516 4 */
ovs_be32 ct_nw_src; /* 520 4 */
ovs_be32 ct_nw_dst; /* 524 4 */
struct in6_addr ipv6_src; /* 528 16 */
struct in6_addr ipv6_dst; /* 544 16 */
struct in6_addr ct_ipv6_src; /* 560 16 */
/* --- cacheline 9 boundary (576 bytes) --- */
struct in6_addr ct_ipv6_dst; /* 576 16 */
ovs_be32 ipv6_label; /* 592 4 */
uint8_t nw_frag; /* 596 1 */
uint8_t nw_tos; /* 597 1 */
uint8_t nw_ttl; /* 598 1 */
uint8_t nw_proto; /* 599 1 */
struct in6_addr nd_target; /* 600 16 */
struct eth_addr arp_sha; /* 616 6 */
struct eth_addr arp_tha; /* 622 6 */
ovs_be16 tcp_flags; /* 628 2 */
ovs_be16 pad2; /* 630 2 */
struct ovs_key_nsh nsh; /* 632 24 */
/* --- cacheline 10 boundary (640 bytes) was 16 bytes ago --- */
ovs_be16 tp_src; /* 656 2 */
ovs_be16 tp_dst; /* 658 2 */
ovs_be16 ct_tp_src; /* 660 2 */
ovs_be16 ct_tp_dst; /* 662 2 */
ovs_be32 igmp_group_ip4; /* 664 4 */
ovs_be32 pad3; /* 668 4 */
/* size: 672, cachelines: 11, members: 47 */
/* last cacheline: 32 bytes */
};
More information about the dev
mailing list