[Intel-wired-lan] [PATCH net] i40e: Fix kernel oops when i40e driver removes VF's

Jankowski, Konrad0 konrad0.jankowski at intel.com
Thu Mar 18 09:18:00 UTC 2021



> -----Original Message-----
> From: Intel-wired-lan <intel-wired-lan-bounces at osuosl.org> On Behalf Of
> Eryk Rybak
> Sent: czwartek, 18 lutego 2021 12:15
> To: intel-wired-lan at lists.osuosl.org
> Cc: Rybak, Eryk Roch <eryk.roch.rybak at intel.com>; Loktionov, Aleksandr
> <aleksandr.loktionov at intel.com>
> Subject: [Intel-wired-lan] [PATCH net] i40e: Fix kernel oops when i40e driver
> removes VF's
> 
> Fix the reason of kernel oops when i40e driver removed VFs.
> Added new __I40E_VFS_RELEASING state to signalize releasing process by
> PF, that it makes possible to exit of reset VF procedure.
> Without this patch, it is possible to suspend the VFs reset by releasing VFs
> resources procedure. Retrying the reset after the timeout works on the
> freed VF memory causing a kernel oops.
> 
> Fixes: d43d60e5eb95("i40e: ensure reset occurs when disabling VF")
> Signed-off-by: Eryk Rybak <eryk.roch.rybak at intel.com>
> Signed-off-by: Grzegorz Szczurek <grzegorzx.szczurek at intel.com>
> Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov at intel.com>
> ---
>  drivers/net/ethernet/intel/i40e/i40e.h             | 1 +
>  drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c | 9 +++++++++
>  2 files changed, 10 insertions(+)
> 
> diff --git a/drivers/net/ethernet/intel/i40e/i40e.h
> b/drivers/net/ethernet/intel/i40e/i40e.h
> index 118473d..fe12587 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e.h
> +++ b/drivers/net/ethernet/intel/i40e/i40e.h
> @@ -142,6 +142,7 @@ enum i40e_state_t {
>  	__I40E_VIRTCHNL_OP_PENDING,
>  	__I40E_RECOVERY_MODE,
>  	__I40E_VF_RESETS_DISABLED,	/* disable resets during i40e_remove
> */
> +	__I40E_VFS_RELEASING,
>  	/* This must be last as it determines the size of the BITMAP */
>  	__I40E_STATE_SIZE__,
>  };
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
> b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
> index 1b6ec9b..0c6cbe9 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
> @@ -137,6 +137,7 @@ void i40e_vc_notify_vf_reset(struct i40e_vf *vf)
>   **/
>  static inline void i40e_vc_disable_vf(struct i40e_vf *vf)  {
> +	struct i40e_pf *pf = vf->pf;
>  	int i;
> 
>  	i40e_vc_notify_vf_reset(vf);
> @@ -147,6 +148,11 @@ static inline void i40e_vc_disable_vf(struct i40e_vf
> *vf)
>  	 * ensure a reset.
>  	 */
>  	for (i = 0; i < 20; i++) {
> +		/* If pf is in vfs releasing state reset vf is impossible,
> +		 * so leave it.
> +		 */
> +		if (test_bit(__I40E_VFS_RELEASING, pf->state))
> +			return;
>  		if (i40e_reset_vf(vf, false))
>  			return;
>  		usleep_range(10000, 20000);
> @@ -1574,6 +1580,8 @@ void i40e_free_vfs(struct i40e_pf *pf)
> 
>  	if (!pf->vf)
>  		return;
> +
> +	set_bit(__I40E_VFS_RELEASING, pf->state);
>  	while (test_and_set_bit(__I40E_VF_DISABLE, pf->state))
>  		usleep_range(1000, 2000);
> 
> @@ -1631,6 +1639,7 @@ void i40e_free_vfs(struct i40e_pf *pf)
>  		}
>  	}
>  	clear_bit(__I40E_VF_DISABLE, pf->state);
> +	clear_bit(__I40E_VFS_RELEASING, pf->state);
>  }
> 
>  #ifdef CONFIG_PCI_IOV
> 
Tested-by: Konrad Jankowski <konrad0.jankowski at intel.com>


More information about the Intel-wired-lan mailing list