Subject: Re: Multicast packet loss

From: Eric Dumazet <[email-masked]>
Date: Fri, 13 Mar 2009 23:30:31 +0100

David Miller a écrit :
> From: Eric Dumazet <[email-masked]>
> Date: Mon, 09 Mar 2009 07:36:57 +0100
> 
>> I chose cmpxchg() because I needed some form of exclusion here.
>> I first added a spinlock inside "struct softirq_del" then I realize
>> I could use cmpxchg() instead and keep the structure small. As the
>> synchronization is only needed at queueing time, we could pass
>> the address of a spinlock XXX to sofirq_del() call.
> 
> I don't understand why you need the mutual exclusion in the
> first place.  The function pointer always has the same value.
> And this locking isn't protecting the list insertion either,
> as that isn't even necessary.
> 
> It just looks like plain overhead to me.

I was lazy to check all callers (all protocols) had a lock on sock,
and prefered safety.

I was fooled by the read_lock(), and though several cpus could call
this function in //

> 
>> Also, when an event was queued for later invocation, I also needed to keep
>> a reference on "struct socket" to make sure it doesnt disappear before
>> the invocation. Not all sockets are RCU guarded (we added RCU only for 
>> some protocols (TCP, UDP ...). So I found keeping a read_lock
>> on callback was the easyest thing to do. I now realize we might
>> overflow preempt_count, so special care is needed.
> 
> You're using this in UDP so... make the rule that you can't use
> this with a non-RCU-quiescent protocol.

UDP/TCP only ? I though many other protocols (not all using RCU) were
using sock_def_readable() too...