Message ID | 1614168468-16223-1-git-send-email-michal.maloszewski@intel.com |
---|---|
State | Accepted |
Delegated to: | Anthony Nguyen |
Headers | show |
Series | [net,v3] i40e: Fix NULL ptr dereference on VSI filter sync | expand |
On Wed, 2021-02-24 at 12:07 +0000, Michał Małoszewski wrote: > Remove the reason of null pointer dereference in sync vsi filters. > Added new I40E_VSI_RELEASING flag to signalize deleting and releasing > of VSI resources to sync this thread with sync filters subtask. > Without this patch it is possible to start update the vsi filter list > after vsi is removed, that's causing a kernel oops. > > Fixes: 17652c6336fd("i40e: remove unused argument") > Signed-off-by: Grzegorz Szczurek <grzegorzx.szczurek@intel.com> > Signed-off by: Michal Maloszewski <michal.maloszewski@intel.com> I went ahead and fixed this, but your sign off is missing a '-' > Reviewed-by: Przemyslaw Patynowski <przemyslawx.patynowski@intel.com> > Reviewed-by: Fijalkowski, WitoldX <witoldx.fijalkowski@intel.com> > Reviewed-by: Jaroslaw Gawin <jaroslawx.gawin@intel.com> > Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com> > --- > v3: removed features of other patches and changed permissions to 664 Please keep the full revision history, not just the most recent. Thanks, Tony
diff --git a/drivers/net/ethernet/intel/i40e/i40e.h b/drivers/net/ethernet/intel/i40e/i40e.h index b6830e3..558b0ae 100644 --- a/drivers/net/ethernet/intel/i40e/i40e.h +++ b/drivers/net/ethernet/intel/i40e/i40e.h @@ -158,6 +158,7 @@ enum i40e_vsi_state_t { __I40E_VSI_OVERFLOW_PROMISC, __I40E_VSI_REINIT_REQUESTED, __I40E_VSI_DOWN_REQUESTED, + __I40E_VSI_RELEASING, /* This must be last as it determines the size of the BITMAP */ __I40E_VSI_STATE_SIZE__, }; diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c index 3ed7f0e..c29678b 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_main.c +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c @@ -2634,7 +2634,8 @@ static void i40e_sync_filters_subtask(struct i40e_pf *pf) for (v = 0; v < pf->num_alloc_vsi; v++) { if (pf->vsi[v] && - (pf->vsi[v]->flags & I40E_VSI_FLAG_FILTER_CHANGED)) { + (pf->vsi[v]->flags & I40E_VSI_FLAG_FILTER_CHANGED) && + !test_bit(__I40E_VSI_RELEASING, pf->vsi[v]->state)) { int ret = i40e_sync_vsi_filters(pf->vsi[v]); if (ret) { @@ -13787,7 +13788,7 @@ int i40e_vsi_release(struct i40e_vsi *vsi) dev_info(&pf->pdev->dev, "Can't remove PF VSI\n"); return -ENODEV; } - + set_bit(__I40E_VSI_RELEASING, vsi->state); uplink_seid = vsi->uplink_seid; if (vsi->type != I40E_VSI_SRIOV) { if (vsi->netdev_registered) {