[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20140715.171431.1611412835087664432.davem@davemloft.net>
Date: Tue, 15 Jul 2014 17:14:31 -0700 (PDT)
From: David Miller <davem@...emloft.net>
To: drheld@...gle.com
Cc: netdev@...r.kernel.org, eric.dumazet@...il.com, willemb@...gle.com
Subject: Re: [PATCH net-next 1/2] udp: Simplify __udp*_lib_mcast_deliver.
From: David Held <drheld@...gle.com>
Date: Mon, 14 Jul 2014 18:30:38 -0400
> spin_lock(&hslot->lock);
> - sk = sk_nulls_head(&hslot->head);
> - dif = skb->dev->ifindex;
> - sk = udp_v4_mcast_next(net, sk, uh->dest, daddr, uh->source, saddr, dif);
> - while (sk) {
> - stack[count++] = sk;
> - sk = udp_v4_mcast_next(net, sk_nulls_next(sk), uh->dest,
> - daddr, uh->source, saddr, dif);
> - if (unlikely(count == ARRAY_SIZE(stack))) {
> - if (!sk)
> - break;
> - flush_stack(stack, count, skb, ~0);
> - count = 0;
> + sk_nulls_for_each(sk, node, &hslot->head) {
> + if (__udp_is_mcast_sock(net, sk,
> + uh->dest, daddr,
> + uh->source, saddr,
> + dif, hnum)) {
> + stack[count++] = sk;
> + if (unlikely(count == ARRAY_SIZE(stack))) {
> + flush_stack(stack, count, skb, ~0);
> + count = 0;
> + }
> }
> }
I think you are changing the logic of the loop in the edge case.
If we have exactly ARRAY_SIZE(stack) sockets to process, the old code
performs the flush_stack() outside of the hslot->lock, but with your
change we'll do it inside the lock.
The tradeoff here is reducing hslot->lock hold times vs. avoiding
taking a hold on all the sockets in the stack[] array.
I just wanted to point this out and make sure you are aware of and
are ok with this.
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists