Skip to content

Commit 931e93b

Browse files
edumazetdavem330
authored andcommitted
net: do not provide hard irq safety for sd->defer_lock
kfree_skb() can be called from hard irq handlers, but skb_attempt_defer_free() is meant to be used from process or BH contexts, and skb_defer_free_flush() is meant to be called from BH contexts. Not having to mask hard irq can save some cycles. Signed-off-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent e8e1ce8 commit 931e93b

2 files changed

Lines changed: 4 additions & 5 deletions

File tree

net/core/dev.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6632,11 +6632,11 @@ static void skb_defer_free_flush(struct softnet_data *sd)
66326632
if (!READ_ONCE(sd->defer_list))
66336633
return;
66346634

6635-
spin_lock_irq(&sd->defer_lock);
6635+
spin_lock(&sd->defer_lock);
66366636
skb = sd->defer_list;
66376637
sd->defer_list = NULL;
66386638
sd->defer_count = 0;
6639-
spin_unlock_irq(&sd->defer_lock);
6639+
spin_unlock(&sd->defer_lock);
66406640

66416641
while (skb != NULL) {
66426642
next = skb->next;

net/core/skbuff.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6870,7 +6870,6 @@ void skb_attempt_defer_free(struct sk_buff *skb)
68706870
{
68716871
int cpu = skb->alloc_cpu;
68726872
struct softnet_data *sd;
6873-
unsigned long flags;
68746873
unsigned int defer_max;
68756874
bool kick;
68766875

@@ -6889,7 +6888,7 @@ nodefer: __kfree_skb(skb);
68896888
if (READ_ONCE(sd->defer_count) >= defer_max)
68906889
goto nodefer;
68916890

6892-
spin_lock_irqsave(&sd->defer_lock, flags);
6891+
spin_lock_bh(&sd->defer_lock);
68936892
/* Send an IPI every time queue reaches half capacity. */
68946893
kick = sd->defer_count == (defer_max >> 1);
68956894
/* Paired with the READ_ONCE() few lines above */
@@ -6898,7 +6897,7 @@ nodefer: __kfree_skb(skb);
68986897
skb->next = sd->defer_list;
68996898
/* Paired with READ_ONCE() in skb_defer_free_flush() */
69006899
WRITE_ONCE(sd->defer_list, skb);
6901-
spin_unlock_irqrestore(&sd->defer_lock, flags);
6900+
spin_unlock_bh(&sd->defer_lock);
69026901

69036902
/* Make sure to trigger NET_RX_SOFTIRQ on the remote CPU
69046903
* if we are unlucky enough (this seems very unlikely).

0 commit comments

Comments
 (0)