Re: [PATCH 1/2] x86/mm: maintain a percpu "in get_user_pages_fast"flag

From: Avi Kivity
Date: Fri Mar 27 2009 - 23:56:29 EST


Jeremy Fitzhardinge wrote:
get_user_pages_fast() relies on cross-cpu tlb flushes being a barrier
between clearing and setting a pte, and before freeing a pagetable page.
It usually does this by disabling interrupts to hold off IPIs, but
some tlb flush implementations don't use IPIs for tlb flushes, and
must use another mechanism.

In this change, add in_gup_cpumask, which is a cpumask of cpus currently
performing a get_user_pages_fast traversal of a pagetable. A cross-cpu
tlb flush function can use this to determine whether it should hold-off
on the flush until the gup_fast has finished.

@@ -255,6 +260,10 @@ int get_user_pages_fast(unsigned long start, int nr_pages, int write,
* address down to the the page and take a ref on it.
*/
local_irq_disable();
+
+ cpu = smp_processor_id();
+ cpumask_set_cpu(cpu, in_gup_cpumask);
+

This will bounce a cacheline, every time. Please wrap in CONFIG_XEN and skip at runtime if Xen is not enabled.


--
I have a truly marvellous patch that fixes the bug which this
signature is too narrow to contain.

--
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/