mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 10:31:46 +09:00
ice: Fix RDMA VSI removal during queue rebuild
[ Upstream commit4b31fd4d77] During qdisc create/delete, it is necessary to rebuild the queue of VSIs. An error occurred because the VSIs created by RDMA were still active. Added check if RDMA is active. If yes, it disallows qdisc changes and writes a message in the system logs. Fixes:348048e724("ice: Implement iidc operations") Signed-off-by: Rafal Rogalski <rafalx.rogalski@intel.com> Signed-off-by: Mateusz Palczewski <mateusz.palczewski@intel.com> Signed-off-by: Kamil Maziarz <kamil.maziarz@intel.com> Tested-by: Bharathi Sreenivas <bharathi.sreenivas@intel.com> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com> Reviewed-by: Leon Romanovsky <leonro@nvidia.com> Link: https://lore.kernel.org/r/20230728171243.2446101-1-anthony.l.nguyen@intel.com Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
0b45af982a
commit
4461b2cae3
@@ -8777,6 +8777,7 @@ ice_setup_tc(struct net_device *netdev, enum tc_setup_type type,
|
||||
{
|
||||
struct ice_netdev_priv *np = netdev_priv(netdev);
|
||||
struct ice_pf *pf = np->vsi->back;
|
||||
bool locked = false;
|
||||
int err;
|
||||
|
||||
switch (type) {
|
||||
@@ -8786,10 +8787,27 @@ ice_setup_tc(struct net_device *netdev, enum tc_setup_type type,
|
||||
ice_setup_tc_block_cb,
|
||||
np, np, true);
|
||||
case TC_SETUP_QDISC_MQPRIO:
|
||||
if (pf->adev) {
|
||||
mutex_lock(&pf->adev_mutex);
|
||||
device_lock(&pf->adev->dev);
|
||||
locked = true;
|
||||
if (pf->adev->dev.driver) {
|
||||
netdev_err(netdev, "Cannot change qdisc when RDMA is active\n");
|
||||
err = -EBUSY;
|
||||
goto adev_unlock;
|
||||
}
|
||||
}
|
||||
|
||||
/* setup traffic classifier for receive side */
|
||||
mutex_lock(&pf->tc_mutex);
|
||||
err = ice_setup_tc_mqprio_qdisc(netdev, type_data);
|
||||
mutex_unlock(&pf->tc_mutex);
|
||||
|
||||
adev_unlock:
|
||||
if (locked) {
|
||||
device_unlock(&pf->adev->dev);
|
||||
mutex_unlock(&pf->adev_mutex);
|
||||
}
|
||||
return err;
|
||||
default:
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
Reference in New Issue
Block a user