Hello. On 6/17/2015 12:07 AM, Willem de Bruijn wrote:
From: Willem de Bruijn <will...@google.com>
PACKET_FANOUT_LB computes f->rr_cur such that it is modulo f->num_members. It returns the old value unconditionally, but f->num_members may have changed since the last store. This can be fixed with
- return cur + return cur < num ? : 0;
When modifying the logic, simplify it further by replacing the loop with an unconditional atomic increment.
Fixes: dc99f600698d ("packet: Add fanout support.") Suggested-by: Eric Dumazet <eduma...@google.com> Signed-off-by: Willem de Bruijn <will...@google.com> --- net/packet/af_packet.c | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-)
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index b5989c6..efd35e8 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c
[...]
@@ -1293,13 +1283,8 @@ static unsigned int fanout_demux_lb(struct packet_fanout *f, struct sk_buff *skb, unsigned int num) { - int cur, old; - - cur = atomic_read(&f->rr_cur); - while ((old = atomic_cmpxchg(&f->rr_cur, cur, - fanout_rr_next(f, num))) != cur) - cur = old; - return cur; + unsigned int val = atomic_inc_return(&f->rr_cur);
Please insert an empty line after declaration, as it was before your patch.
+ return val % num; }
[...] WBR, Sergei -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html