Don't set cpu_vm_mask if the mm isn't exclusive to the cpu.
diff -urN linux-2.5.48/include/asm-s390/tlbflush.h linux-2.5.48-s390/include/asm-s390/tlbflush.h
--- linux-2.5.48/include/asm-s390/tlbflush.h Mon Nov 18 05:29:57 2002
+++ linux-2.5.48-s390/include/asm-s390/tlbflush.h Mon Nov 18 20:11:48 2002
@@ -91,13 +91,15 @@
static inline void __flush_tlb_mm(struct mm_struct * mm)
{
- if (((atomic_read(&mm->mm_count) != 1) ||
- (mm->cpu_vm_mask != (1UL << smp_processor_id())))) {
- mm->cpu_vm_mask = (1UL << smp_processor_id());
+ if (mm->cpu_vm_mask != (1UL << smp_processor_id())) {
+ /* mm was active on more than one cpu. */
+ if (mm == current->active_mm &&
+ atomic_read(&mm->mm_count) == 1)
+ /* this cpu is the only one using the mm. */
+ mm->cpu_vm_mask = 1UL << smp_processor_id();
global_flush_tlb();
- } else {
+ } else
local_flush_tlb();
- }
}
static inline void flush_tlb(void)
diff -urN linux-2.5.48/include/asm-s390x/tlbflush.h linux-2.5.48-s390/include/asm-s390x/tlbflush.h
--- linux-2.5.48/include/asm-s390x/tlbflush.h Mon Nov 18 05:29:50 2002
+++ linux-2.5.48-s390/include/asm-s390x/tlbflush.h Mon Nov 18 20:11:48 2002
@@ -88,13 +88,15 @@
static inline void __flush_tlb_mm(struct mm_struct * mm)
{
- if (((atomic_read(&mm->mm_count) != 1) ||
- (mm->cpu_vm_mask != (1UL << smp_processor_id())))) {
- mm->cpu_vm_mask = (1UL << smp_processor_id());
+ if (mm->cpu_vm_mask != (1UL << smp_processor_id())) {
+ /* mm was active on more than one cpu. */
+ if (mm == current->active_mm &&
+ atomic_read(&mm->mm_count) == 1)
+ /* this cpu is the only one using the mm. */
+ mm->cpu_vm_mask = 1UL << smp_processor_id();
global_flush_tlb();
- } else {
+ } else
local_flush_tlb();
- }
}
static inline void flush_tlb(void)
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
This archive was generated by hypermail 2b29 : Sat Nov 23 2002 - 22:00:24 EST