On Mon, Jan 30, 2012 at 05:14:37PM +0200, Gilad Ben-Yossef wrote: > >> + for_each_online_cpu(cpu) { > >> + bool has_pcps = false; > >> + for_each_populated_zone(zone) { > >> + pcp = per_cpu_ptr(zone->pageset, cpu); > >> + if (pcp->pcp.count) { > >> + has_pcps = true; > >> + break; > >> + } > >> + } > >> + if (has_pcps) > >> + cpumask_set_cpu(cpu, &cpus_with_pcps); > >> + else > >> + cpumask_clear_cpu(cpu, &cpus_with_pcps); > >> + } > > > > Lets take two CPUs running this code at the same time. CPU 1 has per-cpu > > pages in all zones. CPU 2 has no per-cpu pages in any zone. If both run > > at the same time, CPU 2 can be clearing the mask for CPU 1 before it has > > had a chance to send the IPI. This means we'll miss sending IPIs to CPUs > > that we intended to. > > I'm confused. You seem to be assuming that each CPU is looking at its own pcps > only (per zone). /me slaps self I was assuming exactly this. > Assuming no change in the state of the pcps when both CPUs > run this code at the same time, both of them should mark the bit for > their respective > CPUs the same, unless one of them raced and managed to send the IPI to clear > pcps from the other, at which point you might see one of them send a > spurious IPI > to drains pcps that have been drained - but that isn't bad. > Indeed, the race is tiny and the consequences are not important. > At least, that is what I meant the code to do and what I believe it > does. What have I > missed? > Nothing, the problem was on my side. Sorry for the noise. -- Mel Gorman SUSE Labs -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html