[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAM_iQpWwX_tJVk-96v2Xjwrm+Nijk1AkRhe+aoNU6o_3bQh_BA@mail.gmail.com>
Date: Fri, 27 May 2016 10:56:44 -0700
From: Cong Wang <xiyou.wangcong@...il.com>
To: Lennert Buytenhek <buytenh@...tstofly.org>
Cc: Patrick McHardy <kaber@...sh.net>,
Herbert Xu <herbert@...dor.apana.org.au>,
Linux Kernel Network Developers <netdev@...r.kernel.org>
Subject: Re: [PATCH,RFC] macvlan: Handle broadcasts inline if we have only a
few macvlans.
On Thu, May 26, 2016 at 4:44 PM, Lennert Buytenhek
<buytenh@...tstofly.org> wrote:
> Commit 412ca1550cbecb2c ("macvlan: Move broadcasts into a work queue")
> moved processing of all macvlan multicasts into a work queue. This
> causes a noticable performance regression when there is heavy multicast
> traffic on the underlying interface for multicast groups that the
> macvlan subinterfaces are not members of, in which case we end up
> cloning all those packets and then freeing them again from a work queue
> without really doing any useful work with them in between.
But we only queue up to 1000 packets in our backlog.
How about adding a quick check before cloning it?
diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c
index cb01023..1c73d0f 100644
--- a/drivers/net/macvlan.c
+++ b/drivers/net/macvlan.c
@@ -315,6 +315,9 @@ static void macvlan_broadcast_enqueue(struct
macvlan_port *port,
struct sk_buff *nskb;
int err = -ENOMEM;
+ if (skb_queue_len(&port->bc_queue) >= MACVLAN_BC_QUEUE_LEN)
+ return;
+
nskb = skb_clone(skb, GFP_ATOMIC);
if (!nskb)
goto err;
Powered by blists - more mailing lists