Skip to content

Commit d917c21

Browse files
Sebastian Andrzej Siewiorkuba-moo
authored andcommitted
net: gro_cells: Reduce lock scope in gro_cell_poll
One GRO-cell device's NAPI callback can nest into the GRO-cell of another device if the underlying device is also using GRO-cell. This is the case for IPsec over vxlan. These two GRO-cells are separate devices. From lockdep's point of view it is the same because each device is sharing the same lock class and so it reports a possible deadlock assuming one device is nesting into itself. Hold the bh_lock only while accessing gro_cell::napi_skbs in gro_cell_poll(). This reduces the locking scope and avoids acquiring the same lock class multiple times. Fixes: 25718fd ("net: gro_cells: Use nested-BH locking for gro_cell") Reported-by: Gal Pressman <gal@nvidia.com> Closes: https://lore.kernel.org/all/66664116-edb8-48dc-ad72-d5223696dd19@nvidia.com/ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Link: https://patch.msgid.link/20251104153435.ty88xDQt@linutronix.de Signed-off-by: Jakub Kicinski <kuba@kernel.org>
1 parent b1d16f7 commit d917c21

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

net/core/gro_cells.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,10 @@ static int gro_cell_poll(struct napi_struct *napi, int budget)
6060
struct sk_buff *skb;
6161
int work_done = 0;
6262

63-
__local_lock_nested_bh(&cell->bh_lock);
6463
while (work_done < budget) {
64+
__local_lock_nested_bh(&cell->bh_lock);
6565
skb = __skb_dequeue(&cell->napi_skbs);
66+
__local_unlock_nested_bh(&cell->bh_lock);
6667
if (!skb)
6768
break;
6869
napi_gro_receive(napi, skb);
@@ -71,7 +72,6 @@ static int gro_cell_poll(struct napi_struct *napi, int budget)
7172

7273
if (work_done < budget)
7374
napi_complete_done(napi, work_done);
74-
__local_unlock_nested_bh(&cell->bh_lock);
7575
return work_done;
7676
}
7777

0 commit comments

Comments
 (0)