Skip to content

Commit 4e39a07

Browse files
Jason Xingdavem330
authored andcommitted
i40e: fix the panic when running bpf in xdpdrv mode
Fix this panic by adding more rules to calculate the value of @rss_size_max which could be used in allocating the queues when bpf is loaded, which, however, could cause the failure and then trigger the NULL pointer of vsi->rx_rings. Prio to this fix, the machine doesn't care about how many cpus are online and then allocates 256 queues on the machine with 32 cpus online actually. Once the load of bpf begins, the log will go like this "failed to get tracking for 256 queues for VSI 0 err -12" and this "setup of MAIN VSI failed". Thus, I attach the key information of the crash-log here. BUG: unable to handle kernel NULL pointer dereference at 0000000000000000 RIP: 0010:i40e_xdp+0xdd/0x1b0 [i40e] Call Trace: [2160294.717292] ? i40e_reconfig_rss_queues+0x170/0x170 [i40e] [2160294.717666] dev_xdp_install+0x4f/0x70 [2160294.718036] dev_change_xdp_fd+0x11f/0x230 [2160294.718380] ? dev_disable_lro+0xe0/0xe0 [2160294.718705] do_setlink+0xac7/0xe70 [2160294.719035] ? __nla_parse+0xed/0x120 [2160294.719365] rtnl_newlink+0x73b/0x860 Fixes: 41c445f ("i40e: main driver core") Co-developed-by: Shujin Li <lishujin@kuaishou.com> Signed-off-by: Shujin Li <lishujin@kuaishou.com> Signed-off-by: Jason Xing <xingwanli@kuaishou.com> Reviewed-by: Jesse Brandeburg <jesse.brandeburg@intel.com> Acked-by: Jesper Dangaard Brouer <brouer@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 9e196e4 commit 4e39a07

1 file changed

Lines changed: 6 additions & 0 deletions

File tree

drivers/net/ethernet/intel/i40e/i40e_main.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12357,6 +12357,7 @@ static int i40e_sw_init(struct i40e_pf *pf)
1235712357
{
1235812358
int err = 0;
1235912359
int size;
12360+
u16 pow;
1236012361

1236112362
/* Set default capability flags */
1236212363
pf->flags = I40E_FLAG_RX_CSUM_ENABLED |
@@ -12375,6 +12376,11 @@ static int i40e_sw_init(struct i40e_pf *pf)
1237512376
pf->rss_table_size = pf->hw.func_caps.rss_table_size;
1237612377
pf->rss_size_max = min_t(int, pf->rss_size_max,
1237712378
pf->hw.func_caps.num_tx_qp);
12379+
12380+
/* find the next higher power-of-2 of num cpus */
12381+
pow = roundup_pow_of_two(num_online_cpus());
12382+
pf->rss_size_max = min_t(int, pf->rss_size_max, pow);
12383+
1237812384
if (pf->hw.func_caps.rss) {
1237912385
pf->flags |= I40E_FLAG_RSS_ENABLED;
1238012386
pf->alloc_rss_size = min_t(int, pf->rss_size_max,

0 commit comments

Comments
 (0)