[Intel-wired-lan] [PATCH net v1] i40e: Fix queues reservation for XDP

Maciej Fijalkowski maciej.fijalkowski at intel.com
Fri Nov 26 15:55:10 UTC 2021


On Fri, Nov 26, 2021 at 11:11:22AM +0100, Mateusz Palczewski wrote:
> From: Sylwester Dziedziuch <sylwesterx.dziedziuch at intel.com>
> 
> When XDP was configured on a system with large number of CPUs
> and X722 NIC there was a call trace with NULL pointer dereference.
> 
> i40e 0000:87:00.0: failed to get tracking for 256 queues for VSI 0 err -12
> i40e 0000:87:00.0: setup of MAIN VSI failed
> 
> BUG: kernel NULL pointer dereference, address: 0000000000000000
> RIP: 0010:i40e_xdp+0xea/0x1b0 [i40e]
> Call Trace:
> ? i40e_reconfig_rss_queues+0x130/0x130 [i40e]
> dev_xdp_install+0x61/0xe0
> dev_xdp_attach+0x18a/0x4c0
> dev_change_xdp_fd+0x1e6/0x220
> do_setlink+0x616/0x1030
> ? ahci_port_stop+0x80/0x80
> ? ata_qc_issue+0x107/0x1e0
> ? lock_timer_base+0x61/0x80
> ? __mod_timer+0x202/0x380
> rtnl_setlink+0xe5/0x170
> ? bpf_lsm_binder_transaction+0x10/0x10
> ? security_capable+0x36/0x50
> rtnetlink_rcv_msg+0x121/0x350
> ? rtnl_calcit.isra.0+0x100/0x100
> netlink_rcv_skb+0x50/0xf0
> netlink_unicast+0x1d3/0x2a0
> netlink_sendmsg+0x22a/0x440
> sock_sendmsg+0x5e/0x60
> __sys_sendto+0xf0/0x160
> ? __sys_getsockname+0x7e/0xc0
> ? _copy_from_user+0x3c/0x80
> ? __sys_setsockopt+0xc8/0x1a0
> __x64_sys_sendto+0x20/0x30
> do_syscall_64+0x33/0x40
> entry_SYSCALL_64_after_hwframe+0x44/0xae
> RIP: 0033:0x7f83fa7a39e0
> 
> This was caused by PF queue pile fragmentation due to
> flow director VSI queue being placed right after main VSI.
> Because of this main VSI was not able to resize its
> queue allocation for XDP resulting in no queues allocated
> for main VSI when XDP was turned on.
> 
> Fix this by always allocating last queue in PF queue pile
> for a flow director VSI.
> 
> Fixes: 41c445ff0f48 ("i40e: main driver core")

I'd also add:
Fixes: 74608d17fe29 ("i40e: add support for XDP_TX action")

> Signed-off-by: Sylwester Dziedziuch <sylwesterx.dziedziuch at intel.com>
> Signed-off-by: Mateusz Palczewski <mateusz.palczewski at intel.com>

Reviewed-by: Maciej Fijalkowski <maciej.fijalkowski at intel.com>

> ---
>  drivers/net/ethernet/intel/i40e/i40e_main.c | 14 ++++++++++++++
>  1 file changed, 14 insertions(+)
> 
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
> index 86fb795..9c612b1 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_main.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
> @@ -192,6 +192,20 @@ static int i40e_get_lump(struct i40e_pf *pf, struct i40e_lump_tracking *pile,
>  		return -EINVAL;
>  	}
>  
> +	/* Allocate last queue in the pile for FDIR VSI queue
> +	 * so it doesn't fragment the qp_pile
> +	 */
> +	if (pile == pf->qp_pile && pf->vsi[id]->type == I40E_VSI_FDIR) {
> +		if (pile->list[pile->num_entries - 1] & I40E_PILE_VALID_BIT) {
> +			dev_err(&pf->pdev->dev,
> +				"Cannot allocate queue %d for I40E_VSI_FDIR\n",
> +				pile->num_entries - 1);
> +			return -ENOMEM;
> +		}
> +		pile->list[pile->num_entries - 1] = id | I40E_PILE_VALID_BIT;
> +		return pile->num_entries - 1;
> +	}
> +
>  	i = 0;
>  	while (i < pile->num_entries) {
>  		/* skip already allocated entries */
> -- 
> 2.27.0
> 
> _______________________________________________
> Intel-wired-lan mailing list
> Intel-wired-lan at osuosl.org
> https://lists.osuosl.org/mailman/listinfo/intel-wired-lan


More information about the Intel-wired-lan mailing list