Skip to content

Commit

Permalink
ice: default Tx rule instead of to queue
Browse files Browse the repository at this point in the history
Steer all packets that miss other rules to PF VSI. Previously in
switchdev mode, PF VSI received missed packets, but only ones marked
as Rx. Now it is receiving all missed packets.

To queue rule per PR isn't needed, because we use PF VSI instead of
control VSI now, and it's already correctly configured.

Add flag to correctly set LAN_EN bit in default Tx rule. It shouldn't
allow packet to go outside when there is a match.

Reviewed-by: Marcin Szycik <marcin.szycik@linux.intel.com>
Signed-off-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>
Tested-by: Sujai Buvaneswaran <sujai.buvaneswaran@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
  • Loading branch information
Michal Swiatkowski authored and anguy11 committed Mar 25, 2024
1 parent defd524 commit 50d6202
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 97 deletions.
107 changes: 16 additions & 91 deletions drivers/net/ethernet/intel/ice/ice_eswitch.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,85 +10,6 @@
#include "ice_devlink.h"
#include "ice_tc_lib.h"

/**
* ice_eswitch_del_sp_rules - delete adv rules added on PRs
* @pf: pointer to the PF struct
*
* Delete all advanced rules that were used to forward packets with the
* device's VSI index to the corresponding eswitch ctrl VSI queue.
*/
static void ice_eswitch_del_sp_rules(struct ice_pf *pf)
{
struct ice_repr *repr;
unsigned long id;

xa_for_each(&pf->eswitch.reprs, id, repr) {
if (repr->sp_rule.rid)
ice_rem_adv_rule_by_id(&pf->hw, &repr->sp_rule);
}
}

/**
* ice_eswitch_add_sp_rule - add adv rule with device's VSI index
* @pf: pointer to PF struct
* @repr: pointer to the repr struct
*
* This function adds advanced rule that forwards packets with
* device's VSI index to the corresponding eswitch ctrl VSI queue.
*/
static int ice_eswitch_add_sp_rule(struct ice_pf *pf, struct ice_repr *repr)
{
struct ice_vsi *ctrl_vsi = pf->eswitch.control_vsi;
struct ice_adv_rule_info rule_info = { 0 };
struct ice_adv_lkup_elem *list;
struct ice_hw *hw = &pf->hw;
const u16 lkups_cnt = 1;
int err;

list = kcalloc(lkups_cnt, sizeof(*list), GFP_ATOMIC);
if (!list)
return -ENOMEM;

ice_rule_add_src_vsi_metadata(list);

rule_info.sw_act.flag = ICE_FLTR_TX;
rule_info.sw_act.vsi_handle = ctrl_vsi->idx;
rule_info.sw_act.fltr_act = ICE_FWD_TO_Q;
rule_info.sw_act.fwd_id.q_id = hw->func_caps.common_cap.rxq_first_id +
ctrl_vsi->rxq_map[repr->q_id];
rule_info.flags_info.act |= ICE_SINGLE_ACT_LB_ENABLE;
rule_info.flags_info.act_valid = true;
rule_info.tun_type = ICE_SW_TUN_AND_NON_TUN;
rule_info.src_vsi = repr->src_vsi->idx;

err = ice_add_adv_rule(hw, list, lkups_cnt, &rule_info,
&repr->sp_rule);
if (err)
dev_err(ice_pf_to_dev(pf), "Unable to add slow-path rule for eswitch for PR %d",
repr->id);

kfree(list);
return err;
}

static int
ice_eswitch_add_sp_rules(struct ice_pf *pf)
{
struct ice_repr *repr;
unsigned long id;
int err;

xa_for_each(&pf->eswitch.reprs, id, repr) {
err = ice_eswitch_add_sp_rule(pf, repr);
if (err) {
ice_eswitch_del_sp_rules(pf);
return err;
}
}

return 0;
}

