summaryrefslogtreecommitdiffstats
path: root/debian/patches-rt/0036-mips-mm-highmem-Switch-to-generic-kmap-atomic.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches-rt/0036-mips-mm-highmem-Switch-to-generic-kmap-atomic.patch')
-rw-r--r--debian/patches-rt/0036-mips-mm-highmem-Switch-to-generic-kmap-atomic.patch219
1 files changed, 219 insertions, 0 deletions
diff --git a/debian/patches-rt/0036-mips-mm-highmem-Switch-to-generic-kmap-atomic.patch b/debian/patches-rt/0036-mips-mm-highmem-Switch-to-generic-kmap-atomic.patch
new file mode 100644
index 000000000..998662451
--- /dev/null
+++ b/debian/patches-rt/0036-mips-mm-highmem-Switch-to-generic-kmap-atomic.patch
@@ -0,0 +1,219 @@
+From 5ff7160041ca1461c70a70237f3c6a4b09d54472 Mon Sep 17 00:00:00 2001
+From: Thomas Gleixner <tglx@linutronix.de>
+Date: Tue, 3 Nov 2020 10:27:25 +0100
+Subject: [PATCH 036/323] mips/mm/highmem: Switch to generic kmap atomic
+Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/5.10/older/patches-5.10.204-rt100.tar.xz
+
+No reason having the same code in every architecture
+
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Cc: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
+Cc: linux-mips@vger.kernel.org
+Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+---
+ arch/mips/Kconfig | 1 +
+ arch/mips/include/asm/fixmap.h | 4 +-
+ arch/mips/include/asm/highmem.h | 6 +--
+ arch/mips/include/asm/kmap_types.h | 13 -----
+ arch/mips/mm/highmem.c | 77 ------------------------------
+ arch/mips/mm/init.c | 4 --
+ 6 files changed, 6 insertions(+), 99 deletions(-)
+ delete mode 100644 arch/mips/include/asm/kmap_types.h
+
+diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
+index 18ebacf29889..0e02b2e6ee06 100644
+--- a/arch/mips/Kconfig
++++ b/arch/mips/Kconfig
+@@ -2733,6 +2733,7 @@ config WAR_MIPS34K_MISSED_ITLB
+ config HIGHMEM
+ bool "High Memory Support"
+ depends on 32BIT && CPU_SUPPORTS_HIGHMEM && SYS_SUPPORTS_HIGHMEM && !CPU_MIPS32_3_5_EVA
++ select KMAP_LOCAL
+
+ config CPU_SUPPORTS_HIGHMEM
+ bool
+diff --git a/arch/mips/include/asm/fixmap.h b/arch/mips/include/asm/fixmap.h
+index 743535be7528..beea14761cef 100644
+--- a/arch/mips/include/asm/fixmap.h
++++ b/arch/mips/include/asm/fixmap.h
+@@ -17,7 +17,7 @@
+ #include <spaces.h>
+ #ifdef CONFIG_HIGHMEM
+ #include <linux/threads.h>
+-#include <asm/kmap_types.h>
++#include <asm/kmap_size.h>
+ #endif
+
+ /*
+@@ -52,7 +52,7 @@ enum fixed_addresses {
+ #ifdef CONFIG_HIGHMEM
+ /* reserved pte's for temporary kernel mappings */
+ FIX_KMAP_BEGIN = FIX_CMAP_END + 1,
+- FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1,
++ FIX_KMAP_END = FIX_KMAP_BEGIN + (KM_MAX_IDX * NR_CPUS) - 1,
+ #endif
+ __end_of_fixed_addresses
+ };
+diff --git a/arch/mips/include/asm/highmem.h b/arch/mips/include/asm/highmem.h
+index 9f021cf51aa7..1716181ea66d 100644
+--- a/arch/mips/include/asm/highmem.h
++++ b/arch/mips/include/asm/highmem.h
+@@ -24,7 +24,7 @@
+ #include <linux/interrupt.h>
+ #include <linux/uaccess.h>
+ #include <asm/cpu-features.h>
+-#include <asm/kmap_types.h>
++#include <asm/kmap_size.h>
+
+ /* declarations for highmem.c */
+ extern unsigned long highstart_pfn, highend_pfn;
+@@ -48,11 +48,11 @@ extern pte_t *pkmap_page_table;
+
+ #define ARCH_HAS_KMAP_FLUSH_TLB
+ extern void kmap_flush_tlb(unsigned long addr);
+-extern void *kmap_atomic_pfn(unsigned long pfn);
+
+ #define flush_cache_kmaps() BUG_ON(cpu_has_dc_aliases)
+
+-extern void kmap_init(void);
++#define arch_kmap_local_post_map(vaddr, pteval) local_flush_tlb_one(vaddr)
++#define arch_kmap_local_post_unmap(vaddr) local_flush_tlb_one(vaddr)
+
+ #endif /* __KERNEL__ */
+
+diff --git a/arch/mips/include/asm/kmap_types.h b/arch/mips/include/asm/kmap_types.h
+deleted file mode 100644
+index 16665dc2431b..000000000000
+--- a/arch/mips/include/asm/kmap_types.h
++++ /dev/null
+@@ -1,13 +0,0 @@
+-/* SPDX-License-Identifier: GPL-2.0 */
+-#ifndef _ASM_KMAP_TYPES_H
+-#define _ASM_KMAP_TYPES_H
+-
+-#ifdef CONFIG_DEBUG_HIGHMEM
+-#define __WITH_KM_FENCE
+-#endif
+-
+-#include <asm-generic/kmap_types.h>
+-
+-#undef __WITH_KM_FENCE
+-
+-#endif
+diff --git a/arch/mips/mm/highmem.c b/arch/mips/mm/highmem.c
+index 5fec7f45d79a..57e2f08f00d0 100644
+--- a/arch/mips/mm/highmem.c
++++ b/arch/mips/mm/highmem.c
+@@ -8,8 +8,6 @@
+ #include <asm/fixmap.h>
+ #include <asm/tlbflush.h>
+
+-static pte_t *kmap_pte;
+-
+ unsigned long highstart_pfn, highend_pfn;
+
+ void kmap_flush_tlb(unsigned long addr)
+@@ -17,78 +15,3 @@ void kmap_flush_tlb(unsigned long addr)
+ flush_tlb_one(addr);
+ }
+ EXPORT_SYMBOL(kmap_flush_tlb);
+-
+-void *kmap_atomic_high_prot(struct page *page, pgprot_t prot)
+-{
+- unsigned long vaddr;
+- int idx, type;
+-
+- type = kmap_atomic_idx_push();
+- idx = type + KM_TYPE_NR*smp_processor_id();
+- vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
+-#ifdef CONFIG_DEBUG_HIGHMEM
+- BUG_ON(!pte_none(*(kmap_pte - idx)));
+-#endif
+- set_pte(kmap_pte-idx, mk_pte(page, prot));
+- local_flush_tlb_one((unsigned long)vaddr);
+-
+- return (void*) vaddr;
+-}
+-EXPORT_SYMBOL(kmap_atomic_high_prot);
+-
+-void kunmap_atomic_high(void *kvaddr)
+-{
+- unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK;
+- int type __maybe_unused;
+-
+- if (vaddr < FIXADDR_START)
+- return;
+-
+- type = kmap_atomic_idx();
+-#ifdef CONFIG_DEBUG_HIGHMEM
+- {
+- int idx = type + KM_TYPE_NR * smp_processor_id();
+-
+- BUG_ON(vaddr != __fix_to_virt(FIX_KMAP_BEGIN + idx));
+-
+- /*
+- * force other mappings to Oops if they'll try to access
+- * this pte without first remap it
+- */
+- pte_clear(&init_mm, vaddr, kmap_pte-idx);
+- local_flush_tlb_one(vaddr);
+- }
+-#endif
+- kmap_atomic_idx_pop();
+-}
+-EXPORT_SYMBOL(kunmap_atomic_high);
+-
+-/*
+- * This is the same as kmap_atomic() but can map memory that doesn't
+- * have a struct page associated with it.
+- */
+-void *kmap_atomic_pfn(unsigned long pfn)
+-{
+- unsigned long vaddr;
+- int idx, type;
+-
+- preempt_disable();
+- pagefault_disable();
+-
+- type = kmap_atomic_idx_push();
+- idx = type + KM_TYPE_NR*smp_processor_id();
+- vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
+- set_pte(kmap_pte-idx, pfn_pte(pfn, PAGE_KERNEL));
+- flush_tlb_one(vaddr);
+-
+- return (void*) vaddr;
+-}
+-
+-void __init kmap_init(void)
+-{
+- unsigned long kmap_vstart;
+-
+- /* cache the first kmap pte */
+- kmap_vstart = __fix_to_virt(FIX_KMAP_BEGIN);
+- kmap_pte = virt_to_kpte(kmap_vstart);
+-}
+diff --git a/arch/mips/mm/init.c b/arch/mips/mm/init.c
+index 07e84a774938..bc80893e5c0f 100644
+--- a/arch/mips/mm/init.c
++++ b/arch/mips/mm/init.c
+@@ -36,7 +36,6 @@
+ #include <asm/cachectl.h>
+ #include <asm/cpu.h>
+ #include <asm/dma.h>
+-#include <asm/kmap_types.h>
+ #include <asm/maar.h>
+ #include <asm/mmu_context.h>
+ #include <asm/sections.h>
+@@ -402,9 +401,6 @@ void __init paging_init(void)
+
+ pagetable_init();
+
+-#ifdef CONFIG_HIGHMEM
+- kmap_init();
+-#endif
+ #ifdef CONFIG_ZONE_DMA
+ max_zone_pfns[ZONE_DMA] = MAX_DMA_PFN;
+ #endif
+--
+2.43.0
+