mirror of https://gitee.com/openkylin/linux.git
mlx5-fixes-2019-02-05
-----BEGIN PGP SIGNATURE----- iQEcBAABAgAGBQJcWe2rAAoJEEg/ir3gV/o+lJYH+wTYQGOF6nq4oHJ6csFu1TjW qghfYXdVfCqAVGkxgswMjq+uBwmig4p77DSuCjuIopgSFS2ei/dobVrSIwakQfmF E4PtxLhbhyZ3+imtJJz+X4uqYv2IA48l/P2Hbn8OYutdmkdtnE4x4ENlh7VAZO1y lSvl5KqZEqeUTOqsuPevOrWg0q+Eay39XgFvi692kwhLu+XXdlnNOISFwyBYyGN2 FVSL8ua2VaVxuz6T2KRdHyMFFzNlsuTeVvPKzj0zmDTMMHFLVdJbqJTkWTGUPfkq 4K6yigfd0WdePt4AoJUYVSYfcdh+somP+2/b2rRN+5Ham5tX4l+7ePTm3waEOCc= =XWQA -----END PGP SIGNATURE----- Merge tag 'mlx5-fixes-2019-02-05' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux mlx5-fixes-2019-02-05
This commit is contained in:
commit
9c0bda64ab
|
@ -612,16 +612,18 @@ int mlx5e_tc_tun_parse(struct net_device *filter_dev,
|
|||
struct mlx5_flow_spec *spec,
|
||||
struct tc_cls_flower_offload *f,
|
||||
void *headers_c,
|
||||
void *headers_v)
|
||||
void *headers_v, u8 *match_level)
|
||||
{
|
||||
int tunnel_type;
|
||||
int err = 0;
|
||||
|
||||
tunnel_type = mlx5e_tc_tun_get_type(filter_dev);
|
||||
if (tunnel_type == MLX5E_TC_TUNNEL_TYPE_VXLAN) {
|
||||
*match_level = MLX5_MATCH_L4;
|
||||
err = mlx5e_tc_tun_parse_vxlan(priv, spec, f,
|
||||
headers_c, headers_v);
|
||||
} else if (tunnel_type == MLX5E_TC_TUNNEL_TYPE_GRETAP) {
|
||||
*match_level = MLX5_MATCH_L3;
|
||||
err = mlx5e_tc_tun_parse_gretap(priv, spec, f,
|
||||
headers_c, headers_v);
|
||||
} else {
|
||||
|
|
|
@ -39,6 +39,6 @@ int mlx5e_tc_tun_parse(struct net_device *filter_dev,
|
|||
struct mlx5_flow_spec *spec,
|
||||
struct tc_cls_flower_offload *f,
|
||||
void *headers_c,
|
||||
void *headers_v);
|
||||
void *headers_v, u8 *match_level);
|
||||
|
||||
#endif //__MLX5_EN_TC_TUNNEL_H__
|
||||
|
|
|
@ -1302,7 +1302,7 @@ static void mlx5e_tc_del_flow(struct mlx5e_priv *priv,
|
|||
static int parse_tunnel_attr(struct mlx5e_priv *priv,
|
||||
struct mlx5_flow_spec *spec,
|
||||
struct tc_cls_flower_offload *f,
|
||||
struct net_device *filter_dev)
|
||||
struct net_device *filter_dev, u8 *match_level)
|
||||
{
|
||||
struct netlink_ext_ack *extack = f->common.extack;
|
||||
void *headers_c = MLX5_ADDR_OF(fte_match_param, spec->match_criteria,
|
||||
|
@ -1317,7 +1317,7 @@ static int parse_tunnel_attr(struct mlx5e_priv *priv,
|
|||
int err = 0;
|
||||
|
||||
err = mlx5e_tc_tun_parse(filter_dev, priv, spec, f,
|
||||
headers_c, headers_v);
|
||||
headers_c, headers_v, match_level);
|
||||
if (err) {
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
"failed to parse tunnel attributes");
|
||||
|
@ -1426,7 +1426,7 @@ static int __parse_cls_flower(struct mlx5e_priv *priv,
|
|||
struct mlx5_flow_spec *spec,
|
||||
struct tc_cls_flower_offload *f,
|
||||
struct net_device *filter_dev,
|
||||
u8 *match_level)
|
||||
u8 *match_level, u8 *tunnel_match_level)
|
||||
{
|
||||
struct netlink_ext_ack *extack = f->common.extack;
|
||||
void *headers_c = MLX5_ADDR_OF(fte_match_param, spec->match_criteria,
|
||||
|
@ -1477,7 +1477,7 @@ static int __parse_cls_flower(struct mlx5e_priv *priv,
|
|||
switch (key->addr_type) {
|
||||
case FLOW_DISSECTOR_KEY_IPV4_ADDRS:
|
||||
case FLOW_DISSECTOR_KEY_IPV6_ADDRS:
|
||||
if (parse_tunnel_attr(priv, spec, f, filter_dev))
|
||||
if (parse_tunnel_attr(priv, spec, f, filter_dev, tunnel_match_level))
|
||||
return -EOPNOTSUPP;
|
||||
break;
|
||||
default:
|
||||
|
@ -1826,11 +1826,11 @@ static int parse_cls_flower(struct mlx5e_priv *priv,
|
|||
struct mlx5_core_dev *dev = priv->mdev;
|
||||
struct mlx5_eswitch *esw = dev->priv.eswitch;
|
||||
struct mlx5e_rep_priv *rpriv = priv->ppriv;
|
||||
u8 match_level, tunnel_match_level = MLX5_MATCH_NONE;
|
||||
struct mlx5_eswitch_rep *rep;
|
||||
u8 match_level;
|
||||
int err;
|
||||
|
||||
err = __parse_cls_flower(priv, spec, f, filter_dev, &match_level);
|
||||
err = __parse_cls_flower(priv, spec, f, filter_dev, &match_level, &tunnel_match_level);
|
||||
|
||||
if (!err && (flow->flags & MLX5E_TC_FLOW_ESWITCH)) {
|
||||
rep = rpriv->rep;
|
||||
|
@ -1846,10 +1846,12 @@ static int parse_cls_flower(struct mlx5e_priv *priv,
|
|||
}
|
||||
}
|
||||
|
||||
if (flow->flags & MLX5E_TC_FLOW_ESWITCH)
|
||||
if (flow->flags & MLX5E_TC_FLOW_ESWITCH) {
|
||||
flow->esw_attr->match_level = match_level;
|
||||
else
|
||||
flow->esw_attr->tunnel_match_level = tunnel_match_level;
|
||||
} else {
|
||||
flow->nic_attr->match_level = match_level;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
@ -2179,6 +2181,7 @@ static bool csum_offload_supported(struct mlx5e_priv *priv,
|
|||
|
||||
static bool modify_header_match_supported(struct mlx5_flow_spec *spec,
|
||||
struct tcf_exts *exts,
|
||||
u32 actions,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
const struct tc_action *a;
|
||||
|
@ -2188,7 +2191,11 @@ static bool modify_header_match_supported(struct mlx5_flow_spec *spec,
|
|||
u16 ethertype;
|
||||
int nkeys, i;
|
||||
|
||||
headers_v = MLX5_ADDR_OF(fte_match_param, spec->match_value, outer_headers);
|
||||
if (actions & MLX5_FLOW_CONTEXT_ACTION_DECAP)
|
||||
headers_v = MLX5_ADDR_OF(fte_match_param, spec->match_value, inner_headers);
|
||||
else
|
||||
headers_v = MLX5_ADDR_OF(fte_match_param, spec->match_value, outer_headers);
|
||||
|
||||
ethertype = MLX5_GET(fte_match_set_lyr_2_4, headers_v, ethertype);
|
||||
|
||||
/* for non-IP we only re-write MACs, so we're okay */
|
||||
|
@ -2245,7 +2252,7 @@ static bool actions_match_supported(struct mlx5e_priv *priv,
|
|||
|
||||
if (actions & MLX5_FLOW_CONTEXT_ACTION_MOD_HDR)
|
||||
return modify_header_match_supported(&parse_attr->spec, exts,
|
||||
extack);
|
||||
actions, extack);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -387,8 +387,14 @@ netdev_tx_t mlx5e_sq_xmit(struct mlx5e_txqsq *sq, struct sk_buff *skb,
|
|||
num_wqebbs = DIV_ROUND_UP(ds_cnt, MLX5_SEND_WQEBB_NUM_DS);
|
||||
contig_wqebbs_room = mlx5_wq_cyc_get_contig_wqebbs(wq, pi);
|
||||
if (unlikely(contig_wqebbs_room < num_wqebbs)) {
|
||||
#ifdef CONFIG_MLX5_EN_IPSEC
|
||||
struct mlx5_wqe_eth_seg cur_eth = wqe->eth;
|
||||
#endif
|
||||
mlx5e_fill_sq_frag_edge(sq, wq, pi, contig_wqebbs_room);
|
||||
mlx5e_sq_fetch_wqe(sq, &wqe, &pi);
|
||||
#ifdef CONFIG_MLX5_EN_IPSEC
|
||||
wqe->eth = cur_eth;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* fill wqe */
|
||||
|
|
|
@ -312,6 +312,7 @@ struct mlx5_esw_flow_attr {
|
|||
} dests[MLX5_MAX_FLOW_FWD_VPORTS];
|
||||
u32 mod_hdr_id;
|
||||
u8 match_level;
|
||||
u8 tunnel_match_level;
|
||||
struct mlx5_fc *counter;
|
||||
u32 chain;
|
||||
u16 prio;
|
||||
|
|
|
@ -160,14 +160,15 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
|
|||
MLX5_SET_TO_ONES(fte_match_set_misc, misc,
|
||||
source_eswitch_owner_vhca_id);
|
||||
|
||||
if (attr->match_level == MLX5_MATCH_NONE)
|
||||
spec->match_criteria_enable = MLX5_MATCH_MISC_PARAMETERS;
|
||||
else
|
||||
spec->match_criteria_enable = MLX5_MATCH_OUTER_HEADERS |
|
||||
MLX5_MATCH_MISC_PARAMETERS;
|
||||
|
||||
if (flow_act.action & MLX5_FLOW_CONTEXT_ACTION_DECAP)
|
||||
spec->match_criteria_enable |= MLX5_MATCH_INNER_HEADERS;
|
||||
spec->match_criteria_enable = MLX5_MATCH_MISC_PARAMETERS;
|
||||
if (flow_act.action & MLX5_FLOW_CONTEXT_ACTION_DECAP) {
|
||||
if (attr->tunnel_match_level != MLX5_MATCH_NONE)
|
||||
spec->match_criteria_enable |= MLX5_MATCH_OUTER_HEADERS;
|
||||
if (attr->match_level != MLX5_MATCH_NONE)
|
||||
spec->match_criteria_enable |= MLX5_MATCH_INNER_HEADERS;
|
||||
} else if (attr->match_level != MLX5_MATCH_NONE) {
|
||||
spec->match_criteria_enable |= MLX5_MATCH_OUTER_HEADERS;
|
||||
}
|
||||
|
||||
if (flow_act.action & MLX5_FLOW_CONTEXT_ACTION_MOD_HDR)
|
||||
flow_act.modify_id = attr->mod_hdr_id;
|
||||
|
|
Loading…
Reference in New Issue