Subject: Re: [Bugme-new] [Bug 8536] New: Kernel drops UDP packets silently when reading from certain proc file entries

From: Eric Dumazet <[email-masked]>
Date: Fri, 25 May 2007 08:50:20 +0200

Herbert Xu a écrit :
> Andrew Morton <[email-masked]> wrote:
>>> It is possible to introduce UDP packet losses by reading
>>> the proc file entry /proc/net/tcp. The really strange thing is that
>>> the error counters for packet drops are not increased. 
> 
> Please try this patch and let us know if it helps.
> 
> [TCPv4]: Improve BH latency in /proc/net/tcp
> 
> Currently the code for /proc/net/tcp disable BH while iterating
> over the entire established hash table.  Even though we call
> cond_resched_softirq for each entry, we still won't process
> softirq's as regularly as we would otherwise do which results
> in poor performance when the system is loaded near capacity.
> 
> This anomaly comes from the 2.4 code where this was all in a
> single function and the local_bh_disable might have made sense
> as a small optimisation.
> 
> The cost of each local_bh_disable is so small when compared
> against the increased latency in keeping it disabled over a
> large but mostly empty TCP established hash table that we
> should just move it to the individual read_lock/read_unlock
> calls as we do in inet_diag.
> 

But its not really true : cond_resched_softirq() is called for
each bucket in hash table, empty or not.

If this patch really helps, this means cond_resched_softirq()
doesnt work at all and should be fixed, or just zapped as it
is seldom used.