Skip to content

Commit 9520aea

Browse files
author
Jakub Kicinski
committed
Merge tag 'mlx5-updates-2019-11-22' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux
Saeed Mahameed says: ==================== mlx5-updates-2019-11-22 1) Misc Cleanups 2) Software steering support for Geneve ==================== Signed-off-by: Jakub Kicinski <[email protected]>
2 parents d46b7e4 + 90ac245 commit 9520aea

File tree

8 files changed

+187
-93
lines changed

8 files changed

+187
-93
lines changed

drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.c

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,6 @@ static int mlx5e_route_lookup_ipv6(struct mlx5e_priv *priv,
141141
struct dst_entry *dst;
142142
struct neighbour *n;
143143

144-
#if IS_ENABLED(CONFIG_INET) && IS_ENABLED(CONFIG_IPV6)
145144
int ret;
146145

147146
ret = ipv6_stub->ipv6_dst_lookup(dev_net(mirred_dev), NULL, &dst,
@@ -157,9 +156,6 @@ static int mlx5e_route_lookup_ipv6(struct mlx5e_priv *priv,
157156
dst_release(dst);
158157
return ret;
159158
}
160-
#else
161-
return -EOPNOTSUPP;
162-
#endif
163159

164160
n = dst_neigh_lookup(dst, &fl6->daddr);
165161
dst_release(dst);
@@ -240,13 +236,13 @@ int mlx5e_tc_tun_create_header_ipv4(struct mlx5e_priv *priv,
240236
mlx5_core_warn(priv->mdev, "encap size %d too big, max supported is %d\n",
241237
ipv4_encap_size, max_encap_size);
242238
err = -EOPNOTSUPP;
243-
goto out;
239+
goto release_neigh;
244240
}
245241

246242
encap_header = kzalloc(ipv4_encap_size, GFP_KERNEL);
247243
if (!encap_header) {
248244
err = -ENOMEM;
249-
goto out;
245+
goto release_neigh;
250246
}
251247

252248
/* used by mlx5e_detach_encap to lookup a neigh hash table
@@ -298,7 +294,7 @@ int mlx5e_tc_tun_create_header_ipv4(struct mlx5e_priv *priv,
298294
/* the encap entry will be made valid on neigh update event
299295
* and not used before that.
300296
*/
301-
goto out;
297+
goto release_neigh;
302298
}
303299
e->pkt_reformat = mlx5_packet_reformat_alloc(priv->mdev,
304300
e->reformat_type,
@@ -318,9 +314,8 @@ int mlx5e_tc_tun_create_header_ipv4(struct mlx5e_priv *priv,
318314
mlx5e_rep_encap_entry_detach(netdev_priv(e->out_dev), e);
319315
free_encap:
320316
kfree(encap_header);
321-
out:
322-
if (n)
323-
neigh_release(n);
317+
release_neigh:
318+
neigh_release(n);
324319
return err;
325320
}
326321

@@ -359,13 +354,13 @@ int mlx5e_tc_tun_create_header_ipv6(struct mlx5e_priv *priv,
359354
mlx5_core_warn(priv->mdev, "encap size %d too big, max supported is %d\n",
360355
ipv6_encap_size, max_encap_size);
361356
err = -EOPNOTSUPP;
362-
goto out;
357+
goto release_neigh;
363358
}
364359

365360
encap_header = kzalloc(ipv6_encap_size, GFP_KERNEL);
366361
if (!encap_header) {
367362
err = -ENOMEM;
368-
goto out;
363+
goto release_neigh;
369364
}
370365

371366
/* used by mlx5e_detach_encap to lookup a neigh hash table
@@ -416,7 +411,7 @@ int mlx5e_tc_tun_create_header_ipv6(struct mlx5e_priv *priv,
416411
/* the encap entry will be made valid on neigh update event
417412
* and not used before that.
418413
*/
419-
goto out;
414+
goto release_neigh;
420415
}
421416

422417
e->pkt_reformat = mlx5_packet_reformat_alloc(priv->mdev,
@@ -437,9 +432,8 @@ int mlx5e_tc_tun_create_header_ipv6(struct mlx5e_priv *priv,
437432
mlx5e_rep_encap_entry_detach(netdev_priv(e->out_dev), e);
438433
free_encap:
439434
kfree(encap_header);
440-
out:
441-
if (n)
442-
neigh_release(n);
435+
release_neigh:
436+
neigh_release(n);
443437
return err;
444438
}
445439

drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,16 @@ int mlx5e_tc_tun_create_header_ipv4(struct mlx5e_priv *priv,
5858
struct net_device *mirred_dev,
5959
struct mlx5e_encap_entry *e);
6060

61+
#if IS_ENABLED(CONFIG_INET) && IS_ENABLED(CONFIG_IPV6)
6162
int mlx5e_tc_tun_create_header_ipv6(struct mlx5e_priv *priv,
6263
struct net_device *mirred_dev,
6364
struct mlx5e_encap_entry *e);
65+
#else
66+
static inline int
67+
mlx5e_tc_tun_create_header_ipv6(struct mlx5e_priv *priv,
68+
struct net_device *mirred_dev,
69+
struct mlx5e_encap_entry *e) { return -EOPNOTSUPP; }
70+
#endif
6471

6572
bool mlx5e_tc_tun_device_to_offload(struct mlx5e_priv *priv,
6673
struct net_device *netdev);

drivers/net/ethernet/mellanox/mlx5/core/steering/dr_matcher.c

Lines changed: 48 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -102,13 +102,52 @@ static bool dr_mask_is_gre_set(struct mlx5dr_match_misc *misc)
102102
DR_MASK_IS_OUTER_MPLS_OVER_GRE_UDP_SET((_misc2), gre) || \
103103
DR_MASK_IS_OUTER_MPLS_OVER_GRE_UDP_SET((_misc2), udp))
104104

105-
static bool dr_mask_is_flex_parser_tnl_set(struct mlx5dr_match_misc3 *misc3)
105+
static bool
106+
dr_mask_is_misc3_vxlan_gpe_set(struct mlx5dr_match_misc3 *misc3)
106107
{
107108
return (misc3->outer_vxlan_gpe_vni ||
108109
misc3->outer_vxlan_gpe_next_protocol ||
109110
misc3->outer_vxlan_gpe_flags);
110111
}
111112

113+
static bool
114+
dr_matcher_supp_flex_parser_vxlan_gpe(struct mlx5dr_cmd_caps *caps)
115+
{
116+
return caps->flex_protocols &
117+
MLX5_FLEX_PARSER_VXLAN_GPE_ENABLED;
118+
}
119+
120+
static bool
121+
dr_mask_is_flex_parser_tnl_vxlan_gpe_set(struct mlx5dr_match_param *mask,
122+
struct mlx5dr_domain *dmn)
123+
{
124+
return dr_mask_is_misc3_vxlan_gpe_set(&mask->misc3) &&
125+
dr_matcher_supp_flex_parser_vxlan_gpe(&dmn->info.caps);
126+
}
127+
128+
static bool dr_mask_is_misc_geneve_set(struct mlx5dr_match_misc *misc)
129+
{
130+
return misc->geneve_vni ||
131+
misc->geneve_oam ||
132+
misc->geneve_protocol_type ||
133+
misc->geneve_opt_len;
134+
}
135+
136+
static bool
137+
dr_matcher_supp_flex_parser_geneve(struct mlx5dr_cmd_caps *caps)
138+
{
139+
return caps->flex_protocols &
140+
MLX5_FLEX_PARSER_GENEVE_ENABLED;
141+
}
142+
143+
static bool
144+
dr_mask_is_flex_parser_tnl_geneve_set(struct mlx5dr_match_param *mask,
145+
struct mlx5dr_domain *dmn)
146+
{
147+
return dr_mask_is_misc_geneve_set(&mask->misc) &&
148+
dr_matcher_supp_flex_parser_geneve(&dmn->info.caps);
149+
}
150+
112151
static bool dr_mask_is_flex_parser_icmpv6_set(struct mlx5dr_match_misc3 *misc3)
113152
{
114153
return (misc3->icmpv6_type || misc3->icmpv6_code ||
@@ -137,13 +176,6 @@ static bool dr_mask_is_gvmi_or_qpn_set(struct mlx5dr_match_misc *misc)
137176
return (misc->source_sqn || misc->source_port);
138177
}
139178

140-
static bool
141-
dr_matcher_supp_flex_parser_vxlan_gpe(struct mlx5dr_domain *dmn)
142-
{
143-
return dmn->info.caps.flex_protocols &
144-
MLX5_FLEX_PARSER_VXLAN_GPE_ENABLED;
145-
}
146-
147179
int mlx5dr_matcher_select_builders(struct mlx5dr_matcher *matcher,
148180
struct mlx5dr_matcher_rx_tx *nic_matcher,
149181
enum mlx5dr_ipv outer_ipv,
@@ -262,10 +294,14 @@ static int dr_matcher_set_ste_builders(struct mlx5dr_matcher *matcher,
262294
inner, rx);
263295
}
264296

265-
if (dr_mask_is_flex_parser_tnl_set(&mask.misc3) &&
266-
dr_matcher_supp_flex_parser_vxlan_gpe(dmn))
267-
mlx5dr_ste_build_flex_parser_tnl(&sb[idx++], &mask,
268-
inner, rx);
297+
if (dr_mask_is_flex_parser_tnl_vxlan_gpe_set(&mask, dmn))
298+
mlx5dr_ste_build_flex_parser_tnl_vxlan_gpe(&sb[idx++],
299+
&mask,
300+
inner, rx);
301+
else if (dr_mask_is_flex_parser_tnl_geneve_set(&mask, dmn))
302+
mlx5dr_ste_build_flex_parser_tnl_geneve(&sb[idx++],
303+
&mask,
304+
inner, rx);
269305

270306
if (DR_MASK_IS_ETH_L4_MISC_SET(mask.misc3, outer))
271307
mlx5dr_ste_build_eth_l4_misc(&sb[idx++], &mask, inner, rx);

drivers/net/ethernet/mellanox/mlx5/core/steering/dr_ste.c

Lines changed: 84 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -2083,68 +2083,110 @@ void mlx5dr_ste_build_eth_l4_misc(struct mlx5dr_ste_build *sb,
20832083
sb->ste_build_tag_func = &dr_ste_build_eth_l4_misc_tag;
20842084
}
20852085

2086-
static void dr_ste_build_flex_parser_tnl_bit_mask(struct mlx5dr_match_param *value,
2087-
bool inner, u8 *bit_mask)
2086+
static void
2087+
dr_ste_build_flex_parser_tnl_vxlan_gpe_bit_mask(struct mlx5dr_match_param *value,
2088+
bool inner, u8 *bit_mask)
20882089
{
20892090
struct mlx5dr_match_misc3 *misc_3_mask = &value->misc3;
20902091

2091-
if (misc_3_mask->outer_vxlan_gpe_flags ||
2092-
misc_3_mask->outer_vxlan_gpe_next_protocol) {
2093-
MLX5_SET(ste_flex_parser_tnl, bit_mask,
2094-
flex_parser_tunneling_header_63_32,
2095-
(misc_3_mask->outer_vxlan_gpe_flags << 24) |
2096-
(misc_3_mask->outer_vxlan_gpe_next_protocol));
2097-
misc_3_mask->outer_vxlan_gpe_flags = 0;
2098-
misc_3_mask->outer_vxlan_gpe_next_protocol = 0;
2099-
}
2100-
2101-
if (misc_3_mask->outer_vxlan_gpe_vni) {
2102-
MLX5_SET(ste_flex_parser_tnl, bit_mask,
2103-
flex_parser_tunneling_header_31_0,
2104-
misc_3_mask->outer_vxlan_gpe_vni << 8);
2105-
misc_3_mask->outer_vxlan_gpe_vni = 0;
2106-
}
2092+
DR_STE_SET_MASK_V(flex_parser_tnl_vxlan_gpe, bit_mask,
2093+
outer_vxlan_gpe_flags,
2094+
misc_3_mask, outer_vxlan_gpe_flags);
2095+
DR_STE_SET_MASK_V(flex_parser_tnl_vxlan_gpe, bit_mask,
2096+
outer_vxlan_gpe_next_protocol,
2097+
misc_3_mask, outer_vxlan_gpe_next_protocol);
2098+
DR_STE_SET_MASK_V(flex_parser_tnl_vxlan_gpe, bit_mask,
2099+
outer_vxlan_gpe_vni,
2100+
misc_3_mask, outer_vxlan_gpe_vni);
21072101
}
21082102

2109-
static int dr_ste_build_flex_parser_tnl_tag(struct mlx5dr_match_param *value,
2110-
struct mlx5dr_ste_build *sb,
2111-
u8 *hw_ste_p)
2103+
static int
2104+
dr_ste_build_flex_parser_tnl_vxlan_gpe_tag(struct mlx5dr_match_param *value,
2105+
struct mlx5dr_ste_build *sb,
2106+
u8 *hw_ste_p)
21122107
{
21132108
struct dr_hw_ste_format *hw_ste = (struct dr_hw_ste_format *)hw_ste_p;
21142109
struct mlx5dr_match_misc3 *misc3 = &value->misc3;
21152110
u8 *tag = hw_ste->tag;
21162111

2117-
if (misc3->outer_vxlan_gpe_flags ||
2118-
misc3->outer_vxlan_gpe_next_protocol) {
2119-
MLX5_SET(ste_flex_parser_tnl, tag,
2120-
flex_parser_tunneling_header_63_32,
2121-
(misc3->outer_vxlan_gpe_flags << 24) |
2122-
(misc3->outer_vxlan_gpe_next_protocol));
2123-
misc3->outer_vxlan_gpe_flags = 0;
2124-
misc3->outer_vxlan_gpe_next_protocol = 0;
2125-
}
2126-
2127-
if (misc3->outer_vxlan_gpe_vni) {
2128-
MLX5_SET(ste_flex_parser_tnl, tag,
2129-
flex_parser_tunneling_header_31_0,
2130-
misc3->outer_vxlan_gpe_vni << 8);
2131-
misc3->outer_vxlan_gpe_vni = 0;
2132-
}
2112+
DR_STE_SET_TAG(flex_parser_tnl_vxlan_gpe, tag,
2113+
outer_vxlan_gpe_flags, misc3,
2114+
outer_vxlan_gpe_flags);
2115+
DR_STE_SET_TAG(flex_parser_tnl_vxlan_gpe, tag,
2116+
outer_vxlan_gpe_next_protocol, misc3,
2117+
outer_vxlan_gpe_next_protocol);
2118+
DR_STE_SET_TAG(flex_parser_tnl_vxlan_gpe, tag,
2119+
outer_vxlan_gpe_vni, misc3,
2120+
outer_vxlan_gpe_vni);
21332121

21342122
return 0;
21352123
}
21362124

2137-
void mlx5dr_ste_build_flex_parser_tnl(struct mlx5dr_ste_build *sb,
2138-
struct mlx5dr_match_param *mask,
2139-
bool inner, bool rx)
2125+
void mlx5dr_ste_build_flex_parser_tnl_vxlan_gpe(struct mlx5dr_ste_build *sb,
2126+
struct mlx5dr_match_param *mask,
2127+
bool inner, bool rx)
2128+
{
2129+
dr_ste_build_flex_parser_tnl_vxlan_gpe_bit_mask(mask, inner,
2130+
sb->bit_mask);
2131+
2132+
sb->rx = rx;
2133+
sb->inner = inner;
2134+
sb->lu_type = MLX5DR_STE_LU_TYPE_FLEX_PARSER_TNL_HEADER;
2135+
sb->byte_mask = dr_ste_conv_bit_to_byte_mask(sb->bit_mask);
2136+
sb->ste_build_tag_func = &dr_ste_build_flex_parser_tnl_vxlan_gpe_tag;
2137+
}
2138+
2139+
static void
2140+
dr_ste_build_flex_parser_tnl_geneve_bit_mask(struct mlx5dr_match_param *value,
2141+
u8 *bit_mask)
21402142
{
2141-
dr_ste_build_flex_parser_tnl_bit_mask(mask, inner, sb->bit_mask);
2143+
struct mlx5dr_match_misc *misc_mask = &value->misc;
21422144

2145+
DR_STE_SET_MASK_V(flex_parser_tnl_geneve, bit_mask,
2146+
geneve_protocol_type,
2147+
misc_mask, geneve_protocol_type);
2148+
DR_STE_SET_MASK_V(flex_parser_tnl_geneve, bit_mask,
2149+
geneve_oam,
2150+
misc_mask, geneve_oam);
2151+
DR_STE_SET_MASK_V(flex_parser_tnl_geneve, bit_mask,
2152+
geneve_opt_len,
2153+
misc_mask, geneve_opt_len);
2154+
DR_STE_SET_MASK_V(flex_parser_tnl_geneve, bit_mask,
2155+
geneve_vni,
2156+
misc_mask, geneve_vni);
2157+
}
2158+
2159+
static int
2160+
dr_ste_build_flex_parser_tnl_geneve_tag(struct mlx5dr_match_param *value,
2161+
struct mlx5dr_ste_build *sb,
2162+
u8 *hw_ste_p)
2163+
{
2164+
struct dr_hw_ste_format *hw_ste = (struct dr_hw_ste_format *)hw_ste_p;
2165+
struct mlx5dr_match_misc *misc = &value->misc;
2166+
u8 *tag = hw_ste->tag;
2167+
2168+
DR_STE_SET_TAG(flex_parser_tnl_geneve, tag,
2169+
geneve_protocol_type, misc, geneve_protocol_type);
2170+
DR_STE_SET_TAG(flex_parser_tnl_geneve, tag,
2171+
geneve_oam, misc, geneve_oam);
2172+
DR_STE_SET_TAG(flex_parser_tnl_geneve, tag,
2173+
geneve_opt_len, misc, geneve_opt_len);
2174+
DR_STE_SET_TAG(flex_parser_tnl_geneve, tag,
2175+
geneve_vni, misc, geneve_vni);
2176+
2177+
return 0;
2178+
}
2179+
2180+
void mlx5dr_ste_build_flex_parser_tnl_geneve(struct mlx5dr_ste_build *sb,
2181+
struct mlx5dr_match_param *mask,
2182+
bool inner, bool rx)
2183+
{
2184+
dr_ste_build_flex_parser_tnl_geneve_bit_mask(mask, sb->bit_mask);
21432185
sb->rx = rx;
21442186
sb->inner = inner;
21452187
sb->lu_type = MLX5DR_STE_LU_TYPE_FLEX_PARSER_TNL_HEADER;
21462188
sb->byte_mask = dr_ste_conv_bit_to_byte_mask(sb->bit_mask);
2147-
sb->ste_build_tag_func = &dr_ste_build_flex_parser_tnl_tag;
2189+
sb->ste_build_tag_func = &dr_ste_build_flex_parser_tnl_geneve_tag;
21482190
}
21492191

21502192
static void dr_ste_build_register_0_bit_mask(struct mlx5dr_match_param *value,

drivers/net/ethernet/mellanox/mlx5/core/steering/dr_types.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -325,9 +325,12 @@ int mlx5dr_ste_build_flex_parser_1(struct mlx5dr_ste_build *sb,
325325
struct mlx5dr_match_param *mask,
326326
struct mlx5dr_cmd_caps *caps,
327327
bool inner, bool rx);
328-
void mlx5dr_ste_build_flex_parser_tnl(struct mlx5dr_ste_build *sb,
329-
struct mlx5dr_match_param *mask,
330-
bool inner, bool rx);
328+
void mlx5dr_ste_build_flex_parser_tnl_vxlan_gpe(struct mlx5dr_ste_build *sb,
329+
struct mlx5dr_match_param *mask,
330+
bool inner, bool rx);
331+
void mlx5dr_ste_build_flex_parser_tnl_geneve(struct mlx5dr_ste_build *sb,
332+
struct mlx5dr_match_param *mask,
333+
bool inner, bool rx);
331334
void mlx5dr_ste_build_general_purpose(struct mlx5dr_ste_build *sb,
332335
struct mlx5dr_match_param *mask,
333336
bool inner, bool rx);

drivers/net/ethernet/mellanox/mlx5/core/steering/mlx5_ifc_dr.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -548,6 +548,30 @@ struct mlx5_ifc_ste_flex_parser_tnl_bits {
548548
u8 reserved_at_40[0x40];
549549
};
550550

551+
struct mlx5_ifc_ste_flex_parser_tnl_vxlan_gpe_bits {
552+
u8 outer_vxlan_gpe_flags[0x8];
553+
u8 reserved_at_8[0x10];
554+
u8 outer_vxlan_gpe_next_protocol[0x8];
555+
556+
u8 outer_vxlan_gpe_vni[0x18];
557+
u8 reserved_at_38[0x8];
558+
559+
u8 reserved_at_40[0x40];
560+
};
561+
562+
struct mlx5_ifc_ste_flex_parser_tnl_geneve_bits {
563+
u8 reserved_at_0[0x2];
564+
u8 geneve_opt_len[0x6];
565+
u8 geneve_oam[0x1];
566+
u8 reserved_at_9[0x7];
567+
u8 geneve_protocol_type[0x10];
568+
569+
u8 geneve_vni[0x18];
570+
u8 reserved_at_38[0x8];
571+
572+
u8 reserved_at_40[0x40];
573+
};
574+
551575
struct mlx5_ifc_ste_general_purpose_bits {
552576
u8 general_purpose_lookup_field[0x20];
553577

0 commit comments

Comments
 (0)