Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux

Pull arm64 fixes from Catalin Marinas:

- add TLB invalidation for page table tear-down which was missed when
support for CONFIG_HAVE_RCU_TABLE_FREE was added (assuming page table
freeing was always deferred)

- use UEFI for system and reset poweroff if available

- fix asm label placement in relation to the alignment statement

* tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux:
arm64: put __boot_cpu_mode label after alignment instead of before
efi/arm64: use UEFI for system reset and poweroff
arm64: Invalidate the TLB corresponding to intermediate page table levels

+34 -1
+3
arch/arm64/include/asm/tlb.h
··· 48 48 static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte, 49 49 unsigned long addr) 50 50 { 51 + __flush_tlb_pgtable(tlb->mm, addr); 51 52 pgtable_page_dtor(pte); 52 53 tlb_remove_entry(tlb, pte); 53 54 } ··· 57 56 static inline void __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmdp, 58 57 unsigned long addr) 59 58 { 59 + __flush_tlb_pgtable(tlb->mm, addr); 60 60 tlb_remove_entry(tlb, virt_to_page(pmdp)); 61 61 } 62 62 #endif ··· 66 64 static inline void __pud_free_tlb(struct mmu_gather *tlb, pud_t *pudp, 67 65 unsigned long addr) 68 66 { 67 + __flush_tlb_pgtable(tlb->mm, addr); 69 68 tlb_remove_entry(tlb, virt_to_page(pudp)); 70 69 } 71 70 #endif
+13
arch/arm64/include/asm/tlbflush.h
··· 144 144 } 145 145 146 146 /* 147 + * Used to invalidate the TLB (walk caches) corresponding to intermediate page 148 + * table levels (pgd/pud/pmd). 149 + */ 150 + static inline void __flush_tlb_pgtable(struct mm_struct *mm, 151 + unsigned long uaddr) 152 + { 153 + unsigned long addr = uaddr >> 12 | ((unsigned long)ASID(mm) << 48); 154 + 155 + dsb(ishst); 156 + asm("tlbi vae1is, %0" : : "r" (addr)); 157 + dsb(ish); 158 + } 159 + /* 147 160 * On AArch64, the cache coherency is handled via the set_pte_at() function. 148 161 */ 149 162 static inline void update_mmu_cache(struct vm_area_struct *vma,
+9
arch/arm64/kernel/efi.c
··· 354 354 efi_set_pgd(current->active_mm); 355 355 preempt_enable(); 356 356 } 357 + 358 + /* 359 + * UpdateCapsule() depends on the system being shutdown via 360 + * ResetSystem(). 361 + */ 362 + bool efi_poweroff_required(void) 363 + { 364 + return efi_enabled(EFI_RUNTIME_SERVICES); 365 + }
+1 -1
arch/arm64/kernel/head.S
··· 585 585 * zeroing of .bss would clobber it. 586 586 */ 587 587 .pushsection .data..cacheline_aligned 588 - ENTRY(__boot_cpu_mode) 589 588 .align L1_CACHE_SHIFT 589 + ENTRY(__boot_cpu_mode) 590 590 .long BOOT_CPU_MODE_EL2 591 591 .long 0 592 592 .popsection
+8
arch/arm64/kernel/process.c
··· 21 21 #include <stdarg.h> 22 22 23 23 #include <linux/compat.h> 24 + #include <linux/efi.h> 24 25 #include <linux/export.h> 25 26 #include <linux/sched.h> 26 27 #include <linux/kernel.h> ··· 150 149 /* Disable interrupts first */ 151 150 local_irq_disable(); 152 151 smp_send_stop(); 152 + 153 + /* 154 + * UpdateCapsule() depends on the system being reset via 155 + * ResetSystem(). 156 + */ 157 + if (efi_enabled(EFI_RUNTIME_SERVICES)) 158 + efi_reboot(reboot_mode, NULL); 153 159 154 160 /* Now call the architecture specific reboot code. */ 155 161 if (arm_pm_restart)