Re: [patch] reduce IPI noise due to /dev/cdrom open/close

From: Andrew Morton
Date: Tue Jul 04 2006 - 04:08:39 EST


On Tue, 04 Jul 2006 09:49:14 +0200
Jes Sorensen <jes@xxxxxxx> wrote:

> Keith Owens wrote:
> >> static void invalidate_bh_lrus(void)
> >> {
> >> - on_each_cpu(invalidate_bh_lru, NULL, 1, 1);
> >> + /*
> >> + * Need to hand down a copy of the mask or we wouldn't be run
> >> + * anywhere due to the original mask being cleared
> >> + */
> >> + cpumask_t mask = lru_in_use;
> >> + cpus_clear(lru_in_use);
> >> + schedule_on_each_cpu_mask(invalidate_bh_lru, NULL, mask);
> >> }
> >
> > Racy? Start with an empty lru_in_use.
> >
> > Cpu A Cpu B
> > invalidate_bh_lrus()
> > mask = lru_in_use;
> > preempted
> > block I/O
> > bh_lru_install()
> > cpu_set(cpu, lru_in_use);
> > resume
> > cpus_clear(lru_in_use);
> > schedule_on_each_cpu_mask() - does not send IPI to cpu B
>
> I guess the real question is whether the device is still valid for new
> IO by the time we hit the invalidate function. If not, and that was my,
> possibly flawed, assumption, then it's not an issue. Whatever bh's are
> left in the lrus from other devices will be handled on the next hit.
>

The problem is that we can actually lose bits in invalidate_bh_lrus().

CPU0 CPU1

mask = lru_in_use;
cpu_set(lru_in_use, 1);
cpus_clear(lru_in_use);

Now we have a stray bh which nobody knows about.
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/