- Add upstream aarch64 patch to fix hang due to cache invalidation bug
- Fix aarch64 DTBs now they're in vendor sub dirs
This commit is contained in:
parent
338da7b70d
commit
8eb15d5503
|
@ -0,0 +1,85 @@
|
|||
commit 285994a62c80f1d72c6924282bcb59608098d5ec
|
||||
Author: Catalin Marinas <catalin.marinas@arm.com>
|
||||
Date: Wed Mar 11 12:20:39 2015 +0000
|
||||
|
||||
arm64: Invalidate the TLB corresponding to intermediate page table levels
|
||||
|
||||
The ARM architecture allows the caching of intermediate page table
|
||||
levels and page table freeing requires a sequence like:
|
||||
|
||||
pmd_clear()
|
||||
TLB invalidation
|
||||
pte page freeing
|
||||
|
||||
With commit 5e5f6dc10546 (arm64: mm: enable HAVE_RCU_TABLE_FREE logic),
|
||||
the page table freeing batching was moved from tlb_remove_page() to
|
||||
tlb_remove_table(). The former takes care of TLB invalidation as this is
|
||||
also shared with pte clearing and page cache page freeing. The latter,
|
||||
however, does not invalidate the TLBs for intermediate page table levels
|
||||
as it probably relies on the architecture code to do it if required.
|
||||
When the mm->mm_users < 2, tlb_remove_table() does not do any batching
|
||||
and page table pages are freed before tlb_finish_mmu() which performs
|
||||
the actual TLB invalidation.
|
||||
|
||||
This patch introduces __tlb_flush_pgtable() for arm64 and calls it from
|
||||
the {pte,pmd,pud}_free_tlb() directly without relying on deferred page
|
||||
table freeing.
|
||||
|
||||
Fixes: 5e5f6dc10546 arm64: mm: enable HAVE_RCU_TABLE_FREE logic
|
||||
Reported-by: Jon Masters <jcm@redhat.com>
|
||||
Tested-by: Jon Masters <jcm@redhat.com>
|
||||
Tested-by: Steve Capper <steve.capper@linaro.org>
|
||||
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
|
||||
|
||||
diff --git a/arch/arm64/include/asm/tlb.h b/arch/arm64/include/asm/tlb.h
|
||||
index c028fe3..53d9c35 100644
|
||||
--- a/arch/arm64/include/asm/tlb.h
|
||||
+++ b/arch/arm64/include/asm/tlb.h
|
||||
@@ -48,6 +48,7 @@ static inline void tlb_flush(struct mmu_gather *tlb)
|
||||
static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte,
|
||||
unsigned long addr)
|
||||
{
|
||||
+ __flush_tlb_pgtable(tlb->mm, addr);
|
||||
pgtable_page_dtor(pte);
|
||||
tlb_remove_entry(tlb, pte);
|
||||
}
|
||||
@@ -56,6 +57,7 @@ static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte,
|
||||
static inline void __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmdp,
|
||||
unsigned long addr)
|
||||
{
|
||||
+ __flush_tlb_pgtable(tlb->mm, addr);
|
||||
tlb_remove_entry(tlb, virt_to_page(pmdp));
|
||||
}
|
||||
#endif
|
||||
@@ -64,6 +66,7 @@ static inline void __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmdp,
|
||||
static inline void __pud_free_tlb(struct mmu_gather *tlb, pud_t *pudp,
|
||||
unsigned long addr)
|
||||
{
|
||||
+ __flush_tlb_pgtable(tlb->mm, addr);
|
||||
tlb_remove_entry(tlb, virt_to_page(pudp));
|
||||
}
|
||||
#endif
|
||||
diff --git a/arch/arm64/include/asm/tlbflush.h b/arch/arm64/include/asm/tlbflush.h
|
||||
index 4abe9b9..c3bb05b 100644
|
||||
--- a/arch/arm64/include/asm/tlbflush.h
|
||||
+++ b/arch/arm64/include/asm/tlbflush.h
|
||||
@@ -144,6 +144,19 @@ static inline void flush_tlb_kernel_range(unsigned long start, unsigned long end
|
||||
}
|
||||
|
||||
/*
|
||||
+ * Used to invalidate the TLB (walk caches) corresponding to intermediate page
|
||||
+ * table levels (pgd/pud/pmd).
|
||||
+ */
|
||||
+static inline void __flush_tlb_pgtable(struct mm_struct *mm,
|
||||
+ unsigned long uaddr)
|
||||
+{
|
||||
+ unsigned long addr = uaddr >> 12 | ((unsigned long)ASID(mm) << 48);
|
||||
+
|
||||
+ dsb(ishst);
|
||||
+ asm("tlbi vae1is, %0" : : "r" (addr));
|
||||
+ dsb(ish);
|
||||
+}
|
||||
+/*
|
||||
* On AArch64, the cache coherency is handled via the set_pte_at() function.
|
||||
*/
|
||||
static inline void update_mmu_cache(struct vm_area_struct *vma,
|
13
kernel.spec
13
kernel.spec
|
@ -652,6 +652,7 @@ Patch26168: HID-multitouch-add-support-of-clickpads.patch
|
|||
|
||||
# git clone ssh://git.fedorahosted.org/git/kernel-arm64.git, git diff master...devel
|
||||
Patch30000: kernel-arm64.patch
|
||||
Patch30001: aarch64-fix-tlb-issues.patch
|
||||
|
||||
# END OF PATCH DEFINITIONS
|
||||
|
||||
|
@ -1409,6 +1410,8 @@ ApplyPatch HID-multitouch-add-support-of-clickpads.patch
|
|||
|
||||
%if 0%{?aarch64patches}
|
||||
ApplyPatch kernel-arm64.patch
|
||||
# Just needed for 3.19
|
||||
ApplyPatch aarch64-fix-tlb-issues.patch
|
||||
%ifnarch aarch64 # this is stupid, but i want to notice before secondary koji does.
|
||||
ApplyPatch kernel-arm64.patch -R
|
||||
%endif
|
||||
|
@ -1546,10 +1549,8 @@ BuildKernel() {
|
|||
%{make} -s ARCH=$Arch V=1 %{?_smp_mflags} modules %{?sparse_mflags} || exit 1
|
||||
|
||||
%ifarch %{arm} aarch64
|
||||
%{make} -s ARCH=$Arch V=1 dtbs
|
||||
mkdir -p $RPM_BUILD_ROOT/%{image_install_path}/dtb-$KernelVer
|
||||
install -m 644 arch/$Arch/boot/dts/*.dtb $RPM_BUILD_ROOT/%{image_install_path}/dtb-$KernelVer/
|
||||
rm -f arch/$Arch/boot/dts/*.dtb
|
||||
%{make} -s ARCH=$Arch V=1 dtbs dtbs_install INSTALL_DTBS_PATH=$RPM_BUILD_ROOT/%{image_install_path}/dtb-$KernelVer
|
||||
find arch/$Arch/boot/dts -name '*.dtb' -type f | xargs rm -f
|
||||
%endif
|
||||
|
||||
# Start installing the results
|
||||
|
@ -2275,6 +2276,10 @@ fi
|
|||
# ||----w |
|
||||
# || ||
|
||||
%changelog
|
||||
* Wed Mar 18 2015 Peter Robinson <pbrobinson@fedoraproject.org>
|
||||
- Add upstream aarch64 patch to fix hang due to cache invalidation bug
|
||||
- Fix aarch64 DTBs now they're in vendor sub dirs
|
||||
|
||||
* Tue Mar 17 2015 Justin M. Forbes <jforbes@fedoraproject.org> - 3.19.1-201
|
||||
- Re-add patch to quiet i915 state machine
|
||||
|
||||
|
|
Loading…
Reference in New Issue