From mboxrd@z Thu Jan 1 00:00:00 1970 From: Maciej Fijalkowski Date: Fri, 26 Nov 2021 16:55:10 +0100 Subject: [Intel-wired-lan] [PATCH net v1] i40e: Fix queues reservation for XDP In-Reply-To: <20211126101122.25085-1-mateusz.palczewski@intel.com> References: <20211126101122.25085-1-mateusz.palczewski@intel.com> Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: intel-wired-lan@osuosl.org List-ID: On Fri, Nov 26, 2021 at 11:11:22AM +0100, Mateusz Palczewski wrote: > From: Sylwester Dziedziuch > > 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 > Signed-off-by: Mateusz Palczewski Reviewed-by: Maciej Fijalkowski > --- > 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