Re: 2.6.9-rc3-mm2

Andrew Morton
2004-10-15T01:46:23Z

Rusty Russell <rusty@rustcorp.com.au> wrote:
>
> On Wed, 2004-10-06 at 00:07, Dominik Karall wrote:
> > On Monday 04 October 2004 11:02, Andrew Morton wrote:
> > > ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.9-rc3/2.6
> > >.9-rc3-mm2/
> >
> > some more scheduling/preempt problems. following patches were applied:
> > ---
> > 25/include/linux/netfilter_ipv4/ip_conntrack.h~conntrack-preempt-safety-fix
> > Mon Oct 4 14:36:19 2004
> > +++ 25-akpm/include/linux/netfilter_ipv4/ip_conntrack.h Mon Oct 4 14:37:02
> > 2004
> > @@ -311,10 +311,11 @@ struct ip_conntrack_stat
> > unsigned int expect_delete;
> > };
> >
> > -#define CONNTRACK_STAT_INC(count) \
> > - do { \
> > - per_cpu(ip_conntrack_stat, get_cpu()).count++; \
> > - put_cpu(); \
> > +#define CONNTRACK_STAT_INC(count) \
> > + do { \
> > + preempt_disable(); \
> > + per_cpu(ip_conntrack_stat, smp_processor_id()).count++; \
> > + preempt_disable(); \
> > } while (0)
>
> Please, please please! Never use per_cpu(XXX, smp_processor_id())!

Why?

> In
> this case, it's "get_cpu_var(ip_conntrack_stat).count++; put_cpu(),

Actually, it's put_cpu_var().

> although I think this code should only be called in a softirq, so a
> simple "__get_cpu_var(ip_conntrack_stat).count++;" is sufficient.

We were getting warnings from somewhere or other due to smp_processor_id()
within preemptible code - I don't recall the callsite.