| From 6ce8d1f08cad35a8403eb81a583e815b6a5ecb2d Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 13 Dec 2019 06:39:39 +0530 |
| Subject: cxgb4: Fix kernel panic while accessing sge_info |
| |
| From: Vishal Kulkarni <vishal@chelsio.com> |
| |
| [ Upstream commit 479a0d1376f6d97c60871442911f1394d4446a25 ] |
| |
| The sge_info debugfs collects offload queue info even when offload |
| capability is disabled and leads to panic. |
| |
| [ 144.139871] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 |
| [ 144.139874] CR2: 0000000000000000 CR3: 000000082d456005 CR4: 00000000001606e0 |
| [ 144.139876] Call Trace: |
| [ 144.139887] sge_queue_start+0x12/0x30 [cxgb4] |
| [ 144.139897] seq_read+0x1d4/0x3d0 |
| [ 144.139906] full_proxy_read+0x50/0x70 |
| [ 144.139913] vfs_read+0x89/0x140 |
| [ 144.139916] ksys_read+0x55/0xd0 |
| [ 144.139924] do_syscall_64+0x5b/0x1d0 |
| [ 144.139933] entry_SYSCALL_64_after_hwframe+0x44/0xa9 |
| [ 144.139936] RIP: 0033:0x7f4b01493990 |
| |
| Fix this crash by skipping the offload queue access in sge_qinfo when |
| offload capability is disabled |
| |
| Signed-off-by: Herat Ramani <herat@chelsio.com> |
| Signed-off-by: Vishal Kulkarni <vishal@chelsio.com> |
| Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c | 4 ++++ |
| 1 file changed, 4 insertions(+) |
| |
| diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c |
| index ae6a47dd7dc9..fb8ade9a05a9 100644 |
| --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c |
| +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c |
| @@ -2996,6 +2996,9 @@ static int sge_queue_entries(const struct adapter *adap) |
| int tot_uld_entries = 0; |
| int i; |
| |
| + if (!is_uld(adap)) |
| + goto lld_only; |
| + |
| mutex_lock(&uld_mutex); |
| for (i = 0; i < CXGB4_TX_MAX; i++) |
| tot_uld_entries += sge_qinfo_uld_txq_entries(adap, i); |
| @@ -3006,6 +3009,7 @@ static int sge_queue_entries(const struct adapter *adap) |
| } |
| mutex_unlock(&uld_mutex); |
| |
| +lld_only: |
| return DIV_ROUND_UP(adap->sge.ethqsets, 4) + |
| tot_uld_entries + |
| DIV_ROUND_UP(MAX_CTRL_QUEUES, 4) + 1; |
| -- |
| 2.20.1 |
| |