Generally the check should be very cheap, as the sk_buff_head is in cache.

Signed-off-by: Edward Cree <ec...@solarflare.com>
---
 net/core/dev.c      | 8 ++++++--
 net/ipv4/ip_input.c | 2 ++
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/net/core/dev.c b/net/core/dev.c
index f0eb00e9fb57..11f80d4502b9 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -4780,7 +4780,8 @@ static void __netif_receive_skb_list(struct sk_buff_head 
*list)
        while ((skb = __skb_dequeue(list)) != NULL) {
                if ((sk_memalloc_socks() && skb_pfmemalloc(skb)) != pfmemalloc) 
{
                        /* Handle the previous sublist */
-                       __netif_receive_skb_list_core(&sublist, pfmemalloc);
+                       if (!skb_queue_empty(&sublist))
+                               __netif_receive_skb_list_core(&sublist, 
pfmemalloc);
                        pfmemalloc = !pfmemalloc;
                        /* See comments in __netif_receive_skb */
                        if (pfmemalloc)
@@ -4792,7 +4793,8 @@ static void __netif_receive_skb_list(struct sk_buff_head 
*list)
                __skb_queue_tail(&sublist, skb);
        }
        /* Handle the last sublist */
-       __netif_receive_skb_list_core(&sublist, pfmemalloc);
+       if (!skb_queue_empty(&sublist))
+               __netif_receive_skb_list_core(&sublist, pfmemalloc);
        /* Restore pflags */
        if (pfmemalloc)
                memalloc_noreclaim_restore(noreclaim_flag);
@@ -4968,6 +4970,8 @@ void netif_receive_skb_list(struct sk_buff_head *list)
 {
        struct sk_buff *skb;
 
+       if (skb_queue_empty(list))
+               return;
        skb_queue_for_each(skb, list)
                trace_netif_receive_skb_list_entry(skb);
        netif_receive_skb_list_internal(list);
diff --git a/net/ipv4/ip_input.c b/net/ipv4/ip_input.c
index 63d4dfdb1766..65a5ed9e4b3c 100644
--- a/net/ipv4/ip_input.c
+++ b/net/ipv4/ip_input.c
@@ -570,6 +570,8 @@ static void ip_sublist_rcv(struct sk_buff_head *list, 
struct net_device *dev,
 {
        struct sk_buff_head sublist;
 
+       if (skb_queue_empty(list))
+               return;
        NF_HOOK_LIST(NFPROTO_IPV4, NF_INET_PRE_ROUTING, net, NULL,
                     list, &sublist, dev, NULL, ip_rcv_finish);
        ip_list_rcv_finish(net, NULL, &sublist);

Reply via email to