mirror of
https://github.com/torvalds/linux.git
synced 2026-05-23 22:52:19 +02:00
Merge branch '100GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/next-queue
Tony Nguyen says: ==================== Intel Wired LAN Driver Updates 2024-04-17 (ice) This series contains updates to ice driver only. Marcin adds Tx malicious driver detection (MDD) events to be included as part of mdd-auto-reset-vf. Dariusz removes unnecessary implementation of ndo_get_phys_port_name. * '100GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/next-queue: ice: Remove ndo_get_phys_port_name ice: Add automatic VF reset on Tx MDD events ==================== Link: https://lore.kernel.org/r/20240417165634.2081793-1-anthony.l.nguyen@intel.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
80d953c832
|
|
@ -1745,6 +1745,39 @@ static void ice_service_timer(struct timer_list *t)
|
|||
ice_service_task_schedule(pf);
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_mdd_maybe_reset_vf - reset VF after MDD event
|
||||
* @pf: pointer to the PF structure
|
||||
* @vf: pointer to the VF structure
|
||||
* @reset_vf_tx: whether Tx MDD has occurred
|
||||
* @reset_vf_rx: whether Rx MDD has occurred
|
||||
*
|
||||
* Since the queue can get stuck on VF MDD events, the PF can be configured to
|
||||
* automatically reset the VF by enabling the private ethtool flag
|
||||
* mdd-auto-reset-vf.
|
||||
*/
|
||||
static void ice_mdd_maybe_reset_vf(struct ice_pf *pf, struct ice_vf *vf,
|
||||
bool reset_vf_tx, bool reset_vf_rx)
|
||||
{
|
||||
struct device *dev = ice_pf_to_dev(pf);
|
||||
|
||||
if (!test_bit(ICE_FLAG_MDD_AUTO_RESET_VF, pf->flags))
|
||||
return;
|
||||
|
||||
/* VF MDD event counters will be cleared by reset, so print the event
|
||||
* prior to reset.
|
||||
*/
|
||||
if (reset_vf_tx)
|
||||
ice_print_vf_tx_mdd_event(vf);
|
||||
|
||||
if (reset_vf_rx)
|
||||
ice_print_vf_rx_mdd_event(vf);
|
||||
|
||||
dev_info(dev, "PF-to-VF reset on PF %d VF %d due to MDD event\n",
|
||||
pf->hw.pf_id, vf->vf_id);
|
||||
ice_reset_vf(vf, ICE_VF_RESET_NOTIFY | ICE_VF_RESET_LOCK);
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_handle_mdd_event - handle malicious driver detect event
|
||||
* @pf: pointer to the PF structure
|
||||
|
|
@ -1838,6 +1871,8 @@ static void ice_handle_mdd_event(struct ice_pf *pf)
|
|||
*/
|
||||
mutex_lock(&pf->vfs.table_lock);
|
||||
ice_for_each_vf(pf, bkt, vf) {
|
||||
bool reset_vf_tx = false, reset_vf_rx = false;
|
||||
|
||||
reg = rd32(hw, VP_MDET_TX_PQM(vf->vf_id));
|
||||
if (reg & VP_MDET_TX_PQM_VALID_M) {
|
||||
wr32(hw, VP_MDET_TX_PQM(vf->vf_id), 0xFFFF);
|
||||
|
|
@ -1846,6 +1881,8 @@ static void ice_handle_mdd_event(struct ice_pf *pf)
|
|||
if (netif_msg_tx_err(pf))
|
||||
dev_info(dev, "Malicious Driver Detection event TX_PQM detected on VF %d\n",
|
||||
vf->vf_id);
|
||||
|
||||
reset_vf_tx = true;
|
||||
}
|
||||
|
||||
reg = rd32(hw, VP_MDET_TX_TCLAN(vf->vf_id));
|
||||
|
|
@ -1856,6 +1893,8 @@ static void ice_handle_mdd_event(struct ice_pf *pf)
|
|||
if (netif_msg_tx_err(pf))
|
||||
dev_info(dev, "Malicious Driver Detection event TX_TCLAN detected on VF %d\n",
|
||||
vf->vf_id);
|
||||
|
||||
reset_vf_tx = true;
|
||||
}
|
||||
|
||||
reg = rd32(hw, VP_MDET_TX_TDPU(vf->vf_id));
|
||||
|
|
@ -1866,6 +1905,8 @@ static void ice_handle_mdd_event(struct ice_pf *pf)
|
|||
if (netif_msg_tx_err(pf))
|
||||
dev_info(dev, "Malicious Driver Detection event TX_TDPU detected on VF %d\n",
|
||||
vf->vf_id);
|
||||
|
||||
reset_vf_tx = true;
|
||||
}
|
||||
|
||||
reg = rd32(hw, VP_MDET_RX(vf->vf_id));
|
||||
|
|
@ -1877,18 +1918,12 @@ static void ice_handle_mdd_event(struct ice_pf *pf)
|
|||
dev_info(dev, "Malicious Driver Detection event RX detected on VF %d\n",
|
||||
vf->vf_id);
|
||||
|
||||
/* Since the queue is disabled on VF Rx MDD events, the
|
||||
* PF can be configured to reset the VF through ethtool
|
||||
* private flag mdd-auto-reset-vf.
|
||||
*/
|
||||
if (test_bit(ICE_FLAG_MDD_AUTO_RESET_VF, pf->flags)) {
|
||||
/* VF MDD event counters will be cleared by
|
||||
* reset, so print the event prior to reset.
|
||||
*/
|
||||
ice_print_vf_rx_mdd_event(vf);
|
||||
ice_reset_vf(vf, ICE_VF_RESET_LOCK);
|
||||
}
|
||||
reset_vf_rx = true;
|
||||
}
|
||||
|
||||
if (reset_vf_tx || reset_vf_rx)
|
||||
ice_mdd_maybe_reset_vf(pf, vf, reset_vf_tx,
|
||||
reset_vf_rx);
|
||||
}
|
||||
mutex_unlock(&pf->vfs.table_lock);
|
||||
|
||||
|
|
|
|||
|
|
@ -9,39 +9,6 @@
|
|||
#include "ice_tc_lib.h"
|
||||
#include "ice_dcb_lib.h"
|
||||
|
||||
/**
|
||||
* ice_repr_get_sw_port_id - get port ID associated with representor
|
||||
* @repr: pointer to port representor
|
||||
*/
|
||||
static int ice_repr_get_sw_port_id(struct ice_repr *repr)
|
||||
{
|
||||
return repr->src_vsi->back->hw.port_info->lport;
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_repr_get_phys_port_name - get phys port name
|
||||
* @netdev: pointer to port representor netdev
|
||||
* @buf: write here port name
|
||||
* @len: max length of buf
|
||||
*/
|
||||
static int
|
||||
ice_repr_get_phys_port_name(struct net_device *netdev, char *buf, size_t len)
|
||||
{
|
||||
struct ice_netdev_priv *np = netdev_priv(netdev);
|
||||
struct ice_repr *repr = np->repr;
|
||||
int res;
|
||||
|
||||
/* Devlink port is registered and devlink core is taking care of name formatting. */
|
||||
if (repr->vf->devlink_port.devlink)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
res = snprintf(buf, len, "pf%dvfr%d", ice_repr_get_sw_port_id(repr),
|
||||
repr->id);
|
||||
if (res <= 0)
|
||||
return -EOPNOTSUPP;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_repr_inc_tx_stats - increment Tx statistic by one packet
|
||||
* @repr: repr to increment stats on
|
||||
|
|
@ -279,7 +246,6 @@ ice_repr_setup_tc(struct net_device *netdev, enum tc_setup_type type,
|
|||
}
|
||||
|
||||
static const struct net_device_ops ice_repr_netdev_ops = {
|
||||
.ndo_get_phys_port_name = ice_repr_get_phys_port_name,
|
||||
.ndo_get_stats64 = ice_repr_get_stats64,
|
||||
.ndo_open = ice_repr_open,
|
||||
.ndo_stop = ice_repr_stop,
|
||||
|
|
|
|||
|
|
@ -1861,6 +1861,24 @@ void ice_print_vf_rx_mdd_event(struct ice_vf *vf)
|
|||
? "on" : "off");
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_print_vf_tx_mdd_event - print VF Tx malicious driver detect event
|
||||
* @vf: pointer to the VF structure
|
||||
*/
|
||||
void ice_print_vf_tx_mdd_event(struct ice_vf *vf)
|
||||
{
|
||||
struct ice_pf *pf = vf->pf;
|
||||
struct device *dev;
|
||||
|
||||
dev = ice_pf_to_dev(pf);
|
||||
|
||||
dev_info(dev, "%d Tx Malicious Driver Detection events detected on PF %d VF %d MAC %pM. mdd-auto-reset-vfs=%s\n",
|
||||
vf->mdd_tx_events.count, pf->hw.pf_id, vf->vf_id,
|
||||
vf->dev_lan_addr,
|
||||
test_bit(ICE_FLAG_MDD_AUTO_RESET_VF, pf->flags)
|
||||
? "on" : "off");
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_print_vfs_mdd_events - print VFs malicious driver detect event
|
||||
* @pf: pointer to the PF structure
|
||||
|
|
@ -1869,8 +1887,6 @@ void ice_print_vf_rx_mdd_event(struct ice_vf *vf)
|
|||
*/
|
||||
void ice_print_vfs_mdd_events(struct ice_pf *pf)
|
||||
{
|
||||
struct device *dev = ice_pf_to_dev(pf);
|
||||
struct ice_hw *hw = &pf->hw;
|
||||
struct ice_vf *vf;
|
||||
unsigned int bkt;
|
||||
|
||||
|
|
@ -1897,10 +1913,7 @@ void ice_print_vfs_mdd_events(struct ice_pf *pf)
|
|||
if (vf->mdd_tx_events.count != vf->mdd_tx_events.last_printed) {
|
||||
vf->mdd_tx_events.last_printed =
|
||||
vf->mdd_tx_events.count;
|
||||
|
||||
dev_info(dev, "%d Tx Malicious Driver Detection events detected on PF %d VF %d MAC %pM.\n",
|
||||
vf->mdd_tx_events.count, hw->pf_id, vf->vf_id,
|
||||
vf->dev_lan_addr);
|
||||
ice_print_vf_tx_mdd_event(vf);
|
||||
}
|
||||
}
|
||||
mutex_unlock(&pf->vfs.table_lock);
|
||||
|
|
|
|||
|
|
@ -58,6 +58,7 @@ void
|
|||
ice_vf_lan_overflow_event(struct ice_pf *pf, struct ice_rq_event_info *event);
|
||||
void ice_print_vfs_mdd_events(struct ice_pf *pf);
|
||||
void ice_print_vf_rx_mdd_event(struct ice_vf *vf);
|
||||
void ice_print_vf_tx_mdd_event(struct ice_vf *vf);
|
||||
bool
|
||||
ice_vc_validate_pattern(struct ice_vf *vf, struct virtchnl_proto_hdrs *proto);
|
||||
u32 ice_sriov_get_vf_total_msix(struct pci_dev *pdev);
|
||||
|
|
@ -69,6 +70,7 @@ static inline
|
|||
void ice_vf_lan_overflow_event(struct ice_pf *pf, struct ice_rq_event_info *event) { }
|
||||
static inline void ice_print_vfs_mdd_events(struct ice_pf *pf) { }
|
||||
static inline void ice_print_vf_rx_mdd_event(struct ice_vf *vf) { }
|
||||
static inline void ice_print_vf_tx_mdd_event(struct ice_vf *vf) { }
|
||||
static inline void ice_restore_all_vfs_msi_state(struct ice_pf *pf) { }
|
||||
|
||||
static inline int
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user