diff options
author | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2014-04-03 07:55:01 -0400 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2014-04-03 08:31:00 -0400 |
commit | 1b948d6caec4f28e3524244ca0f77c6ae8ddceef (patch) | |
tree | bc7e1d5800f10c39979d3f47872ba7047568f8a4 /arch/s390/kernel/early.c | |
parent | 02a8f3abb708919149cb657a5202f4603f0c38e2 (diff) |
s390/mm,tlb: optimize TLB flushing for zEC12
The zEC12 machines introduced the local-clearing control for the IDTE
and IPTE instruction. If the control is set only the TLB of the local
CPU is cleared of entries, either all entries of a single address space
for IDTE, or the entry for a single page-table entry for IPTE.
Without the local-clearing control the TLB flush is broadcasted to all
CPUs in the configuration, which is expensive.
The reset of the bit mask of the CPUs that need flushing after a
non-local IDTE is tricky. As TLB entries for an address space remain
in the TLB even if the address space is detached a new bit field is
required to keep track of attached CPUs vs. CPUs in the need of a
flush. After a non-local flush with IDTE the bit-field of attached CPUs
is copied to the bit-field of CPUs in need of a flush. The ordering
of operations on cpu_attach_mask, attach_count and mm_cpumask(mm) is
such that an underindication in mm_cpumask(mm) is prevented but an
overindication in mm_cpumask(mm) is possible.
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'arch/s390/kernel/early.c')
-rw-r--r-- | arch/s390/kernel/early.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/arch/s390/kernel/early.c b/arch/s390/kernel/early.c index 6b594439cca5..a734f3585ceb 100644 --- a/arch/s390/kernel/early.c +++ b/arch/s390/kernel/early.c | |||
@@ -386,6 +386,8 @@ static __init void detect_machine_facilities(void) | |||
386 | S390_lowcore.machine_flags |= MACHINE_FLAG_TE; | 386 | S390_lowcore.machine_flags |= MACHINE_FLAG_TE; |
387 | if (test_facility(66)) | 387 | if (test_facility(66)) |
388 | S390_lowcore.machine_flags |= MACHINE_FLAG_RRBM; | 388 | S390_lowcore.machine_flags |= MACHINE_FLAG_RRBM; |
389 | if (test_facility(51)) | ||
390 | S390_lowcore.machine_flags |= MACHINE_FLAG_TLB_LC; | ||
389 | #endif | 391 | #endif |
390 | } | 392 | } |
391 | 393 | ||