Check whether the TLB operations need broadcasting on SMP systems
ARMv7 SMP hardware can handle the TLB maintenance operations broadcasting in hardware so that the software can avoid the costly IPIs. This patch adds the necessary checks (the MMFR3 CPUID register) to avoid the broadcasting if already supported by the hardware. (this patch is based on the work done by Tony Thompson @ ARM) Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Bu işleme şunda yer alıyor:
@@ -176,8 +176,8 @@ cpu_v7_name:
|
||||
*/
|
||||
__v7_setup:
|
||||
#ifdef CONFIG_SMP
|
||||
mrc p15, 0, r0, c1, c0, 1 @ Enable SMP/nAMP mode
|
||||
orr r0, r0, #(0x1 << 6)
|
||||
mrc p15, 0, r0, c1, c0, 1 @ Enable SMP/nAMP mode and
|
||||
orr r0, r0, #(1 << 6) | (1 << 0) @ TLB ops broadcasting
|
||||
mcr p15, 0, r0, c1, c0, 1
|
||||
#endif
|
||||
adr r12, __v7_setup_stack @ the local stack
|
||||
|
@@ -42,9 +42,11 @@ ENTRY(v7wbi_flush_user_tlb_range)
|
||||
mov r1, r1, lsl #PAGE_SHIFT
|
||||
vma_vm_flags r2, r2 @ get vma->vm_flags
|
||||
1:
|
||||
mcr p15, 0, r0, c8, c6, 1 @ TLB invalidate D MVA (was 1)
|
||||
tst r2, #VM_EXEC @ Executable area ?
|
||||
mcrne p15, 0, r0, c8, c5, 1 @ TLB invalidate I MVA (was 1)
|
||||
#ifdef CONFIG_SMP
|
||||
mcr p15, 0, r0, c8, c3, 1 @ TLB invalidate U MVA (shareable)
|
||||
#else
|
||||
mcr p15, 0, r0, c8, c7, 1 @ TLB invalidate U MVA
|
||||
#endif
|
||||
add r0, r0, #PAGE_SZ
|
||||
cmp r0, r1
|
||||
blo 1b
|
||||
@@ -69,8 +71,11 @@ ENTRY(v7wbi_flush_kern_tlb_range)
|
||||
mov r0, r0, lsl #PAGE_SHIFT
|
||||
mov r1, r1, lsl #PAGE_SHIFT
|
||||
1:
|
||||
mcr p15, 0, r0, c8, c6, 1 @ TLB invalidate D MVA
|
||||
mcr p15, 0, r0, c8, c5, 1 @ TLB invalidate I MVA
|
||||
#ifdef CONFIG_SMP
|
||||
mcr p15, 0, r0, c8, c3, 1 @ TLB invalidate U MVA (shareable)
|
||||
#else
|
||||
mcr p15, 0, r0, c8, c7, 1 @ TLB invalidate U MVA
|
||||
#endif
|
||||
add r0, r0, #PAGE_SZ
|
||||
cmp r0, r1
|
||||
blo 1b
|
||||
@@ -87,5 +92,5 @@ ENDPROC(v7wbi_flush_kern_tlb_range)
|
||||
ENTRY(v7wbi_tlb_fns)
|
||||
.long v7wbi_flush_user_tlb_range
|
||||
.long v7wbi_flush_kern_tlb_range
|
||||
.long v6wbi_tlb_flags
|
||||
.long v7wbi_tlb_flags
|
||||
.size v7wbi_tlb_fns, . - v7wbi_tlb_fns
|
||||
|
Yeni konuda referans
Bir kullanıcı engelle