/**
* ice_eswitch_setup_env - configure eswitch HW filters
* @pf: pointer to PF struct
Expand All @@ -102,7 +23,6 @@ static int ice_eswitch_setup_env(struct ice_pf *pf)
struct ice_vsi *ctrl_vsi = pf->eswitch.control_vsi;
struct net_device *netdev = uplink_vsi->netdev;
struct ice_vsi_vlan_ops *vlan_ops;
bool rule_added = false;

ice_remove_vsi_fltr(&pf->hw, uplink_vsi->idx);

Expand All @@ -112,17 +32,19 @@ static int ice_eswitch_setup_env(struct ice_pf *pf)
netif_addr_unlock_bh(netdev);

if (ice_vsi_add_vlan_zero(uplink_vsi))
goto err_vlan_zero;

if (ice_cfg_dflt_vsi(uplink_vsi->port_info, uplink_vsi->idx, true,
ICE_FLTR_RX))
goto err_def_rx;

if (!ice_is_dflt_vsi_in_use(uplink_vsi->port_info)) {
if (ice_set_dflt_vsi(uplink_vsi))
goto err_def_rx;
rule_added = true;
}
if (ice_cfg_dflt_vsi(uplink_vsi->port_info, uplink_vsi->idx, true,
ICE_FLTR_TX))
goto err_def_tx;

vlan_ops = ice_get_compat_vsi_vlan_ops(uplink_vsi);
if (vlan_ops->dis_rx_filtering(uplink_vsi))
goto err_dis_rx;
goto err_vlan_filtering;

if (ice_vsi_update_security(uplink_vsi, ice_vsi_ctx_set_allow_override))
goto err_override_uplink;
Expand All @@ -141,10 +63,15 @@ static int ice_eswitch_setup_env(struct ice_pf *pf)
ice_vsi_update_security(uplink_vsi, ice_vsi_ctx_clear_allow_override);
err_override_uplink:
vlan_ops->ena_rx_filtering(uplink_vsi);
err_dis_rx:
if (rule_added)
ice_clear_dflt_vsi(uplink_vsi);
err_vlan_filtering:
ice_cfg_dflt_vsi(uplink_vsi->port_info, uplink_vsi->idx, false,
ICE_FLTR_TX);
err_def_tx:
ice_cfg_dflt_vsi(uplink_vsi->port_info, uplink_vsi->idx, false,
ICE_FLTR_RX);
err_def_rx:
ice_vsi_del_vlan_zero(uplink_vsi);
err_vlan_zero:
ice_fltr_add_mac_and_broadcast(uplink_vsi,
uplink_vsi->port_info->mac.perm_addr,
ICE_FWD_TO_VSI);
Expand Down Expand Up @@ -585,7 +512,6 @@ void ice_eswitch_stop_all_tx_queues(struct ice_pf *pf)

static void ice_eswitch_stop_reprs(struct ice_pf *pf)
{
ice_eswitch_del_sp_rules(pf);
ice_eswitch_stop_all_tx_queues(pf);
ice_eswitch_napi_disable(&pf->eswitch.reprs);
}
Expand All @@ -594,7 +520,6 @@ static void ice_eswitch_start_reprs(struct ice_pf *pf)
{
ice_eswitch_napi_enable(&pf->eswitch.reprs);
ice_eswitch_start_all_tx_queues(pf);
ice_eswitch_add_sp_rules(pf);
}

static void
Expand Down
4 changes: 0 additions & 4 deletions drivers/net/ethernet/intel/ice/ice_repr.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,6 @@ struct ice_repr {
int q_id;
u32 id;
u8 parent_mac[ETH_ALEN];
#ifdef CONFIG_ICE_SWITCHDEV
/* info about slow path rule */
struct ice_rule_query_data sp_rule;
#endif
};

struct ice_repr *ice_repr_add_vf(struct ice_vf *vf);
Expand Down
4 changes: 4 additions & 0 deletions drivers/net/ethernet/intel/ice/ice_switch.c
Original file line number Diff line number Diff line change
Expand Up @@ -2444,6 +2444,9 @@ static void ice_fill_sw_info(struct ice_hw *hw, struct ice_fltr_info *fi)
fi->lan_en = true;
}
}

if (fi->flag & ICE_FLTR_TX_ONLY)
fi->lan_en = false;
}

/**
Expand Down Expand Up @@ -3819,6 +3822,7 @@ ice_cfg_dflt_vsi(struct ice_port_info *pi, u16 vsi_handle, bool set,
} else if (f_info.flag & ICE_FLTR_TX) {
f_info.src_id = ICE_SRC_ID_VSI;
f_info.src = hw_vsi_id;
f_info.flag |= ICE_FLTR_TX_ONLY;
}
f_list_entry.fltr_info = f_info;

Expand Down
5 changes: 3 additions & 2 deletions drivers/net/ethernet/intel/ice/ice_switch.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,9 @@

#define ICE_SW_CFG_MAX_BUF_LEN 2048
#define ICE_DFLT_VSI_INVAL 0xff
#define ICE_FLTR_RX BIT(0)
#define ICE_FLTR_TX BIT(1)
#define ICE_FLTR_RX BIT(0)
#define ICE_FLTR_TX BIT(1)
#define ICE_FLTR_TX_ONLY BIT(2)
#define ICE_VSI_INVAL_ID 0xffff
#define ICE_INVAL_Q_HANDLE 0xFFFF

Expand Down

0 comments on commit 50d6202

Please sign in to comment.