From b197b7f3996da661fcd792b4e5bdf94619f979a4 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Sun, 18 Apr 2021 14:30:36 +0200 Subject: [PATCH] 4.4-stable patches added patches: i40e-fix-the-panic-when-running-bpf-in-xdpdrv-mode.patch --- ...anic-when-running-bpf-in-xdpdrv-mode.patch | 68 +++++++++++++++++++ queue-4.4/series | 1 + 2 files changed, 69 insertions(+) create mode 100644 queue-4.4/i40e-fix-the-panic-when-running-bpf-in-xdpdrv-mode.patch diff --git a/queue-4.4/i40e-fix-the-panic-when-running-bpf-in-xdpdrv-mode.patch b/queue-4.4/i40e-fix-the-panic-when-running-bpf-in-xdpdrv-mode.patch new file mode 100644 index 00000000000..781de38084e --- /dev/null +++ b/queue-4.4/i40e-fix-the-panic-when-running-bpf-in-xdpdrv-mode.patch @@ -0,0 +1,68 @@ +From 4e39a072a6a0fc422ba7da5e4336bdc295d70211 Mon Sep 17 00:00:00 2001 +From: Jason Xing +Date: Wed, 14 Apr 2021 10:34:28 +0800 +Subject: i40e: fix the panic when running bpf in xdpdrv mode + +From: Jason Xing + +commit 4e39a072a6a0fc422ba7da5e4336bdc295d70211 upstream. + +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: 41c445ff0f48 ("i40e: main driver core") +Co-developed-by: Shujin Li +Signed-off-by: Shujin Li +Signed-off-by: Jason Xing +Reviewed-by: Jesse Brandeburg +Acked-by: Jesper Dangaard Brouer +Signed-off-by: David S. Miller +Signed-off-by: Greg Kroah-Hartman +--- + drivers/net/ethernet/intel/i40e/i40e_main.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +--- a/drivers/net/ethernet/intel/i40e/i40e_main.c ++++ b/drivers/net/ethernet/intel/i40e/i40e_main.c +@@ -8148,6 +8148,7 @@ static int i40e_sw_init(struct i40e_pf * + { + int err = 0; + int size; ++ u16 pow; + + pf->msg_enable = netif_msg_init(I40E_DEFAULT_MSG_ENABLE, + (NETIF_MSG_DRV|NETIF_MSG_PROBE|NETIF_MSG_LINK)); +@@ -8182,6 +8183,11 @@ static int i40e_sw_init(struct i40e_pf * + pf->rss_table_size = pf->hw.func_caps.rss_table_size; + pf->rss_size_max = min_t(int, pf->rss_size_max, + pf->hw.func_caps.num_tx_qp); ++ ++ /* find the next higher power-of-2 of num cpus */ ++ pow = roundup_pow_of_two(num_online_cpus()); ++ pf->rss_size_max = min_t(int, pf->rss_size_max, pow); ++ + if (pf->hw.func_caps.rss) { + pf->flags |= I40E_FLAG_RSS_ENABLED; + pf->rss_size = min_t(int, pf->rss_size_max, num_online_cpus()); diff --git a/queue-4.4/series b/queue-4.4/series index c712fa9e725..ae142697d47 100644 --- a/queue-4.4/series +++ b/queue-4.4/series @@ -19,3 +19,4 @@ net-tipc-fix-spelling-errors-in-net-tipc-module.patch input-i8042-fix-pegatron-c15b-id-entry.patch scsi-libsas-reset-num_scatter-if-libata-marks-qc-as-nodata.patch net-davicom-fix-regulator-not-turned-off-on-failed-probe.patch +i40e-fix-the-panic-when-running-bpf-in-xdpdrv-mode.patch -- 2.47.3