Re: [PATCH -next] net: neigh: use dev_kfree_skb_irq instead of kfree_skb()

From: Yang Yingliang
Date: Thu Aug 18 2022 - 21:44:39 EST



On 2022/8/19 0:32, Jakub Kicinski wrote:
Please put [PATCH net] as the tag for v2, this is a fix, not -next
material.
OK.
I don't find the commit 66ba215cb513 ("neigh: fix possible DoS due to net iface start/stop loop")
on linux/master, so made the patch based on linux-next/master, and add -next.
Later I will send a v2 based on net/master.

Thanks,
Yang

On Thu, 18 Aug 2022 11:00:13 +0200 Denis V. Lunev wrote:
        unsigned long flags;
        struct sk_buff *skb;
+       struct sk_buff_head tmp;
reverse xmas tree, so tmp should be declared before the shorter lines

+       skb_queue_head_init(&tmp);

        spin_lock_irqsave(&list->lock, flags);
        skb = skb_peek(list);
@@ -318,12 +321,16 @@ static void pneigh_queue_purge(struct sk_buff_head
*list, struct net *net)
                struct sk_buff *skb_next = skb_peek_next(skb, list);
while at it let's add an empty line here

                if (net == NULL || net == dev_net(skb->dev)) {
                        __skb_unlink(skb, list);
-                       dev_put(skb->dev);
-                       kfree_skb(skb);
+                       __skb_queue_tail(&tmp, skb);
                }
                skb = skb_next;
        } while (skb != NULL);
        spin_unlock_irqrestore(&list->lock, flags);
+
+       while ((skb = __skb_dequeue(&tmp)) != NULL) {
No need to compare pointers to NULL

+               dev_put(skb->dev);
+               kfree_skb(skb);
+       }
.