From: Ira Weiny ira.weiny@intel.com
The kmap infrastructure has been copied almost verbatim to every architecture. This series consolidates obvious duplicated code by defining core functions which call into the architectures only when needed.
Some of the k[un]map_atomic() implementations have some similarities but the similarities were not sufficient to warrant further changes.
In addition we remove a duplicate implementation of kmap() in DRM.
Testing was done by 0day to cover all the architectures I can't readily build/test.
--- Changes from V2: Collect review/acks Add kmap_prot consolidation patch from Christoph Add 3 suggested patches from Al Viro Fix include for microblaze Fix static inline for microblaze
Changes from V1: Fix bisect-ability Update commit message and fix line lengths Remove unneded kunmap_atomic_high() declarations Remove unneded kmap_atomic_high() declarations collect reviews rebase to 5.7-rc4
Changes from V0: Define kmap_flush_tlb() and make kmap() truely arch independent. Redefine the k[un]map_atomic_* code to call into the architectures for high mem pages Ensure all architectures define kmap_prot, use it appropriately, and define kmap_atomic_prot() Remove drm implementation of kmap_atomic()
Ira Weiny (15): arch/kmap: Remove BUG_ON() arch/xtensa: Move kmap build bug out of the way arch/kmap: Remove redundant arch specific kmaps arch/kunmap: Remove duplicate kunmap implementations {x86,powerpc,microblaze}/kmap: Move preempt disable arch/kmap_atomic: Consolidate duplicate code arch/kunmap_atomic: Consolidate duplicate code arch/kmap: Ensure kmap_prot visibility arch/kmap: Don't hard code kmap_prot values arch/kmap: Define kmap_atomic_prot() for all arch's drm: Remove drm specific kmap_atomic code kmap: Remove kmap_atomic_to_page() parisc/kmap: Remove duplicate kmap code sparc: Remove unnecessary includes kmap: Consolidate kmap_prot definitions
arch/arc/include/asm/highmem.h | 18 ------- arch/arc/mm/highmem.c | 28 ++-------- arch/arm/include/asm/highmem.h | 9 ---- arch/arm/mm/highmem.c | 35 ++----------- arch/csky/include/asm/highmem.h | 12 +---- arch/csky/mm/highmem.c | 56 ++++---------------- arch/microblaze/include/asm/highmem.h | 27 ---------- arch/microblaze/mm/highmem.c | 16 ++---- arch/microblaze/mm/init.c | 3 -- arch/mips/include/asm/highmem.h | 11 +--- arch/mips/mm/cache.c | 6 +-- arch/mips/mm/highmem.c | 49 +++--------------- arch/nds32/include/asm/highmem.h | 9 ---- arch/nds32/mm/highmem.c | 39 ++------------ arch/parisc/include/asm/cacheflush.h | 30 +---------- arch/powerpc/include/asm/highmem.h | 28 ---------- arch/powerpc/mm/highmem.c | 21 ++------ arch/powerpc/mm/mem.c | 3 -- arch/sparc/include/asm/highmem.h | 25 +-------- arch/sparc/mm/highmem.c | 20 ++------ arch/sparc/mm/io-unit.c | 1 - arch/sparc/mm/iommu.c | 1 - arch/x86/include/asm/fixmap.h | 1 - arch/x86/include/asm/highmem.h | 9 ---- arch/x86/mm/highmem_32.c | 50 ++---------------- arch/xtensa/include/asm/highmem.h | 27 ---------- arch/xtensa/mm/highmem.c | 22 ++++---- drivers/gpu/drm/ttm/ttm_bo_util.c | 56 ++------------------ drivers/gpu/drm/vmwgfx/vmwgfx_blit.c | 16 +++--- include/drm/ttm/ttm_bo_api.h | 4 -- include/linux/highmem.h | 74 ++++++++++++++++++++++++--- 31 files changed, 150 insertions(+), 556 deletions(-)
From: Ira Weiny ira.weiny@intel.com
Replace the use of BUG_ON(in_interrupt()) in the kmap() and kunmap() in favor of might_sleep().
Besides the benefits of might_sleep(), this normalizes the implementations such that they can be made generic in subsequent patches.
Reviewed-by: Dan Williams dan.j.williams@intel.com Reviewed-by: Christoph Hellwig hch@lst.de Signed-off-by: Ira Weiny ira.weiny@intel.com --- arch/arc/include/asm/highmem.h | 2 +- arch/arc/mm/highmem.c | 2 +- arch/arm/mm/highmem.c | 2 +- arch/csky/mm/highmem.c | 2 +- arch/microblaze/include/asm/highmem.h | 2 +- arch/mips/mm/highmem.c | 2 +- arch/nds32/mm/highmem.c | 2 +- arch/powerpc/include/asm/highmem.h | 2 +- arch/sparc/include/asm/highmem.h | 4 ++-- arch/x86/mm/highmem_32.c | 3 +-- arch/xtensa/include/asm/highmem.h | 4 ++-- 11 files changed, 13 insertions(+), 14 deletions(-)
diff --git a/arch/arc/include/asm/highmem.h b/arch/arc/include/asm/highmem.h index 1af00accb37f..042e92921c4c 100644 --- a/arch/arc/include/asm/highmem.h +++ b/arch/arc/include/asm/highmem.h @@ -45,7 +45,7 @@ static inline void flush_cache_kmaps(void)
static inline void kunmap(struct page *page) { - BUG_ON(in_interrupt()); + might_sleep(); if (!PageHighMem(page)) return; kunmap_high(page); diff --git a/arch/arc/mm/highmem.c b/arch/arc/mm/highmem.c index fc8849e4f72e..39ef7b9a3aa9 100644 --- a/arch/arc/mm/highmem.c +++ b/arch/arc/mm/highmem.c @@ -51,7 +51,7 @@ static pte_t * fixmap_page_table;
void *kmap(struct page *page) { - BUG_ON(in_interrupt()); + might_sleep(); if (!PageHighMem(page)) return page_address(page);
diff --git a/arch/arm/mm/highmem.c b/arch/arm/mm/highmem.c index a76f8ace9ce6..cc6eb79ef20c 100644 --- a/arch/arm/mm/highmem.c +++ b/arch/arm/mm/highmem.c @@ -42,7 +42,7 @@ EXPORT_SYMBOL(kmap);
void kunmap(struct page *page) { - BUG_ON(in_interrupt()); + might_sleep(); if (!PageHighMem(page)) return; kunmap_high(page); diff --git a/arch/csky/mm/highmem.c b/arch/csky/mm/highmem.c index 813129145f3d..690d678649d1 100644 --- a/arch/csky/mm/highmem.c +++ b/arch/csky/mm/highmem.c @@ -29,7 +29,7 @@ EXPORT_SYMBOL(kmap);
void kunmap(struct page *page) { - BUG_ON(in_interrupt()); + might_sleep(); if (!PageHighMem(page)) return; kunmap_high(page); diff --git a/arch/microblaze/include/asm/highmem.h b/arch/microblaze/include/asm/highmem.h index 332c78e15198..99ced7278b5c 100644 --- a/arch/microblaze/include/asm/highmem.h +++ b/arch/microblaze/include/asm/highmem.h @@ -66,7 +66,7 @@ static inline void *kmap(struct page *page)
static inline void kunmap(struct page *page) { - BUG_ON(in_interrupt()); + might_sleep(); if (!PageHighMem(page)) return; kunmap_high(page); diff --git a/arch/mips/mm/highmem.c b/arch/mips/mm/highmem.c index d08e6d7d533b..edd889f6cede 100644 --- a/arch/mips/mm/highmem.c +++ b/arch/mips/mm/highmem.c @@ -28,7 +28,7 @@ EXPORT_SYMBOL(kmap);
void kunmap(struct page *page) { - BUG_ON(in_interrupt()); + might_sleep(); if (!PageHighMem(page)) return; kunmap_high(page); diff --git a/arch/nds32/mm/highmem.c b/arch/nds32/mm/highmem.c index 022779af6148..4c7c28e994ea 100644 --- a/arch/nds32/mm/highmem.c +++ b/arch/nds32/mm/highmem.c @@ -24,7 +24,7 @@ EXPORT_SYMBOL(kmap);
void kunmap(struct page *page) { - BUG_ON(in_interrupt()); + might_sleep(); if (!PageHighMem(page)) return; kunmap_high(page); diff --git a/arch/powerpc/include/asm/highmem.h b/arch/powerpc/include/asm/highmem.h index a4b65b186ec6..529512f6d65a 100644 --- a/arch/powerpc/include/asm/highmem.h +++ b/arch/powerpc/include/asm/highmem.h @@ -74,7 +74,7 @@ static inline void *kmap(struct page *page)
static inline void kunmap(struct page *page) { - BUG_ON(in_interrupt()); + might_sleep(); if (!PageHighMem(page)) return; kunmap_high(page); diff --git a/arch/sparc/include/asm/highmem.h b/arch/sparc/include/asm/highmem.h index 18d776925c45..7dd2d4b3f980 100644 --- a/arch/sparc/include/asm/highmem.h +++ b/arch/sparc/include/asm/highmem.h @@ -55,7 +55,7 @@ void kunmap_high(struct page *page);
static inline void *kmap(struct page *page) { - BUG_ON(in_interrupt()); + might_sleep(); if (!PageHighMem(page)) return page_address(page); return kmap_high(page); @@ -63,7 +63,7 @@ static inline void *kmap(struct page *page)
static inline void kunmap(struct page *page) { - BUG_ON(in_interrupt()); + might_sleep(); if (!PageHighMem(page)) return; kunmap_high(page); diff --git a/arch/x86/mm/highmem_32.c b/arch/x86/mm/highmem_32.c index 0a1898b8552e..8af66382672b 100644 --- a/arch/x86/mm/highmem_32.c +++ b/arch/x86/mm/highmem_32.c @@ -15,8 +15,7 @@ EXPORT_SYMBOL(kmap);
void kunmap(struct page *page) { - if (in_interrupt()) - BUG(); + might_sleep(); if (!PageHighMem(page)) return; kunmap_high(page); diff --git a/arch/xtensa/include/asm/highmem.h b/arch/xtensa/include/asm/highmem.h index 04e9340eac4b..413848cc1e56 100644 --- a/arch/xtensa/include/asm/highmem.h +++ b/arch/xtensa/include/asm/highmem.h @@ -73,7 +73,7 @@ static inline void *kmap(struct page *page) */ BUILD_BUG_ON(PKMAP_BASE < TLBTEMP_BASE_1 + TLBTEMP_SIZE); - BUG_ON(in_interrupt()); + might_sleep(); if (!PageHighMem(page)) return page_address(page); return kmap_high(page); @@ -81,7 +81,7 @@ static inline void *kmap(struct page *page)
static inline void kunmap(struct page *page) { - BUG_ON(in_interrupt()); + might_sleep(); if (!PageHighMem(page)) return; kunmap_high(page);
From: Ira Weiny ira.weiny@intel.com
Move the kmap() build bug to kmap_init() to facilitate patches to lift kmap() to the core.
Reviewed-by: Christoph Hellwig hch@lst.de Signed-off-by: Ira Weiny ira.weiny@intel.com
--- Changes from V1: combine code onto 1 line. --- arch/xtensa/include/asm/highmem.h | 5 ----- arch/xtensa/mm/highmem.c | 4 ++++ 2 files changed, 4 insertions(+), 5 deletions(-)
diff --git a/arch/xtensa/include/asm/highmem.h b/arch/xtensa/include/asm/highmem.h index 413848cc1e56..a9587c85be85 100644 --- a/arch/xtensa/include/asm/highmem.h +++ b/arch/xtensa/include/asm/highmem.h @@ -68,11 +68,6 @@ void kunmap_high(struct page *page);
static inline void *kmap(struct page *page) { - /* Check if this memory layout is broken because PKMAP overlaps - * page table. - */ - BUILD_BUG_ON(PKMAP_BASE < - TLBTEMP_BASE_1 + TLBTEMP_SIZE); might_sleep(); if (!PageHighMem(page)) return page_address(page); diff --git a/arch/xtensa/mm/highmem.c b/arch/xtensa/mm/highmem.c index 184ceadccc1a..da734a2ed641 100644 --- a/arch/xtensa/mm/highmem.c +++ b/arch/xtensa/mm/highmem.c @@ -88,6 +88,10 @@ void __init kmap_init(void) { unsigned long kmap_vstart;
+ /* Check if this memory layout is broken because PKMAP overlaps + * page table. + */ + BUILD_BUG_ON(PKMAP_BASE < TLBTEMP_BASE_1 + TLBTEMP_SIZE); /* cache the first kmap pte */ kmap_vstart = __fix_to_virt(FIX_KMAP_BEGIN); kmap_pte = kmap_get_fixmap_pte(kmap_vstart);
From: Ira Weiny ira.weiny@intel.com
The kmap code for all the architectures is almost 100% identical.
Lift the common code to the core. Use ARCH_HAS_KMAP_FLUSH_TLB to indicate if an arch defines kmap_flush_tlb() and call if if needed.
This also has the benefit of changing kmap() on a number of architectures to be an inline call rather than an actual function.
Reviewed-by: Christoph Hellwig hch@lst.de Signed-off-by: Ira Weiny ira.weiny@intel.com --- arch/arc/include/asm/highmem.h | 2 -- arch/arc/mm/highmem.c | 10 ---------- arch/arm/include/asm/highmem.h | 2 -- arch/arm/mm/highmem.c | 9 --------- arch/csky/include/asm/highmem.h | 4 ++-- arch/csky/mm/highmem.c | 14 ++++---------- arch/microblaze/include/asm/highmem.h | 9 --------- arch/mips/include/asm/highmem.h | 4 ++-- arch/mips/mm/highmem.c | 14 +++----------- arch/nds32/include/asm/highmem.h | 2 -- arch/nds32/mm/highmem.c | 12 ------------ arch/powerpc/include/asm/highmem.h | 9 --------- arch/sparc/include/asm/highmem.h | 9 --------- arch/x86/include/asm/highmem.h | 2 -- arch/x86/mm/highmem_32.c | 9 --------- arch/xtensa/include/asm/highmem.h | 9 --------- include/linux/highmem.h | 18 ++++++++++++++++++ 17 files changed, 29 insertions(+), 109 deletions(-)
diff --git a/arch/arc/include/asm/highmem.h b/arch/arc/include/asm/highmem.h index 042e92921c4c..96eb67c86961 100644 --- a/arch/arc/include/asm/highmem.h +++ b/arch/arc/include/asm/highmem.h @@ -30,8 +30,6 @@
#include <asm/cacheflush.h>
-extern void *kmap(struct page *page); -extern void *kmap_high(struct page *page); extern void *kmap_atomic(struct page *page); extern void __kunmap_atomic(void *kvaddr); extern void kunmap_high(struct page *page); diff --git a/arch/arc/mm/highmem.c b/arch/arc/mm/highmem.c index 39ef7b9a3aa9..4db13a6b9f3b 100644 --- a/arch/arc/mm/highmem.c +++ b/arch/arc/mm/highmem.c @@ -49,16 +49,6 @@ extern pte_t * pkmap_page_table; static pte_t * fixmap_page_table;
-void *kmap(struct page *page) -{ - might_sleep(); - if (!PageHighMem(page)) - return page_address(page); - - return kmap_high(page); -} -EXPORT_SYMBOL(kmap); - void *kmap_atomic(struct page *page) { int idx, cpu_idx; diff --git a/arch/arm/include/asm/highmem.h b/arch/arm/include/asm/highmem.h index eb4e4207cd3c..c917522541de 100644 --- a/arch/arm/include/asm/highmem.h +++ b/arch/arm/include/asm/highmem.h @@ -20,7 +20,6 @@
extern pte_t *pkmap_page_table;
-extern void *kmap_high(struct page *page); extern void kunmap_high(struct page *page);
/* @@ -63,7 +62,6 @@ static inline void *kmap_high_get(struct page *page) * when CONFIG_HIGHMEM is not set. */ #ifdef CONFIG_HIGHMEM -extern void *kmap(struct page *page); extern void kunmap(struct page *page); extern void *kmap_atomic(struct page *page); extern void __kunmap_atomic(void *kvaddr); diff --git a/arch/arm/mm/highmem.c b/arch/arm/mm/highmem.c index cc6eb79ef20c..e8ba37c36590 100644 --- a/arch/arm/mm/highmem.c +++ b/arch/arm/mm/highmem.c @@ -31,15 +31,6 @@ static inline pte_t get_fixmap_pte(unsigned long vaddr) return *ptep; }
-void *kmap(struct page *page) -{ - might_sleep(); - if (!PageHighMem(page)) - return page_address(page); - return kmap_high(page); -} -EXPORT_SYMBOL(kmap); - void kunmap(struct page *page) { might_sleep(); diff --git a/arch/csky/include/asm/highmem.h b/arch/csky/include/asm/highmem.h index a345a2f2c22e..9d0516e38110 100644 --- a/arch/csky/include/asm/highmem.h +++ b/arch/csky/include/asm/highmem.h @@ -30,10 +30,10 @@ extern pte_t *pkmap_page_table; #define PKMAP_NR(virt) ((virt-PKMAP_BASE) >> PAGE_SHIFT) #define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT))
-extern void *kmap_high(struct page *page); extern void kunmap_high(struct page *page);
-extern void *kmap(struct page *page); +#define ARCH_HAS_KMAP_FLUSH_TLB +extern void kmap_flush_tlb(unsigned long addr); extern void kunmap(struct page *page); extern void *kmap_atomic(struct page *page); extern void __kunmap_atomic(void *kvaddr); diff --git a/arch/csky/mm/highmem.c b/arch/csky/mm/highmem.c index 690d678649d1..4a3c273bc8b9 100644 --- a/arch/csky/mm/highmem.c +++ b/arch/csky/mm/highmem.c @@ -13,18 +13,12 @@ static pte_t *kmap_pte;
unsigned long highstart_pfn, highend_pfn;
-void *kmap(struct page *page) +void kmap_flush_tlb(unsigned long addr) { - void *addr; - - might_sleep(); - if (!PageHighMem(page)) - return page_address(page); - addr = kmap_high(page); - flush_tlb_one((unsigned long)addr); - - return addr; + flush_tlb_one(addr); } +EXPORT_SYMBOL(kmap_flush_tlb); + EXPORT_SYMBOL(kmap);
void kunmap(struct page *page) diff --git a/arch/microblaze/include/asm/highmem.h b/arch/microblaze/include/asm/highmem.h index 99ced7278b5c..8c5bfd228bd8 100644 --- a/arch/microblaze/include/asm/highmem.h +++ b/arch/microblaze/include/asm/highmem.h @@ -51,19 +51,10 @@ extern pte_t *pkmap_page_table; #define PKMAP_NR(virt) ((virt - PKMAP_BASE) >> PAGE_SHIFT) #define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT))
-extern void *kmap_high(struct page *page); extern void kunmap_high(struct page *page); extern void *kmap_atomic_prot(struct page *page, pgprot_t prot); extern void __kunmap_atomic(void *kvaddr);
-static inline void *kmap(struct page *page) -{ - might_sleep(); - if (!PageHighMem(page)) - return page_address(page); - return kmap_high(page); -} - static inline void kunmap(struct page *page) { might_sleep(); diff --git a/arch/mips/include/asm/highmem.h b/arch/mips/include/asm/highmem.h index 9d84aafc33d0..1f741e3ecabf 100644 --- a/arch/mips/include/asm/highmem.h +++ b/arch/mips/include/asm/highmem.h @@ -46,10 +46,10 @@ extern pte_t *pkmap_page_table; #define PKMAP_NR(virt) ((virt-PKMAP_BASE) >> PAGE_SHIFT) #define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT))
-extern void * kmap_high(struct page *page); extern void kunmap_high(struct page *page);
-extern void *kmap(struct page *page); +#define ARCH_HAS_KMAP_FLUSH_TLB +extern void kmap_flush_tlb(unsigned long addr); extern void kunmap(struct page *page); extern void *kmap_atomic(struct page *page); extern void __kunmap_atomic(void *kvaddr); diff --git a/arch/mips/mm/highmem.c b/arch/mips/mm/highmem.c index edd889f6cede..c72058bfead6 100644 --- a/arch/mips/mm/highmem.c +++ b/arch/mips/mm/highmem.c @@ -12,19 +12,11 @@ static pte_t *kmap_pte;
unsigned long highstart_pfn, highend_pfn;
-void *kmap(struct page *page) +void kmap_flush_tlb(unsigned long addr) { - void *addr; - - might_sleep(); - if (!PageHighMem(page)) - return page_address(page); - addr = kmap_high(page); - flush_tlb_one((unsigned long)addr); - - return addr; + flush_tlb_one(addr); } -EXPORT_SYMBOL(kmap); +EXPORT_SYMBOL(kmap_flush_tlb);
void kunmap(struct page *page) { diff --git a/arch/nds32/include/asm/highmem.h b/arch/nds32/include/asm/highmem.h index b3a82c97ded3..b13654a79069 100644 --- a/arch/nds32/include/asm/highmem.h +++ b/arch/nds32/include/asm/highmem.h @@ -44,7 +44,6 @@ extern unsigned long highstart_pfn, highend_pfn;
extern pte_t *pkmap_page_table;
-extern void *kmap_high(struct page *page); extern void kunmap_high(struct page *page);
extern void kmap_init(void); @@ -54,7 +53,6 @@ extern void kmap_init(void); * when CONFIG_HIGHMEM is not set. */ #ifdef CONFIG_HIGHMEM -extern void *kmap(struct page *page); extern void kunmap(struct page *page); extern void *kmap_atomic(struct page *page); extern void __kunmap_atomic(void *kvaddr); diff --git a/arch/nds32/mm/highmem.c b/arch/nds32/mm/highmem.c index 4c7c28e994ea..d0cde53b84ae 100644 --- a/arch/nds32/mm/highmem.c +++ b/arch/nds32/mm/highmem.c @@ -10,18 +10,6 @@ #include <asm/fixmap.h> #include <asm/tlbflush.h>
-void *kmap(struct page *page) -{ - unsigned long vaddr; - might_sleep(); - if (!PageHighMem(page)) - return page_address(page); - vaddr = (unsigned long)kmap_high(page); - return (void *)vaddr; -} - -EXPORT_SYMBOL(kmap); - void kunmap(struct page *page) { might_sleep(); diff --git a/arch/powerpc/include/asm/highmem.h b/arch/powerpc/include/asm/highmem.h index 529512f6d65a..f14e4feef6d5 100644 --- a/arch/powerpc/include/asm/highmem.h +++ b/arch/powerpc/include/asm/highmem.h @@ -59,19 +59,10 @@ extern pte_t *pkmap_page_table; #define PKMAP_NR(virt) ((virt-PKMAP_BASE) >> PAGE_SHIFT) #define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT))
-extern void *kmap_high(struct page *page); extern void kunmap_high(struct page *page); extern void *kmap_atomic_prot(struct page *page, pgprot_t prot); extern void __kunmap_atomic(void *kvaddr);
-static inline void *kmap(struct page *page) -{ - might_sleep(); - if (!PageHighMem(page)) - return page_address(page); - return kmap_high(page); -} - static inline void kunmap(struct page *page) { might_sleep(); diff --git a/arch/sparc/include/asm/highmem.h b/arch/sparc/include/asm/highmem.h index 7dd2d4b3f980..2ff1192047f7 100644 --- a/arch/sparc/include/asm/highmem.h +++ b/arch/sparc/include/asm/highmem.h @@ -50,17 +50,8 @@ void kmap_init(void) __init;
#define PKMAP_END (PKMAP_ADDR(LAST_PKMAP))
-void *kmap_high(struct page *page); void kunmap_high(struct page *page);
-static inline void *kmap(struct page *page) -{ - might_sleep(); - if (!PageHighMem(page)) - return page_address(page); - return kmap_high(page); -} - static inline void kunmap(struct page *page) { might_sleep(); diff --git a/arch/x86/include/asm/highmem.h b/arch/x86/include/asm/highmem.h index a8059930056d..c916a28a9738 100644 --- a/arch/x86/include/asm/highmem.h +++ b/arch/x86/include/asm/highmem.h @@ -58,10 +58,8 @@ extern unsigned long highstart_pfn, highend_pfn; #define PKMAP_NR(virt) ((virt-PKMAP_BASE) >> PAGE_SHIFT) #define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT))
-extern void *kmap_high(struct page *page); extern void kunmap_high(struct page *page);
-void *kmap(struct page *page); void kunmap(struct page *page);
void *kmap_atomic_prot(struct page *page, pgprot_t prot); diff --git a/arch/x86/mm/highmem_32.c b/arch/x86/mm/highmem_32.c index 8af66382672b..12591a81b85c 100644 --- a/arch/x86/mm/highmem_32.c +++ b/arch/x86/mm/highmem_32.c @@ -4,15 +4,6 @@ #include <linux/swap.h> /* for totalram_pages */ #include <linux/memblock.h>
-void *kmap(struct page *page) -{ - might_sleep(); - if (!PageHighMem(page)) - return page_address(page); - return kmap_high(page); -} -EXPORT_SYMBOL(kmap); - void kunmap(struct page *page) { might_sleep(); diff --git a/arch/xtensa/include/asm/highmem.h b/arch/xtensa/include/asm/highmem.h index a9587c85be85..2546b88ddecf 100644 --- a/arch/xtensa/include/asm/highmem.h +++ b/arch/xtensa/include/asm/highmem.h @@ -63,17 +63,8 @@ static inline wait_queue_head_t *get_pkmap_wait_queue_head(unsigned int color)
extern pte_t *pkmap_page_table;
-void *kmap_high(struct page *page); void kunmap_high(struct page *page);
-static inline void *kmap(struct page *page) -{ - might_sleep(); - if (!PageHighMem(page)) - return page_address(page); - return kmap_high(page); -} - static inline void kunmap(struct page *page) { might_sleep(); diff --git a/include/linux/highmem.h b/include/linux/highmem.h index ea5cdbd8c2c3..fc3adc51254a 100644 --- a/include/linux/highmem.h +++ b/include/linux/highmem.h @@ -34,6 +34,24 @@ static inline void invalidate_kernel_vmap_range(void *vaddr, int size) #ifdef CONFIG_HIGHMEM #include <asm/highmem.h>
+#ifndef ARCH_HAS_KMAP_FLUSH_TLB +static inline void kmap_flush_tlb(unsigned long addr) { } +#endif + +void *kmap_high(struct page *page); +static inline void *kmap(struct page *page) +{ + void *addr; + + might_sleep(); + if (!PageHighMem(page)) + addr = page_address(page); + else + addr = kmap_high(page); + kmap_flush_tlb((unsigned long)addr); + return addr; +} + /* declarations for linux/mm/highmem.c */ unsigned int nr_free_highpages(void); extern atomic_long_t _totalhigh_pages;
From: Ira Weiny ira.weiny@intel.com
All architectures do exactly the same thing for kunmap(); remove all the duplicate definitions and lift the call to the core.
This also has the benefit of changing kmap_unmap() on a number of architectures to be an inline call rather than an actual function.
Reviewed-by: Christoph Hellwig hch@lst.de Signed-off-by: Ira Weiny ira.weiny@intel.com --- arch/arc/include/asm/highmem.h | 10 ---------- arch/arm/include/asm/highmem.h | 3 --- arch/arm/mm/highmem.c | 9 --------- arch/csky/include/asm/highmem.h | 3 --- arch/csky/mm/highmem.c | 9 --------- arch/microblaze/include/asm/highmem.h | 9 --------- arch/mips/include/asm/highmem.h | 3 --- arch/mips/mm/highmem.c | 9 --------- arch/nds32/include/asm/highmem.h | 3 --- arch/nds32/mm/highmem.c | 10 ---------- arch/powerpc/include/asm/highmem.h | 9 --------- arch/sparc/include/asm/highmem.h | 10 ---------- arch/x86/include/asm/highmem.h | 4 ---- arch/x86/mm/highmem_32.c | 9 --------- arch/xtensa/include/asm/highmem.h | 10 ---------- include/linux/highmem.h | 9 +++++++++ 16 files changed, 9 insertions(+), 110 deletions(-)
diff --git a/arch/arc/include/asm/highmem.h b/arch/arc/include/asm/highmem.h index 96eb67c86961..8387a5596a91 100644 --- a/arch/arc/include/asm/highmem.h +++ b/arch/arc/include/asm/highmem.h @@ -32,7 +32,6 @@
extern void *kmap_atomic(struct page *page); extern void __kunmap_atomic(void *kvaddr); -extern void kunmap_high(struct page *page);
extern void kmap_init(void);
@@ -41,15 +40,6 @@ static inline void flush_cache_kmaps(void) flush_cache_all(); }
-static inline void kunmap(struct page *page) -{ - might_sleep(); - if (!PageHighMem(page)) - return; - kunmap_high(page); -} - - #endif
#endif diff --git a/arch/arm/include/asm/highmem.h b/arch/arm/include/asm/highmem.h index c917522541de..736f65283e7b 100644 --- a/arch/arm/include/asm/highmem.h +++ b/arch/arm/include/asm/highmem.h @@ -20,8 +20,6 @@
extern pte_t *pkmap_page_table;
-extern void kunmap_high(struct page *page); - /* * The reason for kmap_high_get() is to ensure that the currently kmap'd * page usage count does not decrease to zero while we're using its @@ -62,7 +60,6 @@ static inline void *kmap_high_get(struct page *page) * when CONFIG_HIGHMEM is not set. */ #ifdef CONFIG_HIGHMEM -extern void kunmap(struct page *page); extern void *kmap_atomic(struct page *page); extern void __kunmap_atomic(void *kvaddr); extern void *kmap_atomic_pfn(unsigned long pfn); diff --git a/arch/arm/mm/highmem.c b/arch/arm/mm/highmem.c index e8ba37c36590..c700b32350ee 100644 --- a/arch/arm/mm/highmem.c +++ b/arch/arm/mm/highmem.c @@ -31,15 +31,6 @@ static inline pte_t get_fixmap_pte(unsigned long vaddr) return *ptep; }
-void kunmap(struct page *page) -{ - might_sleep(); - if (!PageHighMem(page)) - return; - kunmap_high(page); -} -EXPORT_SYMBOL(kunmap); - void *kmap_atomic(struct page *page) { unsigned int idx; diff --git a/arch/csky/include/asm/highmem.h b/arch/csky/include/asm/highmem.h index 9d0516e38110..be11c5b67122 100644 --- a/arch/csky/include/asm/highmem.h +++ b/arch/csky/include/asm/highmem.h @@ -30,11 +30,8 @@ extern pte_t *pkmap_page_table; #define PKMAP_NR(virt) ((virt-PKMAP_BASE) >> PAGE_SHIFT) #define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT))
-extern void kunmap_high(struct page *page); - #define ARCH_HAS_KMAP_FLUSH_TLB extern void kmap_flush_tlb(unsigned long addr); -extern void kunmap(struct page *page); extern void *kmap_atomic(struct page *page); extern void __kunmap_atomic(void *kvaddr); extern void *kmap_atomic_pfn(unsigned long pfn); diff --git a/arch/csky/mm/highmem.c b/arch/csky/mm/highmem.c index 4a3c273bc8b9..e9952211264b 100644 --- a/arch/csky/mm/highmem.c +++ b/arch/csky/mm/highmem.c @@ -21,15 +21,6 @@ EXPORT_SYMBOL(kmap_flush_tlb);
EXPORT_SYMBOL(kmap);
-void kunmap(struct page *page) -{ - might_sleep(); - if (!PageHighMem(page)) - return; - kunmap_high(page); -} -EXPORT_SYMBOL(kunmap); - void *kmap_atomic(struct page *page) { unsigned long vaddr; diff --git a/arch/microblaze/include/asm/highmem.h b/arch/microblaze/include/asm/highmem.h index 8c5bfd228bd8..0c94046f2d58 100644 --- a/arch/microblaze/include/asm/highmem.h +++ b/arch/microblaze/include/asm/highmem.h @@ -51,18 +51,9 @@ extern pte_t *pkmap_page_table; #define PKMAP_NR(virt) ((virt - PKMAP_BASE) >> PAGE_SHIFT) #define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT))
-extern void kunmap_high(struct page *page); extern void *kmap_atomic_prot(struct page *page, pgprot_t prot); extern void __kunmap_atomic(void *kvaddr);
-static inline void kunmap(struct page *page) -{ - might_sleep(); - if (!PageHighMem(page)) - return; - kunmap_high(page); -} - static inline void *kmap_atomic(struct page *page) { return kmap_atomic_prot(page, kmap_prot); diff --git a/arch/mips/include/asm/highmem.h b/arch/mips/include/asm/highmem.h index 1f741e3ecabf..24e7e7e5cc7b 100644 --- a/arch/mips/include/asm/highmem.h +++ b/arch/mips/include/asm/highmem.h @@ -46,11 +46,8 @@ extern pte_t *pkmap_page_table; #define PKMAP_NR(virt) ((virt-PKMAP_BASE) >> PAGE_SHIFT) #define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT))
-extern void kunmap_high(struct page *page); - #define ARCH_HAS_KMAP_FLUSH_TLB extern void kmap_flush_tlb(unsigned long addr); -extern void kunmap(struct page *page); extern void *kmap_atomic(struct page *page); extern void __kunmap_atomic(void *kvaddr); extern void *kmap_atomic_pfn(unsigned long pfn); diff --git a/arch/mips/mm/highmem.c b/arch/mips/mm/highmem.c index c72058bfead6..eb8ec8493f2f 100644 --- a/arch/mips/mm/highmem.c +++ b/arch/mips/mm/highmem.c @@ -18,15 +18,6 @@ void kmap_flush_tlb(unsigned long addr) } EXPORT_SYMBOL(kmap_flush_tlb);
-void kunmap(struct page *page) -{ - might_sleep(); - if (!PageHighMem(page)) - return; - kunmap_high(page); -} -EXPORT_SYMBOL(kunmap); - /* * kmap_atomic/kunmap_atomic is significantly faster than kmap/kunmap because * no global lock is needed and because the kmap code must perform a global TLB diff --git a/arch/nds32/include/asm/highmem.h b/arch/nds32/include/asm/highmem.h index b13654a79069..c93c7368bb3f 100644 --- a/arch/nds32/include/asm/highmem.h +++ b/arch/nds32/include/asm/highmem.h @@ -44,8 +44,6 @@ extern unsigned long highstart_pfn, highend_pfn;
extern pte_t *pkmap_page_table;
-extern void kunmap_high(struct page *page); - extern void kmap_init(void);
/* @@ -53,7 +51,6 @@ extern void kmap_init(void); * when CONFIG_HIGHMEM is not set. */ #ifdef CONFIG_HIGHMEM -extern void kunmap(struct page *page); extern void *kmap_atomic(struct page *page); extern void __kunmap_atomic(void *kvaddr); extern void *kmap_atomic_pfn(unsigned long pfn); diff --git a/arch/nds32/mm/highmem.c b/arch/nds32/mm/highmem.c index d0cde53b84ae..f9348bec0ecb 100644 --- a/arch/nds32/mm/highmem.c +++ b/arch/nds32/mm/highmem.c @@ -10,16 +10,6 @@ #include <asm/fixmap.h> #include <asm/tlbflush.h>
-void kunmap(struct page *page) -{ - might_sleep(); - if (!PageHighMem(page)) - return; - kunmap_high(page); -} - -EXPORT_SYMBOL(kunmap); - void *kmap_atomic(struct page *page) { unsigned int idx; diff --git a/arch/powerpc/include/asm/highmem.h b/arch/powerpc/include/asm/highmem.h index f14e4feef6d5..ba3371977d49 100644 --- a/arch/powerpc/include/asm/highmem.h +++ b/arch/powerpc/include/asm/highmem.h @@ -59,18 +59,9 @@ extern pte_t *pkmap_page_table; #define PKMAP_NR(virt) ((virt-PKMAP_BASE) >> PAGE_SHIFT) #define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT))
-extern void kunmap_high(struct page *page); extern void *kmap_atomic_prot(struct page *page, pgprot_t prot); extern void __kunmap_atomic(void *kvaddr);
-static inline void kunmap(struct page *page) -{ - might_sleep(); - if (!PageHighMem(page)) - return; - kunmap_high(page); -} - static inline void *kmap_atomic(struct page *page) { return kmap_atomic_prot(page, kmap_prot); diff --git a/arch/sparc/include/asm/highmem.h b/arch/sparc/include/asm/highmem.h index 2ff1192047f7..4bdb79fed02c 100644 --- a/arch/sparc/include/asm/highmem.h +++ b/arch/sparc/include/asm/highmem.h @@ -50,16 +50,6 @@ void kmap_init(void) __init;
#define PKMAP_END (PKMAP_ADDR(LAST_PKMAP))
-void kunmap_high(struct page *page); - -static inline void kunmap(struct page *page) -{ - might_sleep(); - if (!PageHighMem(page)) - return; - kunmap_high(page); -} - void *kmap_atomic(struct page *page); void __kunmap_atomic(void *kvaddr);
diff --git a/arch/x86/include/asm/highmem.h b/arch/x86/include/asm/highmem.h index c916a28a9738..90b96594d6c5 100644 --- a/arch/x86/include/asm/highmem.h +++ b/arch/x86/include/asm/highmem.h @@ -58,10 +58,6 @@ extern unsigned long highstart_pfn, highend_pfn; #define PKMAP_NR(virt) ((virt-PKMAP_BASE) >> PAGE_SHIFT) #define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT))
-extern void kunmap_high(struct page *page); - -void kunmap(struct page *page); - void *kmap_atomic_prot(struct page *page, pgprot_t prot); void *kmap_atomic(struct page *page); void __kunmap_atomic(void *kvaddr); diff --git a/arch/x86/mm/highmem_32.c b/arch/x86/mm/highmem_32.c index 12591a81b85c..c4ebfd0ae401 100644 --- a/arch/x86/mm/highmem_32.c +++ b/arch/x86/mm/highmem_32.c @@ -4,15 +4,6 @@ #include <linux/swap.h> /* for totalram_pages */ #include <linux/memblock.h>
-void kunmap(struct page *page) -{ - might_sleep(); - if (!PageHighMem(page)) - return; - kunmap_high(page); -} -EXPORT_SYMBOL(kunmap); - /* * kmap_atomic/kunmap_atomic is significantly faster than kmap/kunmap because * no global lock is needed and because the kmap code must perform a global TLB diff --git a/arch/xtensa/include/asm/highmem.h b/arch/xtensa/include/asm/highmem.h index 2546b88ddecf..5a481f7def0b 100644 --- a/arch/xtensa/include/asm/highmem.h +++ b/arch/xtensa/include/asm/highmem.h @@ -63,16 +63,6 @@ static inline wait_queue_head_t *get_pkmap_wait_queue_head(unsigned int color)
extern pte_t *pkmap_page_table;
-void kunmap_high(struct page *page); - -static inline void kunmap(struct page *page) -{ - might_sleep(); - if (!PageHighMem(page)) - return; - kunmap_high(page); -} - static inline void flush_cache_kmaps(void) { flush_cache_all(); diff --git a/include/linux/highmem.h b/include/linux/highmem.h index fc3adc51254a..ae6e8cb81043 100644 --- a/include/linux/highmem.h +++ b/include/linux/highmem.h @@ -52,6 +52,15 @@ static inline void *kmap(struct page *page) return addr; }
+void kunmap_high(struct page *page); +static inline void kunmap(struct page *page) +{ + might_sleep(); + if (!PageHighMem(page)) + return; + kunmap_high(page); +} + /* declarations for linux/mm/highmem.c */ unsigned int nr_free_highpages(void); extern atomic_long_t _totalhigh_pages;
From: Ira Weiny ira.weiny@intel.com
During this kmap() conversion series we must maintain bisect-ability. To do this, kmap_atomic_prot() in x86, powerpc, and microblaze need to remain functional.
Create a temporary inline version of kmap_atomic_prot within these architectures so we can rework their kmap_atomic() calls and then lift kmap_atomic_prot() to the core.
Reviewed-by: Christoph Hellwig hch@lst.de Suggested-by: Al Viro viro@zeniv.linux.org.uk Signed-off-by: Ira Weiny ira.weiny@intel.com
--- Changes from V2: Fix microblaze not being static inline
Changes from V1: New patch --- arch/microblaze/include/asm/highmem.h | 11 ++++++++++- arch/microblaze/mm/highmem.c | 10 ++-------- arch/powerpc/include/asm/highmem.h | 11 ++++++++++- arch/powerpc/mm/highmem.c | 9 ++------- arch/x86/include/asm/highmem.h | 11 ++++++++++- arch/x86/mm/highmem_32.c | 10 ++-------- 6 files changed, 36 insertions(+), 26 deletions(-)
diff --git a/arch/microblaze/include/asm/highmem.h b/arch/microblaze/include/asm/highmem.h index 0c94046f2d58..c38d920a1171 100644 --- a/arch/microblaze/include/asm/highmem.h +++ b/arch/microblaze/include/asm/highmem.h @@ -51,7 +51,16 @@ extern pte_t *pkmap_page_table; #define PKMAP_NR(virt) ((virt - PKMAP_BASE) >> PAGE_SHIFT) #define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT))
-extern void *kmap_atomic_prot(struct page *page, pgprot_t prot); +extern void *kmap_atomic_high_prot(struct page *page, pgprot_t prot); +static inline void *kmap_atomic_prot(struct page *page, pgprot_t prot) +{ + preempt_disable(); + pagefault_disable(); + if (!PageHighMem(page)) + return page_address(page); + + return kmap_atomic_high_prot(page, prot); +} extern void __kunmap_atomic(void *kvaddr);
static inline void *kmap_atomic(struct page *page) diff --git a/arch/microblaze/mm/highmem.c b/arch/microblaze/mm/highmem.c index d7569f77fa15..0e3efaa8a004 100644 --- a/arch/microblaze/mm/highmem.c +++ b/arch/microblaze/mm/highmem.c @@ -32,18 +32,12 @@ */ #include <asm/tlbflush.h>
-void *kmap_atomic_prot(struct page *page, pgprot_t prot) +void *kmap_atomic_high_prot(struct page *page, pgprot_t prot) {
unsigned long vaddr; int idx, type;
- preempt_disable(); - pagefault_disable(); - if (!PageHighMem(page)) - return page_address(page); - - type = kmap_atomic_idx_push(); idx = type + KM_TYPE_NR*smp_processor_id(); vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); @@ -55,7 +49,7 @@ void *kmap_atomic_prot(struct page *page, pgprot_t prot)
return (void *) vaddr; } -EXPORT_SYMBOL(kmap_atomic_prot); +EXPORT_SYMBOL(kmap_atomic_high_prot);
void __kunmap_atomic(void *kvaddr) { diff --git a/arch/powerpc/include/asm/highmem.h b/arch/powerpc/include/asm/highmem.h index ba3371977d49..d049806a8354 100644 --- a/arch/powerpc/include/asm/highmem.h +++ b/arch/powerpc/include/asm/highmem.h @@ -59,7 +59,16 @@ extern pte_t *pkmap_page_table; #define PKMAP_NR(virt) ((virt-PKMAP_BASE) >> PAGE_SHIFT) #define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT))
-extern void *kmap_atomic_prot(struct page *page, pgprot_t prot); +extern void *kmap_atomic_high_prot(struct page *page, pgprot_t prot); +static inline void *kmap_atomic_prot(struct page *page, pgprot_t prot) +{ + preempt_disable(); + pagefault_disable(); + if (!PageHighMem(page)) + return page_address(page); + + return kmap_atomic_high_prot(page, prot); +} extern void __kunmap_atomic(void *kvaddr);
static inline void *kmap_atomic(struct page *page) diff --git a/arch/powerpc/mm/highmem.c b/arch/powerpc/mm/highmem.c index 320c1672b2ae..f075cef6d663 100644 --- a/arch/powerpc/mm/highmem.c +++ b/arch/powerpc/mm/highmem.c @@ -30,16 +30,11 @@ * be used in IRQ contexts, so in some (very limited) cases we need * it. */ -void *kmap_atomic_prot(struct page *page, pgprot_t prot) +void *kmap_atomic_high_prot(struct page *page, pgprot_t prot) { unsigned long vaddr; int idx, type;
- preempt_disable(); - pagefault_disable(); - if (!PageHighMem(page)) - return page_address(page); - type = kmap_atomic_idx_push(); idx = type + KM_TYPE_NR*smp_processor_id(); vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); @@ -49,7 +44,7 @@ void *kmap_atomic_prot(struct page *page, pgprot_t prot)
return (void*) vaddr; } -EXPORT_SYMBOL(kmap_atomic_prot); +EXPORT_SYMBOL(kmap_atomic_high_prot);
void __kunmap_atomic(void *kvaddr) { diff --git a/arch/x86/include/asm/highmem.h b/arch/x86/include/asm/highmem.h index 90b96594d6c5..61f47fef40e5 100644 --- a/arch/x86/include/asm/highmem.h +++ b/arch/x86/include/asm/highmem.h @@ -58,7 +58,16 @@ extern unsigned long highstart_pfn, highend_pfn; #define PKMAP_NR(virt) ((virt-PKMAP_BASE) >> PAGE_SHIFT) #define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT))
-void *kmap_atomic_prot(struct page *page, pgprot_t prot); +extern void *kmap_atomic_high_prot(struct page *page, pgprot_t prot); +static inline void *kmap_atomic_prot(struct page *page, pgprot_t prot) +{ + preempt_disable(); + pagefault_disable(); + if (!PageHighMem(page)) + return page_address(page); + + return kmap_atomic_high_prot(page, prot); +} void *kmap_atomic(struct page *page); void __kunmap_atomic(void *kvaddr); void *kmap_atomic_pfn(unsigned long pfn); diff --git a/arch/x86/mm/highmem_32.c b/arch/x86/mm/highmem_32.c index c4ebfd0ae401..48b56b1af902 100644 --- a/arch/x86/mm/highmem_32.c +++ b/arch/x86/mm/highmem_32.c @@ -12,17 +12,11 @@ * However when holding an atomic kmap it is not legal to sleep, so atomic * kmaps are appropriate for short, tight code paths only. */ -void *kmap_atomic_prot(struct page *page, pgprot_t prot) +void *kmap_atomic_high_prot(struct page *page, pgprot_t prot) { unsigned long vaddr; int idx, type;
- preempt_disable(); - pagefault_disable(); - - if (!PageHighMem(page)) - return page_address(page); - type = kmap_atomic_idx_push(); idx = type + KM_TYPE_NR*smp_processor_id(); vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); @@ -32,7 +26,7 @@ void *kmap_atomic_prot(struct page *page, pgprot_t prot)
return (void *)vaddr; } -EXPORT_SYMBOL(kmap_atomic_prot); +EXPORT_SYMBOL(kmap_atomic_high_prot);
void *kmap_atomic(struct page *page) {
From: Ira Weiny ira.weiny@intel.com
Every arch has the same code to ensure atomic operations and a check for !HIGHMEM page.
Remove the duplicate code by defining a core kmap_atomic() which only calls the arch specific kmap_atomic_high() when the page is high memory.
Reviewed-by: Christoph Hellwig hch@lst.de Signed-off-by: Ira Weiny ira.weiny@intel.com
--- Changes from V1: Adjust to preserve bisect-ability Remove unneeded kmap_atomic_high declarations --- arch/arc/include/asm/highmem.h | 1 - arch/arc/mm/highmem.c | 9 ++------- arch/arm/include/asm/highmem.h | 1 - arch/arm/mm/highmem.c | 9 ++------- arch/csky/include/asm/highmem.h | 1 - arch/csky/mm/highmem.c | 9 ++------- arch/microblaze/include/asm/highmem.h | 4 ++-- arch/mips/include/asm/highmem.h | 1 - arch/mips/mm/cache.c | 2 +- arch/mips/mm/highmem.c | 18 ++---------------- arch/nds32/include/asm/highmem.h | 1 - arch/nds32/mm/highmem.c | 9 ++------- arch/powerpc/include/asm/highmem.h | 4 ++-- arch/powerpc/mm/highmem.c | 6 ------ arch/sparc/include/asm/highmem.h | 1 - arch/sparc/mm/highmem.c | 9 ++------- arch/x86/include/asm/highmem.h | 5 ++++- arch/x86/mm/highmem_32.c | 14 -------------- arch/xtensa/include/asm/highmem.h | 1 - arch/xtensa/mm/highmem.c | 9 ++------- include/linux/highmem.h | 23 +++++++++++++++++++++++ 21 files changed, 46 insertions(+), 91 deletions(-)
diff --git a/arch/arc/include/asm/highmem.h b/arch/arc/include/asm/highmem.h index 8387a5596a91..db425cd38545 100644 --- a/arch/arc/include/asm/highmem.h +++ b/arch/arc/include/asm/highmem.h @@ -30,7 +30,6 @@
#include <asm/cacheflush.h>
-extern void *kmap_atomic(struct page *page); extern void __kunmap_atomic(void *kvaddr);
extern void kmap_init(void); diff --git a/arch/arc/mm/highmem.c b/arch/arc/mm/highmem.c index 4db13a6b9f3b..0964b011c29f 100644 --- a/arch/arc/mm/highmem.c +++ b/arch/arc/mm/highmem.c @@ -49,16 +49,11 @@ extern pte_t * pkmap_page_table; static pte_t * fixmap_page_table;
-void *kmap_atomic(struct page *page) +void *kmap_atomic_high(struct page *page) { int idx, cpu_idx; unsigned long vaddr;
- preempt_disable(); - pagefault_disable(); - if (!PageHighMem(page)) - return page_address(page); - cpu_idx = kmap_atomic_idx_push(); idx = cpu_idx + KM_TYPE_NR * smp_processor_id(); vaddr = FIXMAP_ADDR(idx); @@ -68,7 +63,7 @@ void *kmap_atomic(struct page *page)
return (void *)vaddr; } -EXPORT_SYMBOL(kmap_atomic); +EXPORT_SYMBOL(kmap_atomic_high);
void __kunmap_atomic(void *kv) { diff --git a/arch/arm/include/asm/highmem.h b/arch/arm/include/asm/highmem.h index 736f65283e7b..8c80bfe18a34 100644 --- a/arch/arm/include/asm/highmem.h +++ b/arch/arm/include/asm/highmem.h @@ -60,7 +60,6 @@ static inline void *kmap_high_get(struct page *page) * when CONFIG_HIGHMEM is not set. */ #ifdef CONFIG_HIGHMEM -extern void *kmap_atomic(struct page *page); extern void __kunmap_atomic(void *kvaddr); extern void *kmap_atomic_pfn(unsigned long pfn); #endif diff --git a/arch/arm/mm/highmem.c b/arch/arm/mm/highmem.c index c700b32350ee..075fdc235091 100644 --- a/arch/arm/mm/highmem.c +++ b/arch/arm/mm/highmem.c @@ -31,18 +31,13 @@ static inline pte_t get_fixmap_pte(unsigned long vaddr) return *ptep; }
-void *kmap_atomic(struct page *page) +void *kmap_atomic_high(struct page *page) { unsigned int idx; unsigned long vaddr; void *kmap; int type;
- preempt_disable(); - pagefault_disable(); - if (!PageHighMem(page)) - return page_address(page); - #ifdef CONFIG_DEBUG_HIGHMEM /* * There is no cache coherency issue when non VIVT, so force the @@ -76,7 +71,7 @@ void *kmap_atomic(struct page *page)
return (void *)vaddr; } -EXPORT_SYMBOL(kmap_atomic); +EXPORT_SYMBOL(kmap_atomic_high);
void __kunmap_atomic(void *kvaddr) { diff --git a/arch/csky/include/asm/highmem.h b/arch/csky/include/asm/highmem.h index be11c5b67122..8ceee12f9bc1 100644 --- a/arch/csky/include/asm/highmem.h +++ b/arch/csky/include/asm/highmem.h @@ -32,7 +32,6 @@ extern pte_t *pkmap_page_table;
#define ARCH_HAS_KMAP_FLUSH_TLB extern void kmap_flush_tlb(unsigned long addr); -extern void *kmap_atomic(struct page *page); extern void __kunmap_atomic(void *kvaddr); extern void *kmap_atomic_pfn(unsigned long pfn); extern struct page *kmap_atomic_to_page(void *ptr); diff --git a/arch/csky/mm/highmem.c b/arch/csky/mm/highmem.c index e9952211264b..63d74b47eee6 100644 --- a/arch/csky/mm/highmem.c +++ b/arch/csky/mm/highmem.c @@ -21,16 +21,11 @@ EXPORT_SYMBOL(kmap_flush_tlb);
EXPORT_SYMBOL(kmap);
-void *kmap_atomic(struct page *page) +void *kmap_atomic_high(struct page *page) { unsigned long vaddr; int idx, type;
- preempt_disable(); - pagefault_disable(); - if (!PageHighMem(page)) - return page_address(page); - type = kmap_atomic_idx_push(); idx = type + KM_TYPE_NR*smp_processor_id(); vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); @@ -42,7 +37,7 @@ void *kmap_atomic(struct page *page)
return (void *)vaddr; } -EXPORT_SYMBOL(kmap_atomic); +EXPORT_SYMBOL(kmap_atomic_high);
void __kunmap_atomic(void *kvaddr) { diff --git a/arch/microblaze/include/asm/highmem.h b/arch/microblaze/include/asm/highmem.h index c38d920a1171..f7c5467df5ad 100644 --- a/arch/microblaze/include/asm/highmem.h +++ b/arch/microblaze/include/asm/highmem.h @@ -63,9 +63,9 @@ static inline void *kmap_atomic_prot(struct page *page, pgprot_t prot) } extern void __kunmap_atomic(void *kvaddr);
-static inline void *kmap_atomic(struct page *page) +static inline void *kmap_atomic_high(struct page *page) { - return kmap_atomic_prot(page, kmap_prot); + return kmap_atomic_high_prot(page, kmap_prot); }
#define flush_cache_kmaps() { flush_icache(); flush_dcache(); } diff --git a/arch/mips/include/asm/highmem.h b/arch/mips/include/asm/highmem.h index 24e7e7e5cc7b..8bdbbfc322ad 100644 --- a/arch/mips/include/asm/highmem.h +++ b/arch/mips/include/asm/highmem.h @@ -48,7 +48,6 @@ extern pte_t *pkmap_page_table;
#define ARCH_HAS_KMAP_FLUSH_TLB extern void kmap_flush_tlb(unsigned long addr); -extern void *kmap_atomic(struct page *page); extern void __kunmap_atomic(void *kvaddr); extern void *kmap_atomic_pfn(unsigned long pfn);
diff --git a/arch/mips/mm/cache.c b/arch/mips/mm/cache.c index 33b409391ddb..f015bb51fab0 100644 --- a/arch/mips/mm/cache.c +++ b/arch/mips/mm/cache.c @@ -14,9 +14,9 @@ #include <linux/sched.h> #include <linux/syscalls.h> #include <linux/mm.h> +#include <linux/highmem.h>
#include <asm/cacheflush.h> -#include <asm/highmem.h> #include <asm/processor.h> #include <asm/cpu.h> #include <asm/cpu-features.h> diff --git a/arch/mips/mm/highmem.c b/arch/mips/mm/highmem.c index eb8ec8493f2f..2bda56372995 100644 --- a/arch/mips/mm/highmem.c +++ b/arch/mips/mm/highmem.c @@ -18,25 +18,11 @@ void kmap_flush_tlb(unsigned long addr) } EXPORT_SYMBOL(kmap_flush_tlb);
-/* - * kmap_atomic/kunmap_atomic is significantly faster than kmap/kunmap because - * no global lock is needed and because the kmap code must perform a global TLB - * invalidation when the kmap pool wraps. - * - * However when holding an atomic kmap is is not legal to sleep, so atomic - * kmaps are appropriate for short, tight code paths only. - */ - -void *kmap_atomic(struct page *page) +void *kmap_atomic_high(struct page *page) { unsigned long vaddr; int idx, type;
- preempt_disable(); - pagefault_disable(); - if (!PageHighMem(page)) - return page_address(page); - type = kmap_atomic_idx_push(); idx = type + KM_TYPE_NR*smp_processor_id(); vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); @@ -48,7 +34,7 @@ void *kmap_atomic(struct page *page)
return (void*) vaddr; } -EXPORT_SYMBOL(kmap_atomic); +EXPORT_SYMBOL(kmap_atomic_high);
void __kunmap_atomic(void *kvaddr) { diff --git a/arch/nds32/include/asm/highmem.h b/arch/nds32/include/asm/highmem.h index c93c7368bb3f..a3970e566ede 100644 --- a/arch/nds32/include/asm/highmem.h +++ b/arch/nds32/include/asm/highmem.h @@ -51,7 +51,6 @@ extern void kmap_init(void); * when CONFIG_HIGHMEM is not set. */ #ifdef CONFIG_HIGHMEM -extern void *kmap_atomic(struct page *page); extern void __kunmap_atomic(void *kvaddr); extern void *kmap_atomic_pfn(unsigned long pfn); extern struct page *kmap_atomic_to_page(void *ptr); diff --git a/arch/nds32/mm/highmem.c b/arch/nds32/mm/highmem.c index f9348bec0ecb..f5f3a21460c4 100644 --- a/arch/nds32/mm/highmem.c +++ b/arch/nds32/mm/highmem.c @@ -10,18 +10,13 @@ #include <asm/fixmap.h> #include <asm/tlbflush.h>
-void *kmap_atomic(struct page *page) +void *kmap_atomic_high(struct page *page) { unsigned int idx; unsigned long vaddr, pte; int type; pte_t *ptep;
- preempt_disable(); - pagefault_disable(); - if (!PageHighMem(page)) - return page_address(page); - type = kmap_atomic_idx_push();
idx = type + KM_TYPE_NR * smp_processor_id(); @@ -37,7 +32,7 @@ void *kmap_atomic(struct page *page) return (void *)vaddr; }
-EXPORT_SYMBOL(kmap_atomic); +EXPORT_SYMBOL(kmap_atomic_high);
void __kunmap_atomic(void *kvaddr) { diff --git a/arch/powerpc/include/asm/highmem.h b/arch/powerpc/include/asm/highmem.h index d049806a8354..74fa2c726fde 100644 --- a/arch/powerpc/include/asm/highmem.h +++ b/arch/powerpc/include/asm/highmem.h @@ -71,9 +71,9 @@ static inline void *kmap_atomic_prot(struct page *page, pgprot_t prot) } extern void __kunmap_atomic(void *kvaddr);
-static inline void *kmap_atomic(struct page *page) +static inline void *kmap_atomic_high(struct page *page) { - return kmap_atomic_prot(page, kmap_prot); + return kmap_atomic_high_prot(page, kmap_prot); }
diff --git a/arch/powerpc/mm/highmem.c b/arch/powerpc/mm/highmem.c index f075cef6d663..67aaa5217f7f 100644 --- a/arch/powerpc/mm/highmem.c +++ b/arch/powerpc/mm/highmem.c @@ -24,12 +24,6 @@ #include <linux/highmem.h> #include <linux/module.h>
-/* - * The use of kmap_atomic/kunmap_atomic is discouraged - kmap/kunmap - * gives a more generic (and caching) interface. But kmap_atomic can - * be used in IRQ contexts, so in some (very limited) cases we need - * it. - */ void *kmap_atomic_high_prot(struct page *page, pgprot_t prot) { unsigned long vaddr; diff --git a/arch/sparc/include/asm/highmem.h b/arch/sparc/include/asm/highmem.h index 4bdb79fed02c..458210c5bc38 100644 --- a/arch/sparc/include/asm/highmem.h +++ b/arch/sparc/include/asm/highmem.h @@ -50,7 +50,6 @@ void kmap_init(void) __init;
#define PKMAP_END (PKMAP_ADDR(LAST_PKMAP))
-void *kmap_atomic(struct page *page); void __kunmap_atomic(void *kvaddr);
#define flush_cache_kmaps() flush_cache_all() diff --git a/arch/sparc/mm/highmem.c b/arch/sparc/mm/highmem.c index d4a80adea7e5..b53070ab6a31 100644 --- a/arch/sparc/mm/highmem.c +++ b/arch/sparc/mm/highmem.c @@ -53,16 +53,11 @@ void __init kmap_init(void) kmap_prot = __pgprot(SRMMU_ET_PTE | SRMMU_PRIV | SRMMU_CACHE); }
-void *kmap_atomic(struct page *page) +void *kmap_atomic_high(struct page *page) { unsigned long vaddr; long idx, type;
- preempt_disable(); - pagefault_disable(); - if (!PageHighMem(page)) - return page_address(page); - type = kmap_atomic_idx_push(); idx = type + KM_TYPE_NR*smp_processor_id(); vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); @@ -87,7 +82,7 @@ void *kmap_atomic(struct page *page)
return (void*) vaddr; } -EXPORT_SYMBOL(kmap_atomic); +EXPORT_SYMBOL(kmap_atomic_high);
void __kunmap_atomic(void *kvaddr) { diff --git a/arch/x86/include/asm/highmem.h b/arch/x86/include/asm/highmem.h index 61f47fef40e5..9393d55a2adb 100644 --- a/arch/x86/include/asm/highmem.h +++ b/arch/x86/include/asm/highmem.h @@ -68,7 +68,10 @@ static inline void *kmap_atomic_prot(struct page *page, pgprot_t prot)
return kmap_atomic_high_prot(page, prot); } -void *kmap_atomic(struct page *page); +static inline void *kmap_atomic_high(struct page *page) +{ + return kmap_atomic_high_prot(page, kmap_prot); +} void __kunmap_atomic(void *kvaddr); void *kmap_atomic_pfn(unsigned long pfn); void *kmap_atomic_prot_pfn(unsigned long pfn, pgprot_t prot); diff --git a/arch/x86/mm/highmem_32.c b/arch/x86/mm/highmem_32.c index 48b56b1af902..c3e272a759e0 100644 --- a/arch/x86/mm/highmem_32.c +++ b/arch/x86/mm/highmem_32.c @@ -4,14 +4,6 @@ #include <linux/swap.h> /* for totalram_pages */ #include <linux/memblock.h>
-/* - * kmap_atomic/kunmap_atomic is significantly faster than kmap/kunmap because - * no global lock is needed and because the kmap code must perform a global TLB - * invalidation when the kmap pool wraps. - * - * However when holding an atomic kmap it is not legal to sleep, so atomic - * kmaps are appropriate for short, tight code paths only. - */ void *kmap_atomic_high_prot(struct page *page, pgprot_t prot) { unsigned long vaddr; @@ -28,12 +20,6 @@ void *kmap_atomic_high_prot(struct page *page, pgprot_t prot) } EXPORT_SYMBOL(kmap_atomic_high_prot);
-void *kmap_atomic(struct page *page) -{ - return kmap_atomic_prot(page, kmap_prot); -} -EXPORT_SYMBOL(kmap_atomic); - /* * This is the same as kmap_atomic() but can map memory that doesn't * have a struct page associated with it. diff --git a/arch/xtensa/include/asm/highmem.h b/arch/xtensa/include/asm/highmem.h index 5a481f7def0b..1e6aa15c4bdf 100644 --- a/arch/xtensa/include/asm/highmem.h +++ b/arch/xtensa/include/asm/highmem.h @@ -68,7 +68,6 @@ static inline void flush_cache_kmaps(void) flush_cache_all(); }
-void *kmap_atomic(struct page *page); void __kunmap_atomic(void *kvaddr);
void kmap_init(void); diff --git a/arch/xtensa/mm/highmem.c b/arch/xtensa/mm/highmem.c index da734a2ed641..90b85a897cb0 100644 --- a/arch/xtensa/mm/highmem.c +++ b/arch/xtensa/mm/highmem.c @@ -37,16 +37,11 @@ static inline enum fixed_addresses kmap_idx(int type, unsigned long color) color; }
-void *kmap_atomic(struct page *page) +void *kmap_atomic_high(struct page *page) { enum fixed_addresses idx; unsigned long vaddr;
- preempt_disable(); - pagefault_disable(); - if (!PageHighMem(page)) - return page_address(page); - idx = kmap_idx(kmap_atomic_idx_push(), DCACHE_ALIAS(page_to_phys(page))); vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); @@ -57,7 +52,7 @@ void *kmap_atomic(struct page *page)
return (void *)vaddr; } -EXPORT_SYMBOL(kmap_atomic); +EXPORT_SYMBOL(kmap_atomic_high);
void __kunmap_atomic(void *kvaddr) { diff --git a/include/linux/highmem.h b/include/linux/highmem.h index ae6e8cb81043..86b93dee758a 100644 --- a/include/linux/highmem.h +++ b/include/linux/highmem.h @@ -32,6 +32,7 @@ static inline void invalidate_kernel_vmap_range(void *vaddr, int size) #include <asm/kmap_types.h>
#ifdef CONFIG_HIGHMEM +extern void *kmap_atomic_high(struct page *page); #include <asm/highmem.h>
#ifndef ARCH_HAS_KMAP_FLUSH_TLB @@ -61,6 +62,28 @@ static inline void kunmap(struct page *page) kunmap_high(page); }
+/* + * kmap_atomic/kunmap_atomic is significantly faster than kmap/kunmap because + * no global lock is needed and because the kmap code must perform a global TLB + * invalidation when the kmap pool wraps. + * + * However when holding an atomic kmap is is not legal to sleep, so atomic + * kmaps are appropriate for short, tight code paths only. + * + * The use of kmap_atomic/kunmap_atomic is discouraged - kmap/kunmap + * gives a more generic (and caching) interface. But kmap_atomic can + * be used in IRQ contexts, so in some (very limited) cases we need + * it. + */ +static inline void *kmap_atomic(struct page *page) +{ + preempt_disable(); + pagefault_disable(); + if (!PageHighMem(page)) + return page_address(page); + return kmap_atomic_high(page); +} + /* declarations for linux/mm/highmem.c */ unsigned int nr_free_highpages(void); extern atomic_long_t _totalhigh_pages;
From: Ira Weiny ira.weiny@intel.com
Every single architecture (including !CONFIG_HIGHMEM) calls...
pagefault_enable(); preempt_enable();
... before returning from __kunmap_atomic(). Lift this code into the kunmap_atomic() macro.
While we are at it rename __kunmap_atomic() to kunmap_atomic_high() to be consistent.
Reviewed-by: Christoph Hellwig hch@lst.de Signed-off-by: Ira Weiny ira.weiny@intel.com
--- Changes from V1: Adjust to preserve bisect-ability Remove uneeded kunmap_atomic_high() declarations --- arch/arc/include/asm/highmem.h | 2 -- arch/arc/mm/highmem.c | 7 ++----- arch/arm/include/asm/highmem.h | 1 - arch/arm/mm/highmem.c | 6 ++---- arch/csky/include/asm/highmem.h | 1 - arch/csky/mm/highmem.c | 9 +++------ arch/microblaze/include/asm/highmem.h | 1 - arch/microblaze/mm/highmem.c | 6 ++---- arch/mips/include/asm/highmem.h | 1 - arch/mips/mm/cache.c | 4 ++-- arch/mips/mm/highmem.c | 6 ++---- arch/nds32/include/asm/highmem.h | 1 - arch/nds32/mm/highmem.c | 6 ++---- arch/parisc/include/asm/cacheflush.h | 4 +--- arch/powerpc/include/asm/highmem.h | 1 - arch/powerpc/mm/highmem.c | 6 ++---- arch/sparc/include/asm/highmem.h | 2 -- arch/sparc/mm/highmem.c | 6 ++---- arch/x86/include/asm/highmem.h | 1 - arch/x86/mm/highmem_32.c | 7 ++----- arch/xtensa/include/asm/highmem.h | 2 -- arch/xtensa/mm/highmem.c | 7 ++----- include/linux/highmem.h | 11 +++++++---- 23 files changed, 31 insertions(+), 67 deletions(-)
diff --git a/arch/arc/include/asm/highmem.h b/arch/arc/include/asm/highmem.h index db425cd38545..70900a73bfc8 100644 --- a/arch/arc/include/asm/highmem.h +++ b/arch/arc/include/asm/highmem.h @@ -30,8 +30,6 @@
#include <asm/cacheflush.h>
-extern void __kunmap_atomic(void *kvaddr); - extern void kmap_init(void);
static inline void flush_cache_kmaps(void) diff --git a/arch/arc/mm/highmem.c b/arch/arc/mm/highmem.c index 0964b011c29f..5d3eab4ac0b0 100644 --- a/arch/arc/mm/highmem.c +++ b/arch/arc/mm/highmem.c @@ -65,7 +65,7 @@ void *kmap_atomic_high(struct page *page) } EXPORT_SYMBOL(kmap_atomic_high);
-void __kunmap_atomic(void *kv) +void kunmap_atomic_high(void *kv) { unsigned long kvaddr = (unsigned long)kv;
@@ -87,11 +87,8 @@ void __kunmap_atomic(void *kv)
kmap_atomic_idx_pop(); } - - pagefault_enable(); - preempt_enable(); } -EXPORT_SYMBOL(__kunmap_atomic); +EXPORT_SYMBOL(kunmap_atomic_high);
static noinline pte_t * __init alloc_kmap_pgtable(unsigned long kvaddr) { diff --git a/arch/arm/include/asm/highmem.h b/arch/arm/include/asm/highmem.h index 8c80bfe18a34..b0d4bd8dc3c1 100644 --- a/arch/arm/include/asm/highmem.h +++ b/arch/arm/include/asm/highmem.h @@ -60,7 +60,6 @@ static inline void *kmap_high_get(struct page *page) * when CONFIG_HIGHMEM is not set. */ #ifdef CONFIG_HIGHMEM -extern void __kunmap_atomic(void *kvaddr); extern void *kmap_atomic_pfn(unsigned long pfn); #endif
diff --git a/arch/arm/mm/highmem.c b/arch/arm/mm/highmem.c index 075fdc235091..ac8394655a6e 100644 --- a/arch/arm/mm/highmem.c +++ b/arch/arm/mm/highmem.c @@ -73,7 +73,7 @@ void *kmap_atomic_high(struct page *page) } EXPORT_SYMBOL(kmap_atomic_high);
-void __kunmap_atomic(void *kvaddr) +void kunmap_atomic_high(void *kvaddr) { unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK; int idx, type; @@ -95,10 +95,8 @@ void __kunmap_atomic(void *kvaddr) /* this address was obtained through kmap_high_get() */ kunmap_high(pte_page(pkmap_page_table[PKMAP_NR(vaddr)])); } - pagefault_enable(); - preempt_enable(); } -EXPORT_SYMBOL(__kunmap_atomic); +EXPORT_SYMBOL(kunmap_atomic_high);
void *kmap_atomic_pfn(unsigned long pfn) { diff --git a/arch/csky/include/asm/highmem.h b/arch/csky/include/asm/highmem.h index 8ceee12f9bc1..263fbddcd0a3 100644 --- a/arch/csky/include/asm/highmem.h +++ b/arch/csky/include/asm/highmem.h @@ -32,7 +32,6 @@ extern pte_t *pkmap_page_table;
#define ARCH_HAS_KMAP_FLUSH_TLB extern void kmap_flush_tlb(unsigned long addr); -extern void __kunmap_atomic(void *kvaddr); extern void *kmap_atomic_pfn(unsigned long pfn); extern struct page *kmap_atomic_to_page(void *ptr);
diff --git a/arch/csky/mm/highmem.c b/arch/csky/mm/highmem.c index 63d74b47eee6..0aafbbbe651c 100644 --- a/arch/csky/mm/highmem.c +++ b/arch/csky/mm/highmem.c @@ -39,13 +39,13 @@ void *kmap_atomic_high(struct page *page) } EXPORT_SYMBOL(kmap_atomic_high);
-void __kunmap_atomic(void *kvaddr) +void kunmap_atomic_high(void *kvaddr) { unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK; int idx;
if (vaddr < FIXADDR_START) - goto out; + return;
#ifdef CONFIG_DEBUG_HIGHMEM idx = KM_TYPE_NR*smp_processor_id() + kmap_atomic_idx(); @@ -58,11 +58,8 @@ void __kunmap_atomic(void *kvaddr) (void) idx; /* to kill a warning */ #endif kmap_atomic_idx_pop(); -out: - pagefault_enable(); - preempt_enable(); } -EXPORT_SYMBOL(__kunmap_atomic); +EXPORT_SYMBOL(kunmap_atomic_high);
/* * This is the same as kmap_atomic() but can map memory that doesn't diff --git a/arch/microblaze/include/asm/highmem.h b/arch/microblaze/include/asm/highmem.h index f7c5467df5ad..c3cbda90391d 100644 --- a/arch/microblaze/include/asm/highmem.h +++ b/arch/microblaze/include/asm/highmem.h @@ -61,7 +61,6 @@ static inline void *kmap_atomic_prot(struct page *page, pgprot_t prot)
return kmap_atomic_high_prot(page, prot); } -extern void __kunmap_atomic(void *kvaddr);
static inline void *kmap_atomic_high(struct page *page) { diff --git a/arch/microblaze/mm/highmem.c b/arch/microblaze/mm/highmem.c index 0e3efaa8a004..ee8a422b2b76 100644 --- a/arch/microblaze/mm/highmem.c +++ b/arch/microblaze/mm/highmem.c @@ -51,7 +51,7 @@ void *kmap_atomic_high_prot(struct page *page, pgprot_t prot) } EXPORT_SYMBOL(kmap_atomic_high_prot);
-void __kunmap_atomic(void *kvaddr) +void kunmap_atomic_high(void *kvaddr) { unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK; int type; @@ -77,7 +77,5 @@ void __kunmap_atomic(void *kvaddr) local_flush_tlb_page(NULL, vaddr);
kmap_atomic_idx_pop(); - pagefault_enable(); - preempt_enable(); } -EXPORT_SYMBOL(__kunmap_atomic); +EXPORT_SYMBOL(kunmap_atomic_high); diff --git a/arch/mips/include/asm/highmem.h b/arch/mips/include/asm/highmem.h index 8bdbbfc322ad..76dec0bd4f59 100644 --- a/arch/mips/include/asm/highmem.h +++ b/arch/mips/include/asm/highmem.h @@ -48,7 +48,6 @@ extern pte_t *pkmap_page_table;
#define ARCH_HAS_KMAP_FLUSH_TLB extern void kmap_flush_tlb(unsigned long addr); -extern void __kunmap_atomic(void *kvaddr); extern void *kmap_atomic_pfn(unsigned long pfn);
#define flush_cache_kmaps() BUG_ON(cpu_has_dc_aliases) diff --git a/arch/mips/mm/cache.c b/arch/mips/mm/cache.c index f015bb51fab0..1873c2a01fdb 100644 --- a/arch/mips/mm/cache.c +++ b/arch/mips/mm/cache.c @@ -104,7 +104,7 @@ void __flush_dcache_page(struct page *page) flush_data_cache_page(addr);
if (PageHighMem(page)) - __kunmap_atomic((void *)addr); + kunmap_atomic((void *)addr); }
EXPORT_SYMBOL(__flush_dcache_page); @@ -147,7 +147,7 @@ void __update_cache(unsigned long address, pte_t pte) flush_data_cache_page(addr);
if (PageHighMem(page)) - __kunmap_atomic((void *)addr); + kunmap_atomic((void *)addr);
ClearPageDcacheDirty(page); } diff --git a/arch/mips/mm/highmem.c b/arch/mips/mm/highmem.c index 2bda56372995..155fbb107b35 100644 --- a/arch/mips/mm/highmem.c +++ b/arch/mips/mm/highmem.c @@ -36,7 +36,7 @@ void *kmap_atomic_high(struct page *page) } EXPORT_SYMBOL(kmap_atomic_high);
-void __kunmap_atomic(void *kvaddr) +void kunmap_atomic_high(void *kvaddr) { unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK; int type __maybe_unused; @@ -63,10 +63,8 @@ void __kunmap_atomic(void *kvaddr) } #endif kmap_atomic_idx_pop(); - pagefault_enable(); - preempt_enable(); } -EXPORT_SYMBOL(__kunmap_atomic); +EXPORT_SYMBOL(kunmap_atomic_high);
/* * This is the same as kmap_atomic() but can map memory that doesn't diff --git a/arch/nds32/include/asm/highmem.h b/arch/nds32/include/asm/highmem.h index a3970e566ede..4d21308549c9 100644 --- a/arch/nds32/include/asm/highmem.h +++ b/arch/nds32/include/asm/highmem.h @@ -51,7 +51,6 @@ extern void kmap_init(void); * when CONFIG_HIGHMEM is not set. */ #ifdef CONFIG_HIGHMEM -extern void __kunmap_atomic(void *kvaddr); extern void *kmap_atomic_pfn(unsigned long pfn); extern struct page *kmap_atomic_to_page(void *ptr); #endif diff --git a/arch/nds32/mm/highmem.c b/arch/nds32/mm/highmem.c index f5f3a21460c4..f6e6915c0d31 100644 --- a/arch/nds32/mm/highmem.c +++ b/arch/nds32/mm/highmem.c @@ -34,7 +34,7 @@ void *kmap_atomic_high(struct page *page)
EXPORT_SYMBOL(kmap_atomic_high);
-void __kunmap_atomic(void *kvaddr) +void kunmap_atomic_high(void *kvaddr) { if (kvaddr >= (void *)FIXADDR_START) { unsigned long vaddr = (unsigned long)kvaddr; @@ -45,8 +45,6 @@ void __kunmap_atomic(void *kvaddr) ptep = pte_offset_kernel(pmd_off_k(vaddr), vaddr); set_pte(ptep, 0); } - pagefault_enable(); - preempt_enable(); }
-EXPORT_SYMBOL(__kunmap_atomic); +EXPORT_SYMBOL(kunmap_atomic_high); diff --git a/arch/parisc/include/asm/cacheflush.h b/arch/parisc/include/asm/cacheflush.h index 0c83644bfa5c..119c9a7681bc 100644 --- a/arch/parisc/include/asm/cacheflush.h +++ b/arch/parisc/include/asm/cacheflush.h @@ -122,11 +122,9 @@ static inline void *kmap_atomic(struct page *page) return page_address(page); }
-static inline void __kunmap_atomic(void *addr) +static inline void kunmap_atomic_high(void *addr) { flush_kernel_dcache_page_addr(addr); - pagefault_enable(); - preempt_enable(); }
#define kmap_atomic_prot(page, prot) kmap_atomic(page) diff --git a/arch/powerpc/include/asm/highmem.h b/arch/powerpc/include/asm/highmem.h index 74fa2c726fde..373a470df205 100644 --- a/arch/powerpc/include/asm/highmem.h +++ b/arch/powerpc/include/asm/highmem.h @@ -69,7 +69,6 @@ static inline void *kmap_atomic_prot(struct page *page, pgprot_t prot)
return kmap_atomic_high_prot(page, prot); } -extern void __kunmap_atomic(void *kvaddr);
static inline void *kmap_atomic_high(struct page *page) { diff --git a/arch/powerpc/mm/highmem.c b/arch/powerpc/mm/highmem.c index 67aaa5217f7f..35071c2913f1 100644 --- a/arch/powerpc/mm/highmem.c +++ b/arch/powerpc/mm/highmem.c @@ -40,7 +40,7 @@ void *kmap_atomic_high_prot(struct page *page, pgprot_t prot) } EXPORT_SYMBOL(kmap_atomic_high_prot);
-void __kunmap_atomic(void *kvaddr) +void kunmap_atomic_high(void *kvaddr) { unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK;
@@ -66,7 +66,5 @@ void __kunmap_atomic(void *kvaddr) }
kmap_atomic_idx_pop(); - pagefault_enable(); - preempt_enable(); } -EXPORT_SYMBOL(__kunmap_atomic); +EXPORT_SYMBOL(kunmap_atomic_high); diff --git a/arch/sparc/include/asm/highmem.h b/arch/sparc/include/asm/highmem.h index 458210c5bc38..f4babe67cb5d 100644 --- a/arch/sparc/include/asm/highmem.h +++ b/arch/sparc/include/asm/highmem.h @@ -50,8 +50,6 @@ void kmap_init(void) __init;
#define PKMAP_END (PKMAP_ADDR(LAST_PKMAP))
-void __kunmap_atomic(void *kvaddr); - #define flush_cache_kmaps() flush_cache_all()
#endif /* __KERNEL__ */ diff --git a/arch/sparc/mm/highmem.c b/arch/sparc/mm/highmem.c index b53070ab6a31..469786bc430f 100644 --- a/arch/sparc/mm/highmem.c +++ b/arch/sparc/mm/highmem.c @@ -84,7 +84,7 @@ void *kmap_atomic_high(struct page *page) } EXPORT_SYMBOL(kmap_atomic_high);
-void __kunmap_atomic(void *kvaddr) +void kunmap_atomic_high(void *kvaddr) { unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK; int type; @@ -126,7 +126,5 @@ void __kunmap_atomic(void *kvaddr) #endif
kmap_atomic_idx_pop(); - pagefault_enable(); - preempt_enable(); } -EXPORT_SYMBOL(__kunmap_atomic); +EXPORT_SYMBOL(kunmap_atomic_high); diff --git a/arch/x86/include/asm/highmem.h b/arch/x86/include/asm/highmem.h index 9393d55a2adb..be66b77885a0 100644 --- a/arch/x86/include/asm/highmem.h +++ b/arch/x86/include/asm/highmem.h @@ -72,7 +72,6 @@ static inline void *kmap_atomic_high(struct page *page) { return kmap_atomic_high_prot(page, kmap_prot); } -void __kunmap_atomic(void *kvaddr); void *kmap_atomic_pfn(unsigned long pfn); void *kmap_atomic_prot_pfn(unsigned long pfn, pgprot_t prot);
diff --git a/arch/x86/mm/highmem_32.c b/arch/x86/mm/highmem_32.c index c3e272a759e0..075fe51317b0 100644 --- a/arch/x86/mm/highmem_32.c +++ b/arch/x86/mm/highmem_32.c @@ -30,7 +30,7 @@ void *kmap_atomic_pfn(unsigned long pfn) } EXPORT_SYMBOL_GPL(kmap_atomic_pfn);
-void __kunmap_atomic(void *kvaddr) +void kunmap_atomic_high(void *kvaddr) { unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK;
@@ -60,11 +60,8 @@ void __kunmap_atomic(void *kvaddr) BUG_ON(vaddr >= (unsigned long)high_memory); } #endif - - pagefault_enable(); - preempt_enable(); } -EXPORT_SYMBOL(__kunmap_atomic); +EXPORT_SYMBOL(kunmap_atomic_high);
void __init set_highmem_pages_init(void) { diff --git a/arch/xtensa/include/asm/highmem.h b/arch/xtensa/include/asm/highmem.h index 1e6aa15c4bdf..d6a10704307a 100644 --- a/arch/xtensa/include/asm/highmem.h +++ b/arch/xtensa/include/asm/highmem.h @@ -68,8 +68,6 @@ static inline void flush_cache_kmaps(void) flush_cache_all(); }
-void __kunmap_atomic(void *kvaddr); - void kmap_init(void);
#endif diff --git a/arch/xtensa/mm/highmem.c b/arch/xtensa/mm/highmem.c index 90b85a897cb0..4de323e43682 100644 --- a/arch/xtensa/mm/highmem.c +++ b/arch/xtensa/mm/highmem.c @@ -54,7 +54,7 @@ void *kmap_atomic_high(struct page *page) } EXPORT_SYMBOL(kmap_atomic_high);
-void __kunmap_atomic(void *kvaddr) +void kunmap_atomic_high(void *kvaddr) { if (kvaddr >= (void *)FIXADDR_START && kvaddr < (void *)FIXADDR_TOP) { @@ -73,11 +73,8 @@ void __kunmap_atomic(void *kvaddr)
kmap_atomic_idx_pop(); } - - pagefault_enable(); - preempt_enable(); } -EXPORT_SYMBOL(__kunmap_atomic); +EXPORT_SYMBOL(kunmap_atomic_high);
void __init kmap_init(void) { diff --git a/include/linux/highmem.h b/include/linux/highmem.h index 86b93dee758a..c36c0ee09423 100644 --- a/include/linux/highmem.h +++ b/include/linux/highmem.h @@ -33,6 +33,7 @@ static inline void invalidate_kernel_vmap_range(void *vaddr, int size)
#ifdef CONFIG_HIGHMEM extern void *kmap_atomic_high(struct page *page); +extern void kunmap_atomic_high(void *kvaddr); #include <asm/highmem.h>
#ifndef ARCH_HAS_KMAP_FLUSH_TLB @@ -146,10 +147,10 @@ static inline void *kmap_atomic(struct page *page) } #define kmap_atomic_prot(page, prot) kmap_atomic(page)
-static inline void __kunmap_atomic(void *addr) +static inline void kunmap_atomic_high(void *addr) { - pagefault_enable(); - preempt_enable(); + /* Nothing to do in the CONFIG_HIGHMEM=n case as kunmap_atomic() + * handles re-enabling faults + preemption */ }
#define kmap_atomic_pfn(pfn) kmap_atomic(pfn_to_page(pfn)) @@ -199,7 +200,9 @@ static inline void kmap_atomic_idx_pop(void) #define kunmap_atomic(addr) \ do { \ BUILD_BUG_ON(__same_type((addr), struct page *)); \ - __kunmap_atomic(addr); \ + kunmap_atomic_high(addr); \ + pagefault_enable(); \ + preempt_enable(); \ } while (0)
From: Ira Weiny ira.weiny@intel.com
The kunmap_atomic clean up failed to remove one set of pagefault/preempt enables when vaddr is not in the fixmap.
Fixes: bee2128a09e6 ("arch/kunmap_atomic: consolidate duplicate code") Signed-off-by: Ira Weiny ira.weiny@intel.com --- arch/microblaze/mm/highmem.c | 5 +---- arch/mips/mm/highmem.c | 5 +---- arch/powerpc/mm/highmem.c | 5 +---- arch/sparc/mm/highmem.c | 5 +---- 4 files changed, 4 insertions(+), 16 deletions(-)
diff --git a/arch/microblaze/mm/highmem.c b/arch/microblaze/mm/highmem.c index ee8a422b2b76..92e0890416c9 100644 --- a/arch/microblaze/mm/highmem.c +++ b/arch/microblaze/mm/highmem.c @@ -57,11 +57,8 @@ void kunmap_atomic_high(void *kvaddr) int type; unsigned int idx;
- if (vaddr < __fix_to_virt(FIX_KMAP_END)) { - pagefault_enable(); - preempt_enable(); + if (vaddr < __fix_to_virt(FIX_KMAP_END)) return; - }
type = kmap_atomic_idx();
diff --git a/arch/mips/mm/highmem.c b/arch/mips/mm/highmem.c index 37e244cdb14e..8e8726992720 100644 --- a/arch/mips/mm/highmem.c +++ b/arch/mips/mm/highmem.c @@ -41,11 +41,8 @@ void kunmap_atomic_high(void *kvaddr) unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK; int type __maybe_unused;
- if (vaddr < FIXADDR_START) { // FIXME - pagefault_enable(); - preempt_enable(); + if (vaddr < FIXADDR_START) return; - }
type = kmap_atomic_idx(); #ifdef CONFIG_DEBUG_HIGHMEM diff --git a/arch/powerpc/mm/highmem.c b/arch/powerpc/mm/highmem.c index 35071c2913f1..624b4438aff9 100644 --- a/arch/powerpc/mm/highmem.c +++ b/arch/powerpc/mm/highmem.c @@ -44,11 +44,8 @@ void kunmap_atomic_high(void *kvaddr) { unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK;
- if (vaddr < __fix_to_virt(FIX_KMAP_END)) { - pagefault_enable(); - preempt_enable(); + if (vaddr < __fix_to_virt(FIX_KMAP_END)) return; - }
if (IS_ENABLED(CONFIG_DEBUG_HIGHMEM)) { int type = kmap_atomic_idx(); diff --git a/arch/sparc/mm/highmem.c b/arch/sparc/mm/highmem.c index d237d902f9c3..6ff6e2a9f9b3 100644 --- a/arch/sparc/mm/highmem.c +++ b/arch/sparc/mm/highmem.c @@ -86,11 +86,8 @@ void kunmap_atomic_high(void *kvaddr) unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK; int type;
- if (vaddr < FIXADDR_START) { // FIXME - pagefault_enable(); - preempt_enable(); + if (vaddr < FIXADDR_START) return; - }
type = kmap_atomic_idx();
On Mon, May 18, 2020 at 11:48:43AM -0700, ira.weiny@intel.com wrote:
From: Ira Weiny ira.weiny@intel.com
The kunmap_atomic clean up failed to remove one set of pagefault/preempt enables when vaddr is not in the fixmap.
Fixes: bee2128a09e6 ("arch/kunmap_atomic: consolidate duplicate code") Signed-off-by: Ira Weiny ira.weiny@intel.com
microblazeel works with this patch, as do the nosmp sparc32 boot tests, but sparc32 boot tests with SMP enabled still fail with lots of messages such as:
BUG: Bad page state in process swapper/0 pfn:006a1 page:f0933420 refcount:0 mapcount:1 mapping:(ptrval) index:0x1 flags: 0x0() raw: 00000000 00000100 00000122 00000000 00000001 00000000 00000000 00000000 page dumped because: nonzero mapcount Modules linked in: CPU: 0 PID: 1 Comm: swapper/0 Tainted: G B 5.7.0-rc6-next-20200518-00002-gb178d2d56f29 #1 [f00e7ab8 : bad_page+0xa8/0x108 ] [f00e8b54 : free_pcppages_bulk+0x154/0x52c ] [f00ea024 : free_unref_page+0x54/0x6c ] [f00ed864 : free_reserved_area+0x58/0xec ] [f0527104 : kernel_init+0x14/0x110 ] [f000b77c : ret_from_kernel_thread+0xc/0x38 ] [00000000 : 0x0 ]
Code path leading to that message is different but always the same from free_unref_page().
Still testing ppc images.
Guenter
On Tue, May 19, 2020 at 09:54:22AM -0700, Guenter Roeck wrote:
On Mon, May 18, 2020 at 11:48:43AM -0700, ira.weiny@intel.com wrote:
From: Ira Weiny ira.weiny@intel.com
The kunmap_atomic clean up failed to remove one set of pagefault/preempt enables when vaddr is not in the fixmap.
Fixes: bee2128a09e6 ("arch/kunmap_atomic: consolidate duplicate code") Signed-off-by: Ira Weiny ira.weiny@intel.com
microblazeel works with this patch,
Awesome... Andrew in my rush yesterday I should have put a reported by on the patch for Guenter as well.
Sorry about that Guenter, Ira
as do the nosmp sparc32 boot tests, but sparc32 boot tests with SMP enabled still fail with lots of messages such as:
BUG: Bad page state in process swapper/0 pfn:006a1 page:f0933420 refcount:0 mapcount:1 mapping:(ptrval) index:0x1 flags: 0x0() raw: 00000000 00000100 00000122 00000000 00000001 00000000 00000000 00000000 page dumped because: nonzero mapcount Modules linked in: CPU: 0 PID: 1 Comm: swapper/0 Tainted: G B 5.7.0-rc6-next-20200518-00002-gb178d2d56f29 #1 [f00e7ab8 : bad_page+0xa8/0x108 ] [f00e8b54 : free_pcppages_bulk+0x154/0x52c ] [f00ea024 : free_unref_page+0x54/0x6c ] [f00ed864 : free_reserved_area+0x58/0xec ] [f0527104 : kernel_init+0x14/0x110 ] [f000b77c : ret_from_kernel_thread+0xc/0x38 ] [00000000 : 0x0 ]
Code path leading to that message is different but always the same from free_unref_page().
Still testing ppc images.
Guenter
On Tue, May 19, 2020 at 11:40:32AM -0700, Ira Weiny wrote:
On Tue, May 19, 2020 at 09:54:22AM -0700, Guenter Roeck wrote:
On Mon, May 18, 2020 at 11:48:43AM -0700, ira.weiny@intel.com wrote:
From: Ira Weiny ira.weiny@intel.com
The kunmap_atomic clean up failed to remove one set of pagefault/preempt enables when vaddr is not in the fixmap.
Fixes: bee2128a09e6 ("arch/kunmap_atomic: consolidate duplicate code") Signed-off-by: Ira Weiny ira.weiny@intel.com
microblazeel works with this patch,
Awesome... Andrew in my rush yesterday I should have put a reported by on the patch for Guenter as well.
Sorry about that Guenter,
No worries.
Ira
as do the nosmp sparc32 boot tests, but sparc32 boot tests with SMP enabled still fail with lots of messages such as:
BUG: Bad page state in process swapper/0 pfn:006a1 page:f0933420 refcount:0 mapcount:1 mapping:(ptrval) index:0x1 flags: 0x0() raw: 00000000 00000100 00000122 00000000 00000001 00000000 00000000 00000000 page dumped because: nonzero mapcount Modules linked in: CPU: 0 PID: 1 Comm: swapper/0 Tainted: G B 5.7.0-rc6-next-20200518-00002-gb178d2d56f29 #1 [f00e7ab8 : bad_page+0xa8/0x108 ] [f00e8b54 : free_pcppages_bulk+0x154/0x52c ] [f00ea024 : free_unref_page+0x54/0x6c ] [f00ed864 : free_reserved_area+0x58/0xec ] [f0527104 : kernel_init+0x14/0x110 ] [f000b77c : ret_from_kernel_thread+0xc/0x38 ] [00000000 : 0x0 ]
Code path leading to that message is different but always the same from free_unref_page().
Still testing ppc images.
ppc image tests are passing with this patch.
Guenter
On Tue, May 19, 2020 at 12:42:15PM -0700, Guenter Roeck wrote:
On Tue, May 19, 2020 at 11:40:32AM -0700, Ira Weiny wrote:
On Tue, May 19, 2020 at 09:54:22AM -0700, Guenter Roeck wrote:
On Mon, May 18, 2020 at 11:48:43AM -0700, ira.weiny@intel.com wrote:
From: Ira Weiny ira.weiny@intel.com
The kunmap_atomic clean up failed to remove one set of pagefault/preempt enables when vaddr is not in the fixmap.
Fixes: bee2128a09e6 ("arch/kunmap_atomic: consolidate duplicate code") Signed-off-by: Ira Weiny ira.weiny@intel.com
microblazeel works with this patch,
Awesome... Andrew in my rush yesterday I should have put a reported by on the patch for Guenter as well.
Sorry about that Guenter,
No worries.
Ira
as do the nosmp sparc32 boot tests, but sparc32 boot tests with SMP enabled still fail with lots of messages such as:
BUG: Bad page state in process swapper/0 pfn:006a1 page:f0933420 refcount:0 mapcount:1 mapping:(ptrval) index:0x1 flags: 0x0() raw: 00000000 00000100 00000122 00000000 00000001 00000000 00000000 00000000 page dumped because: nonzero mapcount Modules linked in: CPU: 0 PID: 1 Comm: swapper/0 Tainted: G B 5.7.0-rc6-next-20200518-00002-gb178d2d56f29 #1 [f00e7ab8 : bad_page+0xa8/0x108 ] [f00e8b54 : free_pcppages_bulk+0x154/0x52c ] [f00ea024 : free_unref_page+0x54/0x6c ] [f00ed864 : free_reserved_area+0x58/0xec ] [f0527104 : kernel_init+0x14/0x110 ] [f000b77c : ret_from_kernel_thread+0xc/0x38 ] [00000000 : 0x0 ]
I'm really not seeing how this is related to the kmap clean up.
But just to make sure I'm trying to run your environment for sparc and having less luck than with microblaze.
Could you give me the command which is failing above?
Ira
Code path leading to that message is different but always the same from free_unref_page().
Still testing ppc images.
ppc image tests are passing with this patch.
Guenter
On Tue, May 19, 2020 at 12:42:15PM -0700, Guenter Roeck wrote:
On Tue, May 19, 2020 at 11:40:32AM -0700, Ira Weiny wrote:
On Tue, May 19, 2020 at 09:54:22AM -0700, Guenter Roeck wrote:
On Mon, May 18, 2020 at 11:48:43AM -0700, ira.weiny@intel.com wrote:
From: Ira Weiny ira.weiny@intel.com
The kunmap_atomic clean up failed to remove one set of pagefault/preempt enables when vaddr is not in the fixmap.
Fixes: bee2128a09e6 ("arch/kunmap_atomic: consolidate duplicate code") Signed-off-by: Ira Weiny ira.weiny@intel.com
microblazeel works with this patch,
Awesome... Andrew in my rush yesterday I should have put a reported by on the patch for Guenter as well.
Sorry about that Guenter,
No worries.
Ira
as do the nosmp sparc32 boot tests, but sparc32 boot tests with SMP enabled still fail with lots of messages such as:
BUG: Bad page state in process swapper/0 pfn:006a1 page:f0933420 refcount:0 mapcount:1 mapping:(ptrval) index:0x1 flags: 0x0() raw: 00000000 00000100 00000122 00000000 00000001 00000000 00000000 00000000 page dumped because: nonzero mapcount Modules linked in: CPU: 0 PID: 1 Comm: swapper/0 Tainted: G B 5.7.0-rc6-next-20200518-00002-gb178d2d56f29 #1 [f00e7ab8 : bad_page+0xa8/0x108 ] [f00e8b54 : free_pcppages_bulk+0x154/0x52c ] [f00ea024 : free_unref_page+0x54/0x6c ] [f00ed864 : free_reserved_area+0x58/0xec ] [f0527104 : kernel_init+0x14/0x110 ] [f000b77c : ret_from_kernel_thread+0xc/0x38 ] [00000000 : 0x0 ]
Code path leading to that message is different but always the same from free_unref_page().
Actually it occurs to me that the patch consolidating kmap_prot is odd for sparc 32 bit...
Its a long shot but could you try reverting this patch?
4ea7d2419e3f kmap: consolidate kmap_prot definitions
Alternately I will need to figure out how to run the sparc on qemu here...
Thanks very much for all the testing though! :-D
Ira
Still testing ppc images.
ppc image tests are passing with this patch.
Guenter
On 5/19/20 10:13 PM, Ira Weiny wrote:
On Tue, May 19, 2020 at 12:42:15PM -0700, Guenter Roeck wrote:
On Tue, May 19, 2020 at 11:40:32AM -0700, Ira Weiny wrote:
On Tue, May 19, 2020 at 09:54:22AM -0700, Guenter Roeck wrote:
On Mon, May 18, 2020 at 11:48:43AM -0700, ira.weiny@intel.com wrote:
From: Ira Weiny ira.weiny@intel.com
The kunmap_atomic clean up failed to remove one set of pagefault/preempt enables when vaddr is not in the fixmap.
Fixes: bee2128a09e6 ("arch/kunmap_atomic: consolidate duplicate code") Signed-off-by: Ira Weiny ira.weiny@intel.com
microblazeel works with this patch,
Awesome... Andrew in my rush yesterday I should have put a reported by on the patch for Guenter as well.
Sorry about that Guenter,
No worries.
Ira
as do the nosmp sparc32 boot tests, but sparc32 boot tests with SMP enabled still fail with lots of messages such as:
BUG: Bad page state in process swapper/0 pfn:006a1 page:f0933420 refcount:0 mapcount:1 mapping:(ptrval) index:0x1 flags: 0x0() raw: 00000000 00000100 00000122 00000000 00000001 00000000 00000000 00000000 page dumped because: nonzero mapcount Modules linked in: CPU: 0 PID: 1 Comm: swapper/0 Tainted: G B 5.7.0-rc6-next-20200518-00002-gb178d2d56f29 #1 [f00e7ab8 : bad_page+0xa8/0x108 ] [f00e8b54 : free_pcppages_bulk+0x154/0x52c ] [f00ea024 : free_unref_page+0x54/0x6c ] [f00ed864 : free_reserved_area+0x58/0xec ] [f0527104 : kernel_init+0x14/0x110 ] [f000b77c : ret_from_kernel_thread+0xc/0x38 ] [00000000 : 0x0 ]
Code path leading to that message is different but always the same from free_unref_page().
Actually it occurs to me that the patch consolidating kmap_prot is odd for sparc 32 bit...
Its a long shot but could you try reverting this patch?
4ea7d2419e3f kmap: consolidate kmap_prot definitions
That is not easy to revert, unfortunately, due to several follow-up patches.
Guenter
Alternately I will need to figure out how to run the sparc on qemu here...
Thanks very much for all the testing though! :-D
Ira
Still testing ppc images.
ppc image tests are passing with this patch.
Guenter
On Thu, May 21, 2020 at 09:05:41AM -0700, Guenter Roeck wrote:
On 5/19/20 10:13 PM, Ira Weiny wrote:
On Tue, May 19, 2020 at 12:42:15PM -0700, Guenter Roeck wrote:
On Tue, May 19, 2020 at 11:40:32AM -0700, Ira Weiny wrote:
On Tue, May 19, 2020 at 09:54:22AM -0700, Guenter Roeck wrote:
On Mon, May 18, 2020 at 11:48:43AM -0700, ira.weiny@intel.com wrote:
From: Ira Weiny ira.weiny@intel.com
The kunmap_atomic clean up failed to remove one set of pagefault/preempt enables when vaddr is not in the fixmap.
Fixes: bee2128a09e6 ("arch/kunmap_atomic: consolidate duplicate code") Signed-off-by: Ira Weiny ira.weiny@intel.com
microblazeel works with this patch,
Awesome... Andrew in my rush yesterday I should have put a reported by on the patch for Guenter as well.
Sorry about that Guenter,
No worries.
Ira
as do the nosmp sparc32 boot tests, but sparc32 boot tests with SMP enabled still fail with lots of messages such as:
BUG: Bad page state in process swapper/0 pfn:006a1 page:f0933420 refcount:0 mapcount:1 mapping:(ptrval) index:0x1 flags: 0x0() raw: 00000000 00000100 00000122 00000000 00000001 00000000 00000000 00000000 page dumped because: nonzero mapcount Modules linked in: CPU: 0 PID: 1 Comm: swapper/0 Tainted: G B 5.7.0-rc6-next-20200518-00002-gb178d2d56f29 #1 [f00e7ab8 : bad_page+0xa8/0x108 ] [f00e8b54 : free_pcppages_bulk+0x154/0x52c ] [f00ea024 : free_unref_page+0x54/0x6c ] [f00ed864 : free_reserved_area+0x58/0xec ] [f0527104 : kernel_init+0x14/0x110 ] [f000b77c : ret_from_kernel_thread+0xc/0x38 ] [00000000 : 0x0 ]
Code path leading to that message is different but always the same from free_unref_page().
Actually it occurs to me that the patch consolidating kmap_prot is odd for sparc 32 bit...
Its a long shot but could you try reverting this patch?
4ea7d2419e3f kmap: consolidate kmap_prot definitions
That is not easy to revert, unfortunately, due to several follow-up patches.
I have gotten your sparc tests to run and they all pass...
08:10:34 > ../linux-build-test/rootfs/sparc/run-qemu-sparc.sh Build reference: v5.7-rc4-17-g852b6f2edc0f
Building sparc32:SPARCClassic:nosmp:scsi:hd ... running ......... passed Building sparc32:SPARCbook:nosmp:scsi:cd ... running ......... passed Building sparc32:LX:nosmp:noapc:scsi:hd ... running ......... passed Building sparc32:SS-4:nosmp:initrd ... running ......... passed Building sparc32:SS-5:nosmp:scsi:hd ... running ......... passed Building sparc32:SS-10:nosmp:scsi:cd ... running ......... passed Building sparc32:SS-20:nosmp:scsi:hd ... running ......... passed Building sparc32:SS-600MP:nosmp:scsi:hd ... running ......... passed Building sparc32:Voyager:nosmp:noapc:scsi:hd ... running ......... passed Building sparc32:SS-4:smp:scsi:hd ... running ......... passed Building sparc32:SS-5:smp:scsi:cd ... running ......... passed Building sparc32:SS-10:smp:scsi:hd ... running ......... passed Building sparc32:SS-20:smp:scsi:hd ... running ......... passed Building sparc32:SS-600MP:smp:scsi:hd ... running ......... passed Building sparc32:Voyager:smp:noapc:scsi:hd ... running ......... passed
Is there another test I need to run?
Ira
Guenter
Alternately I will need to figure out how to run the sparc on qemu here...
Thanks very much for all the testing though! :-D
Ira
Still testing ppc images.
ppc image tests are passing with this patch.
Guenter
On 5/21/20 10:42 AM, Ira Weiny wrote:
On Thu, May 21, 2020 at 09:05:41AM -0700, Guenter Roeck wrote:
On 5/19/20 10:13 PM, Ira Weiny wrote:
On Tue, May 19, 2020 at 12:42:15PM -0700, Guenter Roeck wrote:
On Tue, May 19, 2020 at 11:40:32AM -0700, Ira Weiny wrote:
On Tue, May 19, 2020 at 09:54:22AM -0700, Guenter Roeck wrote:
On Mon, May 18, 2020 at 11:48:43AM -0700, ira.weiny@intel.com wrote: > From: Ira Weiny ira.weiny@intel.com > > The kunmap_atomic clean up failed to remove one set of pagefault/preempt > enables when vaddr is not in the fixmap. > > Fixes: bee2128a09e6 ("arch/kunmap_atomic: consolidate duplicate code") > Signed-off-by: Ira Weiny ira.weiny@intel.com
microblazeel works with this patch,
Awesome... Andrew in my rush yesterday I should have put a reported by on the patch for Guenter as well.
Sorry about that Guenter,
No worries.
Ira
as do the nosmp sparc32 boot tests, but sparc32 boot tests with SMP enabled still fail with lots of messages such as:
BUG: Bad page state in process swapper/0 pfn:006a1 page:f0933420 refcount:0 mapcount:1 mapping:(ptrval) index:0x1 flags: 0x0() raw: 00000000 00000100 00000122 00000000 00000001 00000000 00000000 00000000 page dumped because: nonzero mapcount Modules linked in: CPU: 0 PID: 1 Comm: swapper/0 Tainted: G B 5.7.0-rc6-next-20200518-00002-gb178d2d56f29 #1 [f00e7ab8 : bad_page+0xa8/0x108 ] [f00e8b54 : free_pcppages_bulk+0x154/0x52c ] [f00ea024 : free_unref_page+0x54/0x6c ] [f00ed864 : free_reserved_area+0x58/0xec ] [f0527104 : kernel_init+0x14/0x110 ] [f000b77c : ret_from_kernel_thread+0xc/0x38 ] [00000000 : 0x0 ]
Code path leading to that message is different but always the same from free_unref_page().
Actually it occurs to me that the patch consolidating kmap_prot is odd for sparc 32 bit...
Its a long shot but could you try reverting this patch?
4ea7d2419e3f kmap: consolidate kmap_prot definitions
That is not easy to revert, unfortunately, due to several follow-up patches.
I have gotten your sparc tests to run and they all pass...
08:10:34 > ../linux-build-test/rootfs/sparc/run-qemu-sparc.sh Build reference: v5.7-rc4-17-g852b6f2edc0f
That doesn't look like it is linux-next, which I guess means that something else in linux-next breaks it. What is your qemu version ?
Thanks, Guenter
Building sparc32:SPARCClassic:nosmp:scsi:hd ... running ......... passed Building sparc32:SPARCbook:nosmp:scsi:cd ... running ......... passed Building sparc32:LX:nosmp:noapc:scsi:hd ... running ......... passed Building sparc32:SS-4:nosmp:initrd ... running ......... passed Building sparc32:SS-5:nosmp:scsi:hd ... running ......... passed Building sparc32:SS-10:nosmp:scsi:cd ... running ......... passed Building sparc32:SS-20:nosmp:scsi:hd ... running ......... passed Building sparc32:SS-600MP:nosmp:scsi:hd ... running ......... passed Building sparc32:Voyager:nosmp:noapc:scsi:hd ... running ......... passed Building sparc32:SS-4:smp:scsi:hd ... running ......... passed Building sparc32:SS-5:smp:scsi:cd ... running ......... passed Building sparc32:SS-10:smp:scsi:hd ... running ......... passed Building sparc32:SS-20:smp:scsi:hd ... running ......... passed Building sparc32:SS-600MP:smp:scsi:hd ... running ......... passed Building sparc32:Voyager:smp:noapc:scsi:hd ... running ......... passed
Is there another test I need to run?
Ira
Guenter
Alternately I will need to figure out how to run the sparc on qemu here...
Thanks very much for all the testing though! :-D
Ira
Still testing ppc images.
ppc image tests are passing with this patch.
Guenter
On 5/21/20 10:42 AM, Ira Weiny wrote:
On Thu, May 21, 2020 at 09:05:41AM -0700, Guenter Roeck wrote:
On 5/19/20 10:13 PM, Ira Weiny wrote:
On Tue, May 19, 2020 at 12:42:15PM -0700, Guenter Roeck wrote:
On Tue, May 19, 2020 at 11:40:32AM -0700, Ira Weiny wrote:
On Tue, May 19, 2020 at 09:54:22AM -0700, Guenter Roeck wrote: > On Mon, May 18, 2020 at 11:48:43AM -0700, ira.weiny@intel.com
wrote:
>> From: Ira Weiny ira.weiny@intel.com >> >> The kunmap_atomic clean up failed to remove one set of >> pagefault/preempt enables when vaddr is not in the fixmap. >> >> Fixes: bee2128a09e6 ("arch/kunmap_atomic: consolidate duplicate >> code") >> Signed-off-by: Ira Weiny ira.weiny@intel.com > > microblazeel works with this patch,
Awesome... Andrew in my rush yesterday I should have put a reported by on the patch for Guenter as well.
Sorry about that Guenter,
No worries.
Ira
> as do the nosmp sparc32 boot tests, but sparc32 boot tests with > SMP enabled still fail with lots of messages such as: > > BUG: Bad page state in process swapper/0 pfn:006a1 > page:f0933420 refcount:0 mapcount:1 mapping:(ptrval) index:0x1 > flags: 0x0() > raw: 00000000 00000100 00000122 00000000 00000001 00000000 > 00000000 00000000 page dumped because: nonzero mapcount
Modules
> linked in: > CPU: 0 PID: 1 Comm: swapper/0 Tainted: G B 5.7.0-rc6-next-
20200518-00002-gb178d2d56f29 #1
> [f00e7ab8 : > bad_page+0xa8/0x108 ] > [f00e8b54 : > free_pcppages_bulk+0x154/0x52c ] > [f00ea024 : > free_unref_page+0x54/0x6c ] > [f00ed864 : > free_reserved_area+0x58/0xec ] > [f0527104 : > kernel_init+0x14/0x110 ] > [f000b77c : > ret_from_kernel_thread+0xc/0x38 ] > [00000000 : > 0x0 ] > > Code path leading to that message is different but always the > same from free_unref_page().
Actually it occurs to me that the patch consolidating kmap_prot is odd for sparc 32 bit...
Its a long shot but could you try reverting this patch?
4ea7d2419e3f kmap: consolidate kmap_prot definitions
That is not easy to revert, unfortunately, due to several follow-up
patches.
I have gotten your sparc tests to run and they all pass...
08:10:34 > ../linux-build-test/rootfs/sparc/run-qemu-sparc.sh Build reference: v5.7-rc4-17-g852b6f2edc0f
That doesn't look like it is linux-next, which I guess means that something else in linux-next breaks it. What is your qemu version ?
Ah yea that was just 5.7-rc4 with my patch set applied. Yes must be something else or an interaction with my patch set.
Did I see another email with Mike which may fix this?
Ira
Thanks, Guenter
Building sparc32:SPARCClassic:nosmp:scsi:hd ... running ......... passed Building sparc32:SPARCbook:nosmp:scsi:cd ... running ......... passed Building sparc32:LX:nosmp:noapc:scsi:hd ... running ......... passed Building sparc32:SS-4:nosmp:initrd ... running ......... passed Building sparc32:SS-5:nosmp:scsi:hd ... running ......... passed Building sparc32:SS-10:nosmp:scsi:cd ... running ......... passed Building sparc32:SS-20:nosmp:scsi:hd ... running ......... passed Building sparc32:SS-600MP:nosmp:scsi:hd ... running ......... passed Building sparc32:Voyager:nosmp:noapc:scsi:hd ... running ......... passed Building sparc32:SS-4:smp:scsi:hd ... running ......... passed Building sparc32:SS-5:smp:scsi:cd ... running ......... passed Building sparc32:SS-10:smp:scsi:hd ... running ......... passed Building sparc32:SS-20:smp:scsi:hd ... running ......... passed Building sparc32:SS-600MP:smp:scsi:hd ... running ......... passed Building sparc32:Voyager:smp:noapc:scsi:hd ... running ......... passed
Is there another test I need to run?
Ira
Guenter
Alternately I will need to figure out how to run the sparc on qemu here...
Thanks very much for all the testing though! :-D
Ira
> > Still testing ppc images. >
ppc image tests are passing with this patch.
Guenter
On Thu, 21 May 2020 10:42:50 -0700 Ira Weiny ira.weiny@intel.com wrote:
Actually it occurs to me that the patch consolidating kmap_prot is odd for sparc 32 bit...
Its a long shot but could you try reverting this patch?
4ea7d2419e3f kmap: consolidate kmap_prot definitions
That is not easy to revert, unfortunately, due to several follow-up patches.
I have gotten your sparc tests to run and they all pass...
08:10:34 > ../linux-build-test/rootfs/sparc/run-qemu-sparc.sh Build reference: v5.7-rc4-17-g852b6f2edc0f
Building sparc32:SPARCClassic:nosmp:scsi:hd ... running ......... passed Building sparc32:SPARCbook:nosmp:scsi:cd ... running ......... passed Building sparc32:LX:nosmp:noapc:scsi:hd ... running ......... passed Building sparc32:SS-4:nosmp:initrd ... running ......... passed Building sparc32:SS-5:nosmp:scsi:hd ... running ......... passed Building sparc32:SS-10:nosmp:scsi:cd ... running ......... passed Building sparc32:SS-20:nosmp:scsi:hd ... running ......... passed Building sparc32:SS-600MP:nosmp:scsi:hd ... running ......... passed Building sparc32:Voyager:nosmp:noapc:scsi:hd ... running ......... passed Building sparc32:SS-4:smp:scsi:hd ... running ......... passed Building sparc32:SS-5:smp:scsi:cd ... running ......... passed Building sparc32:SS-10:smp:scsi:hd ... running ......... passed Building sparc32:SS-20:smp:scsi:hd ... running ......... passed Building sparc32:SS-600MP:smp:scsi:hd ... running ......... passed Building sparc32:Voyager:smp:noapc:scsi:hd ... running ......... passed
Is there another test I need to run?
This all petered out, but as I understand it, this patchset still might have issues on various architectures.
Can folks please provide an update on the testing status?
On Wed, Jun 03, 2020 at 01:57:36PM -0700, Andrew Morton wrote:
On Thu, 21 May 2020 10:42:50 -0700 Ira Weiny ira.weiny@intel.com wrote:
Actually it occurs to me that the patch consolidating kmap_prot is odd for sparc 32 bit...
Its a long shot but could you try reverting this patch?
4ea7d2419e3f kmap: consolidate kmap_prot definitions
That is not easy to revert, unfortunately, due to several follow-up patches.
I have gotten your sparc tests to run and they all pass...
08:10:34 > ../linux-build-test/rootfs/sparc/run-qemu-sparc.sh Build reference: v5.7-rc4-17-g852b6f2edc0f
Building sparc32:SPARCClassic:nosmp:scsi:hd ... running ......... passed Building sparc32:SPARCbook:nosmp:scsi:cd ... running ......... passed Building sparc32:LX:nosmp:noapc:scsi:hd ... running ......... passed Building sparc32:SS-4:nosmp:initrd ... running ......... passed Building sparc32:SS-5:nosmp:scsi:hd ... running ......... passed Building sparc32:SS-10:nosmp:scsi:cd ... running ......... passed Building sparc32:SS-20:nosmp:scsi:hd ... running ......... passed Building sparc32:SS-600MP:nosmp:scsi:hd ... running ......... passed Building sparc32:Voyager:nosmp:noapc:scsi:hd ... running ......... passed Building sparc32:SS-4:smp:scsi:hd ... running ......... passed Building sparc32:SS-5:smp:scsi:cd ... running ......... passed Building sparc32:SS-10:smp:scsi:hd ... running ......... passed Building sparc32:SS-20:smp:scsi:hd ... running ......... passed Building sparc32:SS-600MP:smp:scsi:hd ... running ......... passed Building sparc32:Voyager:smp:noapc:scsi:hd ... running ......... passed
Is there another test I need to run?
This all petered out, but as I understand it, this patchset still might have issues on various architectures.
Can folks please provide an update on the testing status?
I believe the tests were failing for Guenter due to another patch set...[1]
My tests with just this series are working.
From my understanding the other failures were unrelated.[2]
<quote Mike Rapoport> I've checked the patch above on top of the mmots which already has Ira's patches and it booted fine. I've used sparc32_defconfig to build the kernel and qemu-system-sparc with default machine and CPU. </quote>
Mike, am I wrong? Do you think the kmap() patches are still causing issues?
Ira
[1] https://lore.kernel.org/lkml/2807E5FD2F6FDA4886F6618EAC48510E92EAB1DE@CRSMSX... [2] https://lore.kernel.org/lkml/20200520195110.GH1118872@kernel.org/
On 6/3/20 2:14 PM, Ira Weiny wrote:
On Wed, Jun 03, 2020 at 01:57:36PM -0700, Andrew Morton wrote:
On Thu, 21 May 2020 10:42:50 -0700 Ira Weiny ira.weiny@intel.com wrote:
Actually it occurs to me that the patch consolidating kmap_prot is odd for sparc 32 bit...
Its a long shot but could you try reverting this patch?
4ea7d2419e3f kmap: consolidate kmap_prot definitions
That is not easy to revert, unfortunately, due to several follow-up patches.
I have gotten your sparc tests to run and they all pass...
08:10:34 > ../linux-build-test/rootfs/sparc/run-qemu-sparc.sh Build reference: v5.7-rc4-17-g852b6f2edc0f
Building sparc32:SPARCClassic:nosmp:scsi:hd ... running ......... passed Building sparc32:SPARCbook:nosmp:scsi:cd ... running ......... passed Building sparc32:LX:nosmp:noapc:scsi:hd ... running ......... passed Building sparc32:SS-4:nosmp:initrd ... running ......... passed Building sparc32:SS-5:nosmp:scsi:hd ... running ......... passed Building sparc32:SS-10:nosmp:scsi:cd ... running ......... passed Building sparc32:SS-20:nosmp:scsi:hd ... running ......... passed Building sparc32:SS-600MP:nosmp:scsi:hd ... running ......... passed Building sparc32:Voyager:nosmp:noapc:scsi:hd ... running ......... passed Building sparc32:SS-4:smp:scsi:hd ... running ......... passed Building sparc32:SS-5:smp:scsi:cd ... running ......... passed Building sparc32:SS-10:smp:scsi:hd ... running ......... passed Building sparc32:SS-20:smp:scsi:hd ... running ......... passed Building sparc32:SS-600MP:smp:scsi:hd ... running ......... passed Building sparc32:Voyager:smp:noapc:scsi:hd ... running ......... passed
Is there another test I need to run?
This all petered out, but as I understand it, this patchset still might have issues on various architectures.
Can folks please provide an update on the testing status?
I believe the tests were failing for Guenter due to another patch set...[1]
My tests with just this series are working.
From my understanding the other failures were unrelated.[2]
<quote Mike Rapoport> I've checked the patch above on top of the mmots which already has Ira's patches and it booted fine. I've used sparc32_defconfig to build the kernel and qemu-system-sparc with default machine and CPU. </quote>
Mike, am I wrong? Do you think the kmap() patches are still causing issues?
For my part, all I can say is that -next is in pretty bad shape right now. The summary of my tests says:
Build results: total: 151 pass: 130 fail: 21 Qemu test results: total: 430 pass: 375 fail: 55
sparc32 smp images in next-20200603 still crash for me with a spinlock recursion. s390 images hang early in boot. Several others (alpha, arm64, various ppc) don't even compile. I can run some more bisects over time, but this is becoming a full-time job :-(.
Guenter
On Wed, Jun 03, 2020 at 04:44:17PM -0700, Guenter Roeck wrote:
On 6/3/20 2:14 PM, Ira Weiny wrote:
On Wed, Jun 03, 2020 at 01:57:36PM -0700, Andrew Morton wrote:
On Thu, 21 May 2020 10:42:50 -0700 Ira Weiny ira.weiny@intel.com wrote:
Actually it occurs to me that the patch consolidating kmap_prot is odd for sparc 32 bit...
Its a long shot but could you try reverting this patch?
4ea7d2419e3f kmap: consolidate kmap_prot definitions
That is not easy to revert, unfortunately, due to several follow-up patches.
I have gotten your sparc tests to run and they all pass...
08:10:34 > ../linux-build-test/rootfs/sparc/run-qemu-sparc.sh Build reference: v5.7-rc4-17-g852b6f2edc0f
Building sparc32:SPARCClassic:nosmp:scsi:hd ... running ......... passed Building sparc32:SPARCbook:nosmp:scsi:cd ... running ......... passed Building sparc32:LX:nosmp:noapc:scsi:hd ... running ......... passed Building sparc32:SS-4:nosmp:initrd ... running ......... passed Building sparc32:SS-5:nosmp:scsi:hd ... running ......... passed Building sparc32:SS-10:nosmp:scsi:cd ... running ......... passed Building sparc32:SS-20:nosmp:scsi:hd ... running ......... passed Building sparc32:SS-600MP:nosmp:scsi:hd ... running ......... passed Building sparc32:Voyager:nosmp:noapc:scsi:hd ... running ......... passed Building sparc32:SS-4:smp:scsi:hd ... running ......... passed Building sparc32:SS-5:smp:scsi:cd ... running ......... passed Building sparc32:SS-10:smp:scsi:hd ... running ......... passed Building sparc32:SS-20:smp:scsi:hd ... running ......... passed Building sparc32:SS-600MP:smp:scsi:hd ... running ......... passed Building sparc32:Voyager:smp:noapc:scsi:hd ... running ......... passed
Is there another test I need to run?
This all petered out, but as I understand it, this patchset still might have issues on various architectures.
Can folks please provide an update on the testing status?
I believe the tests were failing for Guenter due to another patch set...[1]
My tests with just this series are working.
From my understanding the other failures were unrelated.[2]
<quote Mike Rapoport> I've checked the patch above on top of the mmots which already has Ira's patches and it booted fine. I've used sparc32_defconfig to build the kernel and qemu-system-sparc with default machine and CPU. </quote>
Mike, am I wrong? Do you think the kmap() patches are still causing issues?
sparc32 UP and microblaze work for me with next-20200603, but I didn't test other architectures.
For my part, all I can say is that -next is in pretty bad shape right now. The summary of my tests says:
Build results: total: 151 pass: 130 fail: 21 Qemu test results: total: 430 pass: 375 fail: 55
sparc32 smp images in next-20200603 still crash for me with a spinlock recursion.
I think this is because Will's fixes [1] are not yet in -next.
s390 images hang early in boot. Several others (alpha, arm64, various ppc) don't even compile. I can run some more bisects over time, but this is becoming a full-time job :-(.
Guenter
[1] https://lore.kernel.org/lkml/20200526173302.377-1-will@kernel.org
On Thu, Jun 04, 2020 at 09:18:05AM +0300, Mike Rapoport wrote:
On Wed, Jun 03, 2020 at 04:44:17PM -0700, Guenter Roeck wrote:
On 6/3/20 2:14 PM, Ira Weiny wrote:
On Wed, Jun 03, 2020 at 01:57:36PM -0700, Andrew Morton wrote:
On Thu, 21 May 2020 10:42:50 -0700 Ira Weiny ira.weiny@intel.com wrote:
> > Actually it occurs to me that the patch consolidating kmap_prot is odd for > sparc 32 bit... > > Its a long shot but could you try reverting this patch? > > 4ea7d2419e3f kmap: consolidate kmap_prot definitions >
That is not easy to revert, unfortunately, due to several follow-up patches.
I have gotten your sparc tests to run and they all pass...
08:10:34 > ../linux-build-test/rootfs/sparc/run-qemu-sparc.sh Build reference: v5.7-rc4-17-g852b6f2edc0f
Building sparc32:SPARCClassic:nosmp:scsi:hd ... running ......... passed Building sparc32:SPARCbook:nosmp:scsi:cd ... running ......... passed Building sparc32:LX:nosmp:noapc:scsi:hd ... running ......... passed Building sparc32:SS-4:nosmp:initrd ... running ......... passed Building sparc32:SS-5:nosmp:scsi:hd ... running ......... passed Building sparc32:SS-10:nosmp:scsi:cd ... running ......... passed Building sparc32:SS-20:nosmp:scsi:hd ... running ......... passed Building sparc32:SS-600MP:nosmp:scsi:hd ... running ......... passed Building sparc32:Voyager:nosmp:noapc:scsi:hd ... running ......... passed Building sparc32:SS-4:smp:scsi:hd ... running ......... passed Building sparc32:SS-5:smp:scsi:cd ... running ......... passed Building sparc32:SS-10:smp:scsi:hd ... running ......... passed Building sparc32:SS-20:smp:scsi:hd ... running ......... passed Building sparc32:SS-600MP:smp:scsi:hd ... running ......... passed Building sparc32:Voyager:smp:noapc:scsi:hd ... running ......... passed
Is there another test I need to run?
This all petered out, but as I understand it, this patchset still might have issues on various architectures.
Can folks please provide an update on the testing status?
I believe the tests were failing for Guenter due to another patch set...[1]
My tests with just this series are working.
From my understanding the other failures were unrelated.[2]
<quote Mike Rapoport> I've checked the patch above on top of the mmots which already has Ira's patches and it booted fine. I've used sparc32_defconfig to build the kernel and qemu-system-sparc with default machine and CPU. </quote>
Mike, am I wrong? Do you think the kmap() patches are still causing issues?
sparc32 UP and microblaze work for me with next-20200603, but I didn't test other architectures.
For my part, all I can say is that -next is in pretty bad shape right now. The summary of my tests says:
Build results: total: 151 pass: 130 fail: 21 Qemu test results: total: 430 pass: 375 fail: 55
sparc32 smp images in next-20200603 still crash for me with a spinlock recursion.
I think this is because Will's fixes [1] are not yet in -next.
s390 images hang early in boot. Several others (alpha, arm64, various ppc) don't even compile. I can run some more bisects over time, but this is becoming a full-time job :-(.
Guenter
[1] https://lore.kernel.org/lkml/20200526173302.377-1-will@kernel.org
I abandoned the bisect and tested with this fix.[1] It passes. Guenter, on the original thread we had microblaze and ppc working with my fix.
https://lore.kernel.org/lkml/20200519194215.GA71941@roeck-us.net/
Sounds like the current failures above are from something much newer in the tree.
Ira
[1] 23:26:24 > /home/iweiny/dev/linux-build-test/rootfs/sparc/run-qemu-sparc.sh Build reference: next-20200603-3-gf5afe92a2135
Building sparc32:SPARCClassic:nosmp:scsi:hd ... running ......... passed Building sparc32:SPARCbook:nosmp:scsi:cd ... running ......... passed Building sparc32:LX:nosmp:noapc:scsi:hd ... running ......... passed Building sparc32:SS-4:nosmp:initrd ... running ......... passed Building sparc32:SS-5:nosmp:scsi:hd ... running ......... passed Building sparc32:SS-10:nosmp:scsi:cd ... running ......... passed Building sparc32:SS-20:nosmp:scsi:hd ... running ......... passed Building sparc32:SS-600MP:nosmp:scsi:hd ... running ......... passed Building sparc32:Voyager:nosmp:noapc:scsi:hd ... running ......... passed Building sparc32:SS-4:smp:scsi:hd ... running ......... passed Building sparc32:SS-5:smp:scsi:cd ... running ......... passed Building sparc32:SS-10:smp:scsi:hd ... running ......... passed Building sparc32:SS-20:smp:scsi:hd ... running ......... passed Building sparc32:SS-600MP:smp:scsi:hd ... running ......... passed Building sparc32:Voyager:smp:noapc:scsi:hd ... running ......... passed
-- Sincerely yours, Mike.
On Wed, Jun 03, 2020 at 04:44:17PM -0700, Guenter Roeck wrote:
On 6/3/20 2:14 PM, Ira Weiny wrote:
On Wed, Jun 03, 2020 at 01:57:36PM -0700, Andrew Morton wrote:
On Thu, 21 May 2020 10:42:50 -0700 Ira Weiny ira.weiny@intel.com wrote:
...
This all petered out, but as I understand it, this patchset still might have issues on various architectures.
Can folks please provide an update on the testing status?
I believe the tests were failing for Guenter due to another patch set...[1]
My tests with just this series are working.
From my understanding the other failures were unrelated.[2]
<quote Mike Rapoport> I've checked the patch above on top of the mmots which already has Ira's patches and it booted fine. I've used sparc32_defconfig to build the kernel and qemu-system-sparc with default machine and CPU. </quote>
Mike, am I wrong? Do you think the kmap() patches are still causing issues?
For my part, all I can say is that -next is in pretty bad shape right now. The summary of my tests says:
Build results: total: 151 pass: 130 fail: 21 Qemu test results: total: 430 pass: 375 fail: 55
sparc32 smp images in next-20200603 still crash for me with a spinlock recursion. s390 images hang early in boot. Several others (alpha, arm64, various ppc) don't even compile. I can run some more bisects over time, but this is becoming a full-time job :-(.
I'm not sure what the process here is. I just applied my series[1] on Linus' Master branch[2] and ran sparc32 and s290 from your tests.
sparc32: (passes)
21:43:49 > /home/iweiny/dev/linux-build-test/rootfs/sparc/run-qemu-sparc.sh Build reference: v5.7-7188-g67a7a97e8a0f
Building sparc32:SPARCClassic:nosmp:scsi:hd ... running ......... passed Building sparc32:SPARCbook:nosmp:scsi:cd ... running ......... passed Building sparc32:LX:nosmp:noapc:scsi:hd ... running ......... passed Building sparc32:SS-4:nosmp:initrd ... running ......... passed Building sparc32:SS-5:nosmp:scsi:hd ... running ......... passed Building sparc32:SS-10:nosmp:scsi:cd ... running ......... passed Building sparc32:SS-20:nosmp:scsi:hd ... running ......... passed Building sparc32:SS-600MP:nosmp:scsi:hd ... running ......... passed Building sparc32:Voyager:nosmp:noapc:scsi:hd ... running ...... .... passed Building sparc32:SS-4:smp:scsi:hd ... running ......... passed Building sparc32:SS-5:smp:scsi:cd ... running ......... passed Building sparc32:SS-10:smp:scsi:hd ... running ......... passed Building sparc32:SS-20:smp:scsi:hd ... running ......... passed Building sparc32:SS-600MP:smp:scsi:hd ... running ......... passed Building sparc32:Voyager:smp:noapc:scsi:hd ... running ......... passed
s390: (does not compile)
<stdin>:1511:2: warning: #warning syscall clone3 not implemented [-Wcpp] In file included from ./arch/sparc/include/asm/bug.h:6:0, from ./include/linux/bug.h:5, from ./include/linux/mmdebug.h:5, from ./include/linux/mm.h:9, from mm/huge_memory.c:8: mm/huge_memory.c: In function 'hugepage_init': ./include/linux/compiler.h:403:38: error: call to '__compiletime_assert_127' declared with attribute error: BUILD_BUG_ON failed: ((13 + (13-3))-13) >= 9 _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__) ^ ./include/linux/compiler.h:384:4: note: in definition of macro '__compiletime_assert' prefix ## suffix(); \ ^~~~~~ ./include/linux/compiler.h:403:2: note: in expansion of macro '_compiletime_assert' _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__) ^~~~~~~~~~~~~~~~~~~ ./include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert' #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) ^~~~~~~~~~~~~~~~~~ ./include/linux/build_bug.h:50:2: note: in expansion of macro 'BUILD_BUG_ON_MSG' BUILD_BUG_ON_MSG(condition, "BUILD_BUG_ON failed: " #condition) ^~~~~~~~~~~~~~~~ ./include/linux/bug.h:24:4: note: in expansion of macro 'BUILD_BUG_ON' BUILD_BUG_ON(cond); \ ^~~~~~~~~~~~ mm/huge_memory.c:403:2: note: in expansion of macro 'MAYBE_BUILD_BUG_ON' MAYBE_BUILD_BUG_ON(HPAGE_PMD_ORDER >= MAX_ORDER); ^~~~~~~~~~~~~~~~~~ make[1]: *** [scripts/Makefile.build:267: mm/huge_memory.o] Error 1 make[1]: *** Waiting for unfinished jobs.... make: *** [Makefile:1735: mm] Error 2 make: *** Waiting for unfinished jobs.... ------------
The s390 error is the same on Linus' master and linux-next. So whatever is causing that has slipped into mainline and/or is something I've broken in the test scripts.
With linux-next on sparc I too see the spinlock issue; something like:
... Starting syslogd: BUG: spinlock recursion on CPU#0, S01syslogd/139 lock: 0xf53ef350, .magic: dead4ead, .owner: S01syslogd/139, .owner_cpu: 0 CPU: 0 PID: 139 Comm: S01syslogd Not tainted 5.7.0-next-20200603 #1 [f0067d00 : do_raw_spin_lock+0xa8/0xd8 ] [f00d598c : copy_page_range+0x328/0x804 ] [f0025c34 : dup_mm+0x334/0x434 ] [f0027198 : copy_process+0x1248/0x12d4 ] [f00273b8 : _do_fork+0x54/0x30c ] [f00276e4 : do_fork+0x5c/0x6c ] [f000de44 : sparc_do_fork+0x18/0x38 ] [f000b7f4 : do_syscall+0x34/0x40 ] [5010cd4c : 0x5010cd4c ]
qemu-system-sparc: terminating on signal 15 from pid 2000056 (/bin/bash) ...
FWIW I don't see any of this being an issue with the kmap() code but I agree things could be cleaner. How can we back linux-next off a bit? I'm not an expert here with how linux-next works.
For example I just picked the latest patch from me within the linux-next tree:
2e483306d5a8 arch/{mips,sparc,microblaze,powerpc}: don't enable pagefault/preempt twice
And built from there it looks good for sparc.
23:01:31 > /home/iweiny/dev/linux-build-test/rootfs/sparc/run-qemu-sparc.sh Build reference: v5.7-719-g2e483306d5a8
Building sparc32:SPARCClassic:nosmp:scsi:hd ... running .......... passed Building sparc32:SPARCbook:nosmp:scsi:cd ... running .......... passed Building sparc32:LX:nosmp:noapc:scsi:hd ... running .......... passed Building sparc32:SS-4:nosmp:initrd ... running .......... passed Building sparc32:SS-5:nosmp:scsi:hd ... running .......... passed Building sparc32:SS-10:nosmp:scsi:cd ... running .......... passed Building sparc32:SS-20:nosmp:scsi:hd ... running .......... passed Building sparc32:SS-600MP:nosmp:scsi:hd ... running ......... passed Building sparc32:Voyager:nosmp:noapc:scsi:hd ... running ......... passed Building sparc32:SS-4:smp:scsi:hd ... running ......^[[1;2D... passed Building sparc32:SS-5:smp:scsi:cd ... running ......... passed Building sparc32:SS-10:smp:scsi:hd ... running ......... passed Building sparc32:SS-20:smp:scsi:hd ... running ......... passed Building sparc32:SS-600MP:smp:scsi:hd ... running ......... passed Building sparc32:Voyager:smp:noapc:scsi:hd ... running ......... passed
I'm going to bisect between there and HEAD.
Ira
[1]
67a7a97e8a0f arch/{mips,sparc,microblaze,powerpc}: Don't enable pagefault/preempt twice 4a3dd9ec36d8 kmap: Consolidate kmap_prot definitions a3b39b1668ac sparc: Remove unnecessary includes 452195c6e8a8 parisc/kmap: Remove duplicate kmap code 317e4af1da94 kmap: Remove kmap_atomic_to_page() e11e52415a4d drm: Remove drm specific kmap_atomic code afd4911f0cfb arch/kmap: Define kmap_atomic_prot() for all arch's 2a5524d63341 arch/kmap: Don't hard code kmap_prot values c94bbaab0296 arch/kmap: Ensure kmap_prot visibility 6f29a6b66d3b arch/kunmap_atomic: Consolidate duplicate code 0c7122ef07d1 arch/kmap_atomic: Consolidate duplicate code 63b8bbf47723 {x86,powerpc,microblaze}/kmap: Move preempt disable 23b3175de76f arch/kunmap: Remove duplicate kunmap implementations 9514dd54fda8 arch/kmap: Remove redundant arch specific kmaps e92e53c0080b arch/xtensa: Move kmap build bug out of the way cab1afa4f6ac arch/kmap: Remove BUG_ON()
[2] cb8e59cc8720 (linus/master, linus-master) Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next
On Wed, Jun 03, 2020 at 11:22:26PM -0700, Ira Weiny wrote:
On Wed, Jun 03, 2020 at 04:44:17PM -0700, Guenter Roeck wrote:
With linux-next on sparc I too see the spinlock issue; something like:
... Starting syslogd: BUG: spinlock recursion on CPU#0, S01syslogd/139 lock: 0xf53ef350, .magic: dead4ead, .owner: S01syslogd/139, .owner_cpu: 0 CPU: 0 PID: 139 Comm: S01syslogd Not tainted 5.7.0-next-20200603 #1 [f0067d00 : do_raw_spin_lock+0xa8/0xd8 ] [f00d598c : copy_page_range+0x328/0x804 ] [f0025c34 : dup_mm+0x334/0x434 ] [f0027198 : copy_process+0x1248/0x12d4 ] [f00273b8 : _do_fork+0x54/0x30c ] [f00276e4 : do_fork+0x5c/0x6c ] [f000de44 : sparc_do_fork+0x18/0x38 ] [f000b7f4 : do_syscall+0x34/0x40 ] [5010cd4c : 0x5010cd4c ]
I'm going to bisect between there and HEAD.
The sparc issue should be fixed by
https://lore.kernel.org/lkml/20200526173302.377-1-will@kernel.org
Ira
On Thu, Jun 04, 2020 at 09:37:45AM +0300, Mike Rapoport wrote:
On Wed, Jun 03, 2020 at 11:22:26PM -0700, Ira Weiny wrote:
On Wed, Jun 03, 2020 at 04:44:17PM -0700, Guenter Roeck wrote:
With linux-next on sparc I too see the spinlock issue; something like:
... Starting syslogd: BUG: spinlock recursion on CPU#0, S01syslogd/139 lock: 0xf53ef350, .magic: dead4ead, .owner: S01syslogd/139, .owner_cpu: 0 CPU: 0 PID: 139 Comm: S01syslogd Not tainted 5.7.0-next-20200603 #1 [f0067d00 : do_raw_spin_lock+0xa8/0xd8 ] [f00d598c : copy_page_range+0x328/0x804 ] [f0025c34 : dup_mm+0x334/0x434 ] [f0027198 : copy_process+0x1248/0x12d4 ] [f00273b8 : _do_fork+0x54/0x30c ] [f00276e4 : do_fork+0x5c/0x6c ] [f000de44 : sparc_do_fork+0x18/0x38 ] [f000b7f4 : do_syscall+0x34/0x40 ] [5010cd4c : 0x5010cd4c ]
I'm going to bisect between there and HEAD.
The sparc issue should be fixed by
https://lore.kernel.org/lkml/20200526173302.377-1-will@kernel.org
Saw your other email. And yes they are!
Thanks! Ira
Ira
-- Sincerely yours, Mike.
On 6/3/20 11:22 PM, Ira Weiny wrote: [ ... ]
s390: (does not compile)
<stdin>:1511:2: warning: #warning syscall clone3 not implemented [-Wcpp] In file included from ./arch/sparc/include/asm/bug.h:6:0, from ./include/linux/bug.h:5, from ./include/linux/mmdebug.h:5, from ./include/linux/mm.h:9, from mm/huge_memory.c:8: mm/huge_memory.c: In function 'hugepage_init': ./include/linux/compiler.h:403:38: error: call to '__compiletime_assert_127' declared with attribute error: BUILD_BUG_ON failed: ((13 + (13-3))-13) >= 9 _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__) ^ ./include/linux/compiler.h:384:4: note: in definition of macro '__compiletime_assert' prefix ## suffix(); \ ^~~~~~ ./include/linux/compiler.h:403:2: note: in expansion of macro '_compiletime_assert' _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__) ^~~~~~~~~~~~~~~~~~~ ./include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert' #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) ^~~~~~~~~~~~~~~~~~ ./include/linux/build_bug.h:50:2: note: in expansion of macro 'BUILD_BUG_ON_MSG' BUILD_BUG_ON_MSG(condition, "BUILD_BUG_ON failed: " #condition) ^~~~~~~~~~~~~~~~ ./include/linux/bug.h:24:4: note: in expansion of macro 'BUILD_BUG_ON' BUILD_BUG_ON(cond); \ ^~~~~~~~~~~~ mm/huge_memory.c:403:2: note: in expansion of macro 'MAYBE_BUILD_BUG_ON' MAYBE_BUILD_BUG_ON(HPAGE_PMD_ORDER >= MAX_ORDER); ^~~~~~~~~~~~~~~~~~ make[1]: *** [scripts/Makefile.build:267: mm/huge_memory.o] Error 1 make[1]: *** Waiting for unfinished jobs.... make: *** [Makefile:1735: mm] Error 2 make: *** Waiting for unfinished jobs....
The s390 error is the same on Linus' master and linux-next. So whatever is causing that has slipped into mainline and/or is something I've broken in the test scripts.
Compiler version related. gcc version 8.x and later no longer work. Bisect points to commit a148866489f ("sched: Replace rq::wake_list"). Oddly enough x86 images are broken as well. You'll have to use an older version of gcc (or presumably clang) until this is fixed.
Guenter
On Wed, Jun 03, 2020 at 04:44:17PM -0700, Guenter Roeck wrote:
sparc32 smp images in next-20200603 still crash for me with a spinlock recursion. s390 images hang early in boot. Several others (alpha, arm64, various ppc) don't even compile. I can run some more bisects over time, but this is becoming a full-time job :-(.
I've been able to bisect s390 hang to commit b614345f52bc ("x86/entry: Clarify irq_{enter,exit}_rcu()").
After this commit, lockdep_hardirq_exit() is called twice on s390 (and others) - one time in irq_exit_rcu() and another one in irq_exit():
/** * irq_exit_rcu() - Exit an interrupt context without updating RCU * * Also processes softirqs if needed and possible. */ void irq_exit_rcu(void) { __irq_exit_rcu(); /* must be last! */ lockdep_hardirq_exit(); }
/** * irq_exit - Exit an interrupt context, update RCU and lockdep * * Also processes softirqs if needed and possible. */ void irq_exit(void) { irq_exit_rcu(); rcu_irq_exit(); /* must be last! */ lockdep_hardirq_exit(); }
Removing the call in irq_exit() make s390 boot again, and judgung by the x86 entry code, the comment /* must be last! */ is stale...
@Peter, @Thomas, can you comment please?
From e51d50ee6f4d1f446decf91c2c67230da14ff82c Mon Sep 17 00:00:00 2001
From: Mike Rapoport rppt@linux.ibm.com Date: Thu, 4 Jun 2020 12:37:03 +0300 Subject: [PATCH] softirq: don't call lockdep_hardirq_exit() twice
After commit b614345f52bc ("x86/entry: Clarify irq_{enter,exit}_rcu()") lockdep_hardirq_exit() is called twice on every architecture that uses irq_exit(): one time in irq_exit_rcu() and another one in irq_exit().
Remove the extra call in irq_exit().
Signed-off-by: Mike Rapoport rppt@linux.ibm.com --- kernel/softirq.c | 3 --- 1 file changed, 3 deletions(-)
diff --git a/kernel/softirq.c b/kernel/softirq.c index a3eb6eba8c41..7523f4ce4c1d 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c @@ -427,7 +427,6 @@ static inline void __irq_exit_rcu(void) void irq_exit_rcu(void) { __irq_exit_rcu(); - /* must be last! */ lockdep_hardirq_exit(); }
@@ -440,8 +439,6 @@ void irq_exit(void) { irq_exit_rcu(); rcu_irq_exit(); - /* must be last! */ - lockdep_hardirq_exit(); }
/*
On Thu, Jun 04, 2020 at 12:41:33PM +0300, Mike Rapoport wrote:
On Wed, Jun 03, 2020 at 04:44:17PM -0700, Guenter Roeck wrote:
sparc32 smp images in next-20200603 still crash for me with a spinlock recursion. s390 images hang early in boot. Several others (alpha, arm64, various ppc) don't even compile. I can run some more bisects over time, but this is becoming a full-time job :-(.
I've been able to bisect s390 hang to commit b614345f52bc ("x86/entry: Clarify irq_{enter,exit}_rcu()").
After this commit, lockdep_hardirq_exit() is called twice on s390 (and others) - one time in irq_exit_rcu() and another one in irq_exit():
/**
- irq_exit_rcu() - Exit an interrupt context without updating RCU
- Also processes softirqs if needed and possible.
*/ void irq_exit_rcu(void) { __irq_exit_rcu(); /* must be last! */ lockdep_hardirq_exit(); }
/**
- irq_exit - Exit an interrupt context, update RCU and lockdep
- Also processes softirqs if needed and possible.
*/ void irq_exit(void) { irq_exit_rcu(); rcu_irq_exit(); /* must be last! */ lockdep_hardirq_exit(); }
Removing the call in irq_exit() make s390 boot again, and judgung by the x86 entry code, the comment /* must be last! */ is stale...
FWIW I got s390 to compile and this patch fixes s390 booting for me as well.
13:05:25 > /home/iweiny/dev/linux-build-test/rootfs/s390/run-qemu-s390.sh Build reference: next-20200603-4-g840714292d8c
Building s390:defconfig:initrd ... running ........... passed Building s390:defconfig:virtio-blk-ccw:rootfs ... running ........... passed Building s390:defconfig:scsi[virtio-ccw]:rootfs ... running .............. passed Building s390:defconfig:virtio-pci:rootfs ... running ........... passed Building s390:defconfig:scsi[virtio-pci]:rootfs ... running ........... passed
Ira
@Peter, @Thomas, can you comment please?
From e51d50ee6f4d1f446decf91c2c67230da14ff82c Mon Sep 17 00:00:00 2001 From: Mike Rapoport rppt@linux.ibm.com Date: Thu, 4 Jun 2020 12:37:03 +0300 Subject: [PATCH] softirq: don't call lockdep_hardirq_exit() twice
After commit b614345f52bc ("x86/entry: Clarify irq_{enter,exit}_rcu()") lockdep_hardirq_exit() is called twice on every architecture that uses irq_exit(): one time in irq_exit_rcu() and another one in irq_exit().
Remove the extra call in irq_exit().
Signed-off-by: Mike Rapoport rppt@linux.ibm.com
kernel/softirq.c | 3 --- 1 file changed, 3 deletions(-)
diff --git a/kernel/softirq.c b/kernel/softirq.c index a3eb6eba8c41..7523f4ce4c1d 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c @@ -427,7 +427,6 @@ static inline void __irq_exit_rcu(void) void irq_exit_rcu(void) { __irq_exit_rcu();
lockdep_hardirq_exit();/* must be last! */
}
@@ -440,8 +439,6 @@ void irq_exit(void) { irq_exit_rcu(); rcu_irq_exit();
/* must be last! */
- lockdep_hardirq_exit();
}
/*
2.26.2
Guenter
-- Sincerely yours, Mike.
On Tue, May 19, 2020 at 12:42:15PM -0700, Guenter Roeck wrote:
On Tue, May 19, 2020 at 09:54:22AM -0700, Guenter Roeck wrote:
as do the nosmp sparc32 boot tests, but sparc32 boot tests with SMP enabled still fail with lots of messages such as:
BUG: Bad page state in process swapper/0 pfn:006a1 page:f0933420 refcount:0 mapcount:1 mapping:(ptrval) index:0x1 flags: 0x0() raw: 00000000 00000100 00000122 00000000 00000001 00000000 00000000 00000000 page dumped because: nonzero mapcount Modules linked in: CPU: 0 PID: 1 Comm: swapper/0 Tainted: G B 5.7.0-rc6-next-20200518-00002-gb178d2d56f29 #1 [f00e7ab8 : bad_page+0xa8/0x108 ] [f00e8b54 : free_pcppages_bulk+0x154/0x52c ] [f00ea024 : free_unref_page+0x54/0x6c ] [f00ed864 : free_reserved_area+0x58/0xec ] [f0527104 : kernel_init+0x14/0x110 ] [f000b77c : ret_from_kernel_thread+0xc/0x38 ] [00000000 : 0x0 ]
Code path leading to that message is different but always the same from free_unref_page().
Still testing ppc images.
ppc image tests are passing with this patch.
How about sparc? I finally got your scripts to run on sparc and everything looks to be passing?
Are we all good now?
Thanks again! Ira
On Tue, May 19, 2020 at 09:54:22AM -0700, Guenter Roeck wrote:
On Mon, May 18, 2020 at 11:48:43AM -0700, ira.weiny@intel.com wrote:
From: Ira Weiny ira.weiny@intel.com
The kunmap_atomic clean up failed to remove one set of pagefault/preempt enables when vaddr is not in the fixmap.
Fixes: bee2128a09e6 ("arch/kunmap_atomic: consolidate duplicate code") Signed-off-by: Ira Weiny ira.weiny@intel.com
microblazeel works with this patch, as do the nosmp sparc32 boot tests, but sparc32 boot tests with SMP enabled still fail with lots of messages such as:
BTW, what's your setup for sparc32 boot tests? IOW, how do you manage to shrink the damn thing enough to have the loader cope with it? I hadn't been able to do that for the current mainline ;-/
On 5/21/20 10:27 AM, Al Viro wrote:
On Tue, May 19, 2020 at 09:54:22AM -0700, Guenter Roeck wrote:
On Mon, May 18, 2020 at 11:48:43AM -0700, ira.weiny@intel.com wrote:
From: Ira Weiny ira.weiny@intel.com
The kunmap_atomic clean up failed to remove one set of pagefault/preempt enables when vaddr is not in the fixmap.
Fixes: bee2128a09e6 ("arch/kunmap_atomic: consolidate duplicate code") Signed-off-by: Ira Weiny ira.weiny@intel.com
microblazeel works with this patch, as do the nosmp sparc32 boot tests, but sparc32 boot tests with SMP enabled still fail with lots of messages such as:
BTW, what's your setup for sparc32 boot tests? IOW, how do you manage to shrink the damn thing enough to have the loader cope with it? I hadn't been able to do that for the current mainline ;-/
defconfig seems to work just fine, even after enabling various debug and file system options.
Guenter
On Thu, May 21, 2020 at 03:20:46PM -0700, Guenter Roeck wrote:
On 5/21/20 10:27 AM, Al Viro wrote:
On Tue, May 19, 2020 at 09:54:22AM -0700, Guenter Roeck wrote:
On Mon, May 18, 2020 at 11:48:43AM -0700, ira.weiny@intel.com wrote:
From: Ira Weiny ira.weiny@intel.com
The kunmap_atomic clean up failed to remove one set of pagefault/preempt enables when vaddr is not in the fixmap.
Fixes: bee2128a09e6 ("arch/kunmap_atomic: consolidate duplicate code") Signed-off-by: Ira Weiny ira.weiny@intel.com
microblazeel works with this patch, as do the nosmp sparc32 boot tests, but sparc32 boot tests with SMP enabled still fail with lots of messages such as:
BTW, what's your setup for sparc32 boot tests? IOW, how do you manage to shrink the damn thing enough to have the loader cope with it? I hadn't been able to do that for the current mainline ;-/
defconfig seems to work just fine, even after enabling various debug and file system options.
The hell? How do you manage to get the kernel in? sparc32_defconfig ends up with 5316876 bytes unpacked...
On Thu, May 21, 2020 at 11:46:12PM +0100, Al Viro wrote:
On Thu, May 21, 2020 at 03:20:46PM -0700, Guenter Roeck wrote:
On 5/21/20 10:27 AM, Al Viro wrote:
On Tue, May 19, 2020 at 09:54:22AM -0700, Guenter Roeck wrote:
On Mon, May 18, 2020 at 11:48:43AM -0700, ira.weiny@intel.com wrote:
From: Ira Weiny ira.weiny@intel.com
The kunmap_atomic clean up failed to remove one set of pagefault/preempt enables when vaddr is not in the fixmap.
Fixes: bee2128a09e6 ("arch/kunmap_atomic: consolidate duplicate code") Signed-off-by: Ira Weiny ira.weiny@intel.com
microblazeel works with this patch, as do the nosmp sparc32 boot tests, but sparc32 boot tests with SMP enabled still fail with lots of messages such as:
BTW, what's your setup for sparc32 boot tests? IOW, how do you manage to shrink the damn thing enough to have the loader cope with it? I hadn't been able to do that for the current mainline ;-/
defconfig seems to work just fine, even after enabling various debug and file system options.
The hell? How do you manage to get the kernel in? sparc32_defconfig ends up with 5316876 bytes unpacked...
Incidentally, trying to load it via -kernel/-initrd leads to Configuration device id QEMU version 1 machine id 64 Probing SBus slot 0 offset 0 Probing SBus slot 1 offset 0 Probing SBus slot 2 offset 0 Probing SBus slot 3 offset 0 Probing SBus slot 15 offset 0 Invalid FCode start byte CPUs: 1 x TI,TMS390Z55 UUID: 00000000-0000-0000-0000-000000000000 Welcome to OpenBIOS v1.1 built on Dec 27 2018 19:17 Type 'help' for detailed information [sparc] Kernel already loaded switching to new context: PROMLIB: obio_ranges 1 PROMLIB: Sun Boot Prom Version 3 Revision 2 Linux version 5.7.0-rc1-00002-gcf51e129b968 (al@duke) (gcc version 6.3.0 20170516 (Debian 6.3.0-18), GNU ld (GNU Binutils for Debian) 2.28) #32 Thu May 21 18:36:07 EDT 2020 printk: bootconsole [earlyprom0] enabled ARCH: SUN4M TYPE: Sun4m SparcStation10/20 Ethernet address: 52:54:00:12:34:56 303MB HIGHMEM available. OF stdout device is: /obio/zs@0,100000:a PROM: Built device tree with 30051 bytes of memory. Booting Linux... Power off control detected. Kernel panic - not syncing: Failed to allocate memory for percpu areas. CPU: 0 PID: 0 Comm: swapper Not tainted 5.7.0-rc1-00002-gcf51e129b968 #32 [f04f92a8 : setup_per_cpu_areas+0x58/0x90 ] [f04edbf4 : start_kernel+0xc0/0x4a0 ] [f04ed43c : continue_boot+0x324/0x334 ] [00000000 : 0x0 ]
Press Stop-A (L1-A) from sun keyboard or send break twice on console to return to the boot prom ---[ end Kernel panic - not syncing: Failed to allocate memory for percpu areas. ]---
Giving guest more RAM doesn't change the outcome (well, the number HIGHMEM line is obviously higher, but that's it).
So which sparc32 kernel have you booted with defconfig and how have you done that?
On 5/21/20 5:46 PM, Al Viro wrote:
On Thu, May 21, 2020 at 11:46:12PM +0100, Al Viro wrote:
On Thu, May 21, 2020 at 03:20:46PM -0700, Guenter Roeck wrote:
On 5/21/20 10:27 AM, Al Viro wrote:
On Tue, May 19, 2020 at 09:54:22AM -0700, Guenter Roeck wrote:
On Mon, May 18, 2020 at 11:48:43AM -0700, ira.weiny@intel.com wrote:
From: Ira Weiny ira.weiny@intel.com
The kunmap_atomic clean up failed to remove one set of pagefault/preempt enables when vaddr is not in the fixmap.
Fixes: bee2128a09e6 ("arch/kunmap_atomic: consolidate duplicate code") Signed-off-by: Ira Weiny ira.weiny@intel.com
microblazeel works with this patch, as do the nosmp sparc32 boot tests, but sparc32 boot tests with SMP enabled still fail with lots of messages such as:
BTW, what's your setup for sparc32 boot tests? IOW, how do you manage to shrink the damn thing enough to have the loader cope with it? I hadn't been able to do that for the current mainline ;-/
defconfig seems to work just fine, even after enabling various debug and file system options.
The hell? How do you manage to get the kernel in? sparc32_defconfig ends up with 5316876 bytes unpacked...
Incidentally, trying to load it via -kernel/-initrd leads to Configuration device id QEMU version 1 machine id 64 Probing SBus slot 0 offset 0 Probing SBus slot 1 offset 0 Probing SBus slot 2 offset 0 Probing SBus slot 3 offset 0 Probing SBus slot 15 offset 0 Invalid FCode start byte CPUs: 1 x TI,TMS390Z55 UUID: 00000000-0000-0000-0000-000000000000 Welcome to OpenBIOS v1.1 built on Dec 27 2018 19:17 Type 'help' for detailed information [sparc] Kernel already loaded switching to new context: PROMLIB: obio_ranges 1 PROMLIB: Sun Boot Prom Version 3 Revision 2 Linux version 5.7.0-rc1-00002-gcf51e129b968 (al@duke) (gcc version 6.3.0 20170516 (Debian 6.3.0-18), GNU ld (GNU Binutils for Debian) 2.28) #32 Thu May 21 18:36:07 EDT 2020 printk: bootconsole [earlyprom0] enabled ARCH: SUN4M TYPE: Sun4m SparcStation10/20 Ethernet address: 52:54:00:12:34:56 303MB HIGHMEM available. OF stdout device is: /obio/zs@0,100000:a PROM: Built device tree with 30051 bytes of memory. Booting Linux... Power off control detected. Kernel panic - not syncing: Failed to allocate memory for percpu areas. CPU: 0 PID: 0 Comm: swapper Not tainted 5.7.0-rc1-00002-gcf51e129b968 #32 [f04f92a8 : setup_per_cpu_areas+0x58/0x90 ] [f04edbf4 : start_kernel+0xc0/0x4a0 ] [f04ed43c : continue_boot+0x324/0x334 ] [00000000 : 0x0 ]
Press Stop-A (L1-A) from sun keyboard or send break twice on console to return to the boot prom ---[ end Kernel panic - not syncing: Failed to allocate memory for percpu areas. ]---
Giving guest more RAM doesn't change the outcome (well, the number HIGHMEM line is obviously higher, but that's it).
So which sparc32 kernel have you booted with defconfig and how have you done that?
Mainline, with:
qemu-system-sparc -M SS-4 -kernel arch/sparc/boot/zImage -no-reboot \ -snapshot -drive file=rootfs.ext2,format=raw,if=scsi \ -append "panic=-1 slub_debug=FZPUA root=/dev/sda console=ttyS0" -nographic -monitor none
The machine doesn't really matter, though. The root file system is built with buildroot.
Note that I carry two reverts in my qemu images.
Revert "tcx: switch to load_image_mr() and remove prom_addr hack" Revert "cg3: switch to load_image_mr() and remove prom-addr hack"
I have been carrying those since ~2017. I didn't check recently if they are still needed.
If sparc32 is no longer supported in the upstream kernel, would it possibly make sense remove its support ?
Guenter
On Thu, May 21, 2020 at 06:11:08PM -0700, Guenter Roeck wrote:
Mainline, with:
qemu-system-sparc -M SS-4 -kernel arch/sparc/boot/zImage -no-reboot \ -snapshot -drive file=rootfs.ext2,format=raw,if=scsi \ -append "panic=-1 slub_debug=FZPUA root=/dev/sda console=ttyS0" -nographic -monitor none
The machine doesn't really matter, though.
It does, unfortunately - try that with SS-10 and watch what happens ;-/
On Fri, May 22, 2020 at 02:29:50AM +0100, Al Viro wrote:
On Thu, May 21, 2020 at 06:11:08PM -0700, Guenter Roeck wrote:
Mainline, with:
qemu-system-sparc -M SS-4 -kernel arch/sparc/boot/zImage -no-reboot \ -snapshot -drive file=rootfs.ext2,format=raw,if=scsi \ -append "panic=-1 slub_debug=FZPUA root=/dev/sda console=ttyS0" -nographic -monitor none
The machine doesn't really matter, though.
It does, unfortunately - try that with SS-10 and watch what happens ;-/
Ugh... It's actually something in -m handling: -m 256 passes, -m 512 leads to that panic.
On Fri, May 22, 2020 at 02:35:23AM +0100, Al Viro wrote:
On Fri, May 22, 2020 at 02:29:50AM +0100, Al Viro wrote:
On Thu, May 21, 2020 at 06:11:08PM -0700, Guenter Roeck wrote:
Mainline, with:
qemu-system-sparc -M SS-4 -kernel arch/sparc/boot/zImage -no-reboot \ -snapshot -drive file=rootfs.ext2,format=raw,if=scsi \ -append "panic=-1 slub_debug=FZPUA root=/dev/sda console=ttyS0" -nographic -monitor none
The machine doesn't really matter, though.
It does, unfortunately - try that with SS-10 and watch what happens ;-/
Ugh... It's actually something in -m handling: -m 256 passes, -m 512 leads to that panic.
Default seems to be 128M. Anyway, see below log for SS-10.
Guenter
--- Configuration device id QEMU version 1 machine id 64 Probing SBus slot 0 offset 0 Probing SBus slot 1 offset 0 Probing SBus slot 2 offset 0 Probing SBus slot 3 offset 0 Probing SBus slot 15 offset 0 Invalid FCode start byte CPUs: 1 x TI,TMS390Z55 UUID: 00000000-0000-0000-0000-000000000000 Welcome to OpenBIOS v1.1 built on Oct 28 2019 17:08 Type 'help' for detailed information [sparc] Kernel already loaded switching to new context: PROMLIB: obio_ranges 1 PROMLIB: Sun Boot Prom Version 3 Revision 2 Linux version 5.7.0-rc6-00026-g03fb3acae4be (groeck@server.roeck-us.net) (gcc version 6.5.0 (Buildroot 2018.11-rc2-00071-g4310260), GNU ld (GNU Binutils) 2.31.1) #1 Thu May 21 19:17:48 PDT 2020 printk: bootconsole [earlyprom0] enabled ARCH: SUN4M TYPE: Sun4m SparcStation10/20 Ethernet address: 52:54:00:12:34:56 OF stdout device is: /obio/zs@0,100000:a PROM: Built device tree with 30586 bytes of memory. Booting Linux... Power off control detected. Built 1 zonelists, mobility grouping on. Total pages: 25012 Kernel command line: panic=-1 slub_debug=FZPUA root=/dev/sda console=ttyS0 Dentry cache hash table entries: 16384 (order: 4, 65536 bytes, linear) Inode-cache hash table entries: 8192 (order: 3, 32768 bytes, linear) Sorting __ex_table... mem auto-init: stack:off, heap alloc:off, heap free:off Memory: 103428K/100944K available (5050K kernel code, 178K rwdata, 1212K rodata, 176K init, 158K bss, 4294964812K reserved, 0K cma-reserved, 0K highmem) NR_IRQS: 64 Console: colour dummy device 80x25 ------------------------ | Locking API testsuite: ---------------------------------------------------------------------------- | spin |wlock |rlock |mutex | wsem | rsem | -------------------------------------------------------------------------- A-A deadlock:failed|failed| ok |failed|failed|failed|failed| A-B-B-A deadlock:failed|failed| ok |failed|failed|failed|failed| A-B-B-C-C-A deadlock:failed|failed| ok |failed|failed|failed|failed| A-B-C-A-B-C deadlock:failed|failed| ok |failed|failed|failed|failed| A-B-B-C-C-D-D-A deadlock:failed|failed| ok |failed|failed|failed|failed| A-B-C-D-B-D-D-A deadlock:failed|failed| ok |failed|failed|failed|failed| A-B-C-D-B-C-D-A deadlock:failed|failed| ok |failed|failed|failed|failed| double unlock: ok | ok |failed| ok |failed|failed| ok | initialize held:failed|failed|failed|failed|failed|failed|failed| -------------------------------------------------------------------------- recursive read-lock: | ok | |failed| recursive read-lock #2: | ok | |failed| mixed read-write-lock: |failed| |failed| mixed write-read-lock: |failed| |failed| mixed read-lock/lock-write ABBA: |failed| |failed| mixed read-lock/lock-read ABBA: | ok | |failed| mixed write-lock/lock-write ABBA: |failed| |failed| -------------------------------------------------------------------------- hard-irqs-on + irq-safe-A/12:failed|failed| ok | soft-irqs-on + irq-safe-A/12:failed|failed| ok | hard-irqs-on + irq-safe-A/21:failed|failed| ok | soft-irqs-on + irq-safe-A/21:failed|failed| ok | sirq-safe-A => hirqs-on/12:failed|failed| ok | sirq-safe-A => hirqs-on/21:failed|failed| ok | hard-safe-A + irqs-on/12:failed|failed| ok | soft-safe-A + irqs-on/12:failed|failed| ok | hard-safe-A + irqs-on/21:failed|failed| ok | soft-safe-A + irqs-on/21:failed|failed| ok | hard-safe-A + unsafe-B #1/123:failed|failed| ok | soft-safe-A + unsafe-B #1/123:failed|failed| ok | hard-safe-A + unsafe-B #1/132:failed|failed| ok | soft-safe-A + unsafe-B #1/132:failed|failed| ok | hard-safe-A + unsafe-B #1/213:failed|failed| ok | soft-safe-A + unsafe-B #1/213:failed|failed| ok | hard-safe-A + unsafe-B #1/231:failed|failed| ok | soft-safe-A + unsafe-B #1/231:failed|failed| ok | hard-safe-A + unsafe-B #1/312:failed|failed| ok | soft-safe-A + unsafe-B #1/312:failed|failed| ok | hard-safe-A + unsafe-B #1/321:failed|failed| ok | soft-safe-A + unsafe-B #1/321:failed|failed| ok | hard-safe-A + unsafe-B #2/123:failed|failed| ok | soft-safe-A + unsafe-B #2/123:failed|failed| ok | hard-safe-A + unsafe-B #2/132:failed|failed| ok | soft-safe-A + unsafe-B #2/132:failed|failed| ok | hard-safe-A + unsafe-B #2/213:failed|failed| ok | soft-safe-A + unsafe-B #2/213:failed|failed| ok | hard-safe-A + unsafe-B #2/231:failed|failed| ok | soft-safe-A + unsafe-B #2/231:failed|failed| ok | hard-safe-A + unsafe-B #2/312:failed|failed| ok | soft-safe-A + unsafe-B #2/312:failed|failed| ok | hard-safe-A + unsafe-B #2/321:failed|failed| ok | soft-safe-A + unsafe-B #2/321:failed|failed| ok | hard-irq lock-inversion/123:failed|failed| ok | soft-irq lock-inversion/123:failed|failed| ok | hard-irq lock-inversion/132:failed|failed| ok | soft-irq lock-inversion/132:failed|failed| ok | hard-irq lock-inversion/213:failed|failed| ok | soft-irq lock-inversion/213:failed|failed| ok | hard-irq lock-inversion/231:failed|failed| ok | soft-irq lock-inversion/231:failed|failed| ok | hard-irq lock-inversion/312:failed|failed| ok | soft-irq lock-inversion/312:failed|failed| ok | hard-irq lock-inversion/321:failed|failed| ok | soft-irq lock-inversion/321:failed|failed| ok | hard-irq read-recursion/123: ok | soft-irq read-recursion/123: ok | hard-irq read-recursion/132: ok | soft-irq read-recursion/132: ok | hard-irq read-recursion/213: ok | soft-irq read-recursion/213: ok | hard-irq read-recursion/231: ok | soft-irq read-recursion/231: ok | hard-irq read-recursion/312: ok | soft-irq read-recursion/312: ok | hard-irq read-recursion/321: ok | soft-irq read-recursion/321: ok | -------------------------------------------------------------------------- | Wound/wait tests | --------------------- ww api failures: ok | ok | ok | ww contexts mixing:failed| ok | finishing ww context: ok | ok | ok | ok | locking mismatches: ok | ok | ok | EDEADLK handling: ok | ok | ok | ok | ok | ok | ok | ok | ok | ok | spinlock nest unlocked:failed| ----------------------------------------------------- |block | try |context| ----------------------------------------------------- context:failed| ok | ok | try:failed| ok |failed| block:failed| ok |failed| spinlock:failed| ok |failed| -------------------------------------------------------- 164 out of 262 testcases failed, as expected. | ---------------------------------------------------- clocksource: timer_cs: mask: 0xffffffffffffffff max_cycles: 0x1d854df40, max_idle_ns: 1763180808480 ns Calibrating delay loop... 518.14 BogoMIPS (lpj=1036288) pid_max: default: 32768 minimum: 301 Mount-cache hash table entries: 1024 (order: 0, 4096 bytes, linear) Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes, linear) devtmpfs: initialized random: get_random_u32 called from bucket_table_alloc.isra.22+0x50/0x1e4 with crng_init=0 clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns futex hash table entries: 256 (order: 0, 7168 bytes, linear) NET: Registered protocol family 16 IOMMU: impl 0 vers 3 table 0x(ptrval)[262144 B] map [65536 b] vgaarb: loaded SCSI subsystem initialized clocksource: Switched to clocksource timer_cs NET: Registered protocol family 2 tcp_listen_portaddr_hash hash table entries: 256 (order: 0, 6144 bytes, linear) TCP established hash table entries: 1024 (order: 0, 4096 bytes, linear) TCP bind hash table entries: 1024 (order: 2, 20480 bytes, linear) TCP: Hash tables configured (established 1024 bind 1024) UDP hash table entries: 256 (order: 1, 12288 bytes, linear) UDP-Lite hash table entries: 256 (order: 1, 12288 bytes, linear) NET: Registered protocol family 1 RPC: Registered named UNIX socket transport module. RPC: Registered udp transport module. RPC: Registered tcp transport module. RPC: Registered tcp NFSv4.1 backchannel transport module. PCI: CLS 0 bytes, default 32 apc: power management initialized random: fast init done workingset: timestamp_bits=30 max_order=15 bucket_order=0 squashfs: version 4.0 (2009/01/31) Phillip Lougher jitterentropy: Initialization failed with host not compliant with requirements: 2 io scheduler mq-deadline registered io scheduler kyber registered String selftests succeeded test_firmware: interface ready test passed test_bitmap: loaded. test_bitmap: parselist: 14: input is '0-2047:128/256' OK, Time: 2000 test_bitmap: parselist_user: 14: input is '0-2047:128/256' OK, Time: 3000 test_bitmap: all 1663 tests passed test_uuid: all 18 tests passed crc32: CRC_LE_BITS = 64, CRC_BE BITS = 64 crc32: self tests passed, processed 225944 bytes in 450500 nsec crc32c: CRC_LE_BITS = 64 crc32c: self tests passed, processed 225944 bytes in 249000 nsec crc32_combine: 8373 self tests passed crc32c_combine: 8373 self tests passed rbtree testing -> test 1 (latency of nnodes insert+delete): 0 cycles -> test 2 (latency of nnodes cached insert+delete): 0 cycles -> test 3 (latency of inorder traversal): 0 cycles -> test 4 (latency to fetch first node) non-cached: 0 cycles cached: 0 cycles augmented rbtree testing -> test 1 (latency of nnodes insert+delete): 0 cycles -> test 2 (latency of nnodes cached insert+delete): 0 cycles interval tree insert/remove -> 0 cycles interval tree search -> 0 cycles (2692 results) ffd374f8: ttyS0 at MMIO 0xf1100000 (irq = 5, base_baud = 307200) is a zs Console: ttyS0 (SunZilog zs0) printk: console [ttyS0] enabled printk: console [ttyS0] enabled printk: bootconsole [earlyprom0] disabled printk: bootconsole [earlyprom0] disabled ffd374f8: ttyS1 at MMIO 0xf1100004 (irq = 5, base_baud = 307200) is a zs ffd37770: Keyboard at MMIO 0xf1000000 (irq = 5) is a zs ffd37770: Mouse at MMIO 0xf1000004 (irq = 5) is a zs brd: module loaded esp ffd392ec: esp0: regs[(ptrval):(ptrval)] irq[2] esp ffd392ec: esp0: is a FAS100A, 40 MHz (ccf=0), SCSI ID 7 scsi host0: esp scsi 0:0:0:0: Direct-Access QEMU QEMU HARDDISK 2.5+ PQ: 0 ANSI: 5 scsi target0:0:0: Beginning Domain Validation scsi target0:0:0: Domain Validation skipping write tests scsi target0:0:0: Ending Domain Validation scsi 0:0:2:0: CD-ROM QEMU QEMU CD-ROM 2.5+ PQ: 0 ANSI: 5 scsi target0:0:2: Beginning Domain Validation scsi target0:0:2: Domain Validation skipping write tests scsi target0:0:2: Ending Domain Validation sr 0:0:2:0: [sr0] scsi3-mmc drive: 16x/50x cd/rw xa/form2 cdda tray cdrom: Uniform CD-ROM driver Revision: 3.20 sd 0:0:0:0: [sda] 40960 512-byte logical blocks: (21.0 MB/20.0 MiB) sd 0:0:0:0: [sda] Write Protect is off sd 0:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA sd 0:0:0:0: [sda] Attached SCSI disk ioremap: done with statics, switching to malloc SunLance: using auto-carrier-detection. eth0: LANCE 52:54:00:12:34:56 rtc-m48t59 rtc-m48t59.0: IRQ index 0 not found rtc-m48t59 rtc-m48t59.0: registered as rtc0 rtc-m48t59 rtc-m48t59.0: setting system clock to 2020-05-22T02:19:50 UTC (1590113990) sdhci: Secure Digital Host Controller Interface driver sdhci: Copyright(c) Pierre Ossman NET: Registered protocol family 10 Segment Routing with IPv6 sit: IPv6, IPv4 and MPLS over IPv4 tunneling driver NET: Registered protocol family 17 TAP version 14 # Subtest: sysctl_test 1..10 ok 1 - sysctl_test_api_dointvec_null_tbl_data ok 2 - sysctl_test_api_dointvec_table_maxlen_unset ok 3 - sysctl_test_api_dointvec_table_len_is_zero ok 4 - sysctl_test_api_dointvec_table_read_but_position_set ok 5 - sysctl_test_dointvec_read_happy_single_positive ok 6 - sysctl_test_dointvec_read_happy_single_negative ok 7 - sysctl_test_dointvec_write_happy_single_positive ok 8 - sysctl_test_dointvec_write_happy_single_negative ok 9 - sysctl_test_api_dointvec_write_single_less_int_min ok 10 - sysctl_test_api_dointvec_write_single_greater_int_max ok 1 - sysctl_test # Subtest: ext4_inode_test 1..1 ok 1 - inode_test_xtimestamp_decoding ok 2 - ext4_inode_test # Subtest: kunit-try-catch-test 1..2 ok 1 - kunit_test_try_catch_successful_try_no_catch ok 2 - kunit_test_try_catch_unsuccessful_try_does_catch ok 3 - kunit-try-catch-test # Subtest: kunit-resource-test 1..5 ok 1 - kunit_resource_test_init_resources ok 2 - kunit_resource_test_alloc_resource ok 3 - kunit_resource_test_destroy_resource ok 4 - kunit_resource_test_cleanup_resources ok 5 - kunit_resource_test_proper_free_ordering ok 4 - kunit-resource-test # Subtest: kunit-log-test 1..1 put this in log. this too. add to suite log. along with this. ok 1 - kunit_log_test ok 5 - kunit-log-test # Subtest: string-stream-test 1..3 ok 1 - string_stream_test_empty_on_creation ok 2 - string_stream_test_not_empty_after_add ok 3 - string_stream_test_get_string ok 6 - string-stream-test # Subtest: list-kunit-test 1..36 ok 1 - list_test_list_init ok 2 - list_test_list_add ok 3 - list_test_list_add_tail ok 4 - list_test_list_del ok 5 - list_test_list_replace ok 6 - list_test_list_replace_init ok 7 - list_test_list_swap ok 8 - list_test_list_del_init ok 9 - list_test_list_move ok 10 - list_test_list_move_tail ok 11 - list_test_list_bulk_move_tail ok 12 - list_test_list_is_first ok 13 - list_test_list_is_last ok 14 - list_test_list_empty ok 15 - list_test_list_empty_careful ok 16 - list_test_list_rotate_left ok 17 - list_test_list_rotate_to_front ok 18 - list_test_list_is_singular ok 19 - list_test_list_cut_position ok 20 - list_test_list_cut_before ok 21 - list_test_list_splice ok 22 - list_test_list_splice_tail ok 23 - list_test_list_splice_init ok 24 - list_test_list_splice_tail_init ok 25 - list_test_list_entry ok 26 - list_test_list_first_entry ok 27 - list_test_list_last_entry ok 28 - list_test_list_first_entry_or_null ok 29 - list_test_list_next_entry ok 30 - list_test_list_prev_entry ok 31 - list_test_list_for_each ok 32 - list_test_list_for_each_prev ok 33 - list_test_list_for_each_safe ok 34 - list_test_list_for_each_prev_safe ok 35 - list_test_list_for_each_entry ok 36 - list_test_list_for_each_entry_reverse ok 7 - list-kunit-test # Subtest: qos-kunit-test 1..3 ok 1 - freq_qos_test_min ok 2 - freq_qos_test_maxdef ok 3 - freq_qos_test_readd ok 8 - qos-kunit-test EXT4-fs (sda): mounted filesystem without journal. Opts: (null) VFS: Mounted root (ext4 filesystem) readonly on device 8:0. devtmpfs: mounted Freeing unused kernel memory: 176K This architecture does not have kernel memory protection. Run /sbin/init as init process EXT4-fs (sda): re-mounted. Opts: (null) ext4 filesystem being remounted at / supports timestamps until 2038 (0x7fffffff) Starting syslogd: OK Starting klogd: OK Initializing random number generator... random: dd: uninitialized urandom read (512 bytes read) done. Starting network: OK Found console ttyS0
Linux version 5.7.0-rc6-00026-g03fb3acae4be (groeck@server.roeck-us.net) (gcc version 6.5.0 (Buildroot 2018.11-rc2-00071-g4310260), GNU ld (GNU Binutils) 2.31.1) #1 Thu May 21 19:17:48 PDT 2020 Boot successful. Rebooting Found console ttyS0 Stopping network: OK Saving random seed... random: dd: uninitialized urandom read (512 bytes read) done. Stopping klogd: OK Stopping syslogd: OK umount: devtmpfs busy - remounted read-only EXT4-fs (sda): re-mounted. Opts: (null) The system is going down NOW! Sent SIGTERM to all processes Sent SIGKILL to all processes Requesting system reboot sd 0:0:0:0: [sda] Synchronizing SCSI cache reboot: Restarting system
From: Ira Weiny ira.weiny@intel.com
We want to support kmap_atomic_prot() on all architectures and it makes sense to define kmap_atomic() to use the default kmap_prot.
So we ensure all arch's have a globally available kmap_prot either as a define or exported symbol.
Reviewed-by: Christoph Hellwig hch@lst.de Signed-off-by: Ira Weiny ira.weiny@intel.com --- arch/microblaze/include/asm/highmem.h | 2 +- arch/microblaze/mm/init.c | 3 --- arch/powerpc/include/asm/highmem.h | 2 +- arch/powerpc/mm/mem.c | 3 --- arch/sparc/mm/highmem.c | 1 + 5 files changed, 3 insertions(+), 8 deletions(-)
diff --git a/arch/microblaze/include/asm/highmem.h b/arch/microblaze/include/asm/highmem.h index c3cbda90391d..90d96239152f 100644 --- a/arch/microblaze/include/asm/highmem.h +++ b/arch/microblaze/include/asm/highmem.h @@ -25,8 +25,8 @@ #include <linux/uaccess.h> #include <asm/fixmap.h>
+#define kmap_prot PAGE_KERNEL extern pte_t *kmap_pte; -extern pgprot_t kmap_prot; extern pte_t *pkmap_page_table;
/* diff --git a/arch/microblaze/mm/init.c b/arch/microblaze/mm/init.c index 1ffbfa96b9b8..a467686c13af 100644 --- a/arch/microblaze/mm/init.c +++ b/arch/microblaze/mm/init.c @@ -49,8 +49,6 @@ unsigned long lowmem_size; #ifdef CONFIG_HIGHMEM pte_t *kmap_pte; EXPORT_SYMBOL(kmap_pte); -pgprot_t kmap_prot; -EXPORT_SYMBOL(kmap_prot);
static inline pte_t *virt_to_kpte(unsigned long vaddr) { @@ -68,7 +66,6 @@ static void __init highmem_init(void) pkmap_page_table = virt_to_kpte(PKMAP_BASE);
kmap_pte = virt_to_kpte(__fix_to_virt(FIX_KMAP_BEGIN)); - kmap_prot = PAGE_KERNEL; }
static void highmem_setup(void) diff --git a/arch/powerpc/include/asm/highmem.h b/arch/powerpc/include/asm/highmem.h index 373a470df205..ee5de974c5ef 100644 --- a/arch/powerpc/include/asm/highmem.h +++ b/arch/powerpc/include/asm/highmem.h @@ -29,8 +29,8 @@ #include <asm/page.h> #include <asm/fixmap.h>
+#define kmap_prot PAGE_KERNEL extern pte_t *kmap_pte; -extern pgprot_t kmap_prot; extern pte_t *pkmap_page_table;
/* diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c index 041ed7cfd341..3f642b058731 100644 --- a/arch/powerpc/mm/mem.c +++ b/arch/powerpc/mm/mem.c @@ -64,8 +64,6 @@ bool init_mem_is_free; #ifdef CONFIG_HIGHMEM pte_t *kmap_pte; EXPORT_SYMBOL(kmap_pte); -pgprot_t kmap_prot; -EXPORT_SYMBOL(kmap_prot); #endif
pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn, @@ -245,7 +243,6 @@ void __init paging_init(void) pkmap_page_table = virt_to_kpte(PKMAP_BASE);
kmap_pte = virt_to_kpte(__fix_to_virt(FIX_KMAP_BEGIN)); - kmap_prot = PAGE_KERNEL; #endif /* CONFIG_HIGHMEM */
printk(KERN_DEBUG "Top of RAM: 0x%llx, Total RAM: 0x%llx\n", diff --git a/arch/sparc/mm/highmem.c b/arch/sparc/mm/highmem.c index 469786bc430f..9f06d75e88e1 100644 --- a/arch/sparc/mm/highmem.c +++ b/arch/sparc/mm/highmem.c @@ -33,6 +33,7 @@ #include <asm/vaddrs.h>
pgprot_t kmap_prot; +EXPORT_SYMBOL(kmap_prot);
static pte_t *kmap_pte;
From: Ira Weiny ira.weiny@intel.com
To support kmap_atomic_prot() on all architectures each arch must support protections passed in to them.
Change csky, mips, nds32 and xtensa to use their global constant kmap_prot rather than a hard coded value which was equal.
Reviewed-by: Christoph Hellwig hch@lst.de Signed-off-by: Ira Weiny ira.weiny@intel.com
--- changes from V1: Mention that kmap_prot is a constant in commit message --- arch/csky/mm/highmem.c | 2 +- arch/mips/mm/highmem.c | 2 +- arch/nds32/mm/highmem.c | 2 +- arch/xtensa/mm/highmem.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/arch/csky/mm/highmem.c b/arch/csky/mm/highmem.c index 0aafbbbe651c..f4311669b5bb 100644 --- a/arch/csky/mm/highmem.c +++ b/arch/csky/mm/highmem.c @@ -32,7 +32,7 @@ void *kmap_atomic_high(struct page *page) #ifdef CONFIG_DEBUG_HIGHMEM BUG_ON(!pte_none(*(kmap_pte - idx))); #endif - set_pte(kmap_pte-idx, mk_pte(page, PAGE_KERNEL)); + set_pte(kmap_pte-idx, mk_pte(page, kmap_prot)); flush_tlb_one((unsigned long)vaddr);
return (void *)vaddr; diff --git a/arch/mips/mm/highmem.c b/arch/mips/mm/highmem.c index 155fbb107b35..87023bd1a33c 100644 --- a/arch/mips/mm/highmem.c +++ b/arch/mips/mm/highmem.c @@ -29,7 +29,7 @@ void *kmap_atomic_high(struct page *page) #ifdef CONFIG_DEBUG_HIGHMEM BUG_ON(!pte_none(*(kmap_pte - idx))); #endif - set_pte(kmap_pte-idx, mk_pte(page, PAGE_KERNEL)); + set_pte(kmap_pte-idx, mk_pte(page, kmap_prot)); local_flush_tlb_one((unsigned long)vaddr);
return (void*) vaddr; diff --git a/arch/nds32/mm/highmem.c b/arch/nds32/mm/highmem.c index f6e6915c0d31..809f8c830f06 100644 --- a/arch/nds32/mm/highmem.c +++ b/arch/nds32/mm/highmem.c @@ -21,7 +21,7 @@ void *kmap_atomic_high(struct page *page)
idx = type + KM_TYPE_NR * smp_processor_id(); vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); - pte = (page_to_pfn(page) << PAGE_SHIFT) | (PAGE_KERNEL); + pte = (page_to_pfn(page) << PAGE_SHIFT) | (kmap_prot); ptep = pte_offset_kernel(pmd_off_k(vaddr), vaddr); set_pte(ptep, pte);
diff --git a/arch/xtensa/mm/highmem.c b/arch/xtensa/mm/highmem.c index 4de323e43682..50168b09510a 100644 --- a/arch/xtensa/mm/highmem.c +++ b/arch/xtensa/mm/highmem.c @@ -48,7 +48,7 @@ void *kmap_atomic_high(struct page *page) #ifdef CONFIG_DEBUG_HIGHMEM BUG_ON(!pte_none(*(kmap_pte + idx))); #endif - set_pte(kmap_pte + idx, mk_pte(page, PAGE_KERNEL_EXEC)); + set_pte(kmap_pte + idx, mk_pte(page, kmap_prot));
return (void *)vaddr; }
From: Ira Weiny ira.weiny@intel.com
To support kmap_atomic_prot(), all architectures need to support protections passed to their kmap_atomic_high() function. Pass protections into kmap_atomic_high() and change the name to kmap_atomic_high_prot() to match.
Then define kmap_atomic_prot() as a core function which calls kmap_atomic_high_prot() when needed.
Finally, redefine kmap_atomic() as a wrapper of kmap_atomic_prot() with the default kmap_prot exported by the architectures.
Reviewed-by: Christoph Hellwig hch@lst.de Signed-off-by: Ira Weiny ira.weiny@intel.com
--- Changes from V1: Adjust for bisect-ability Adjust for removing kunmap_atomic_high Remove kmap_atomic_high_prot declarations --- arch/arc/mm/highmem.c | 6 +++--- arch/arm/mm/highmem.c | 6 +++--- arch/csky/mm/highmem.c | 6 +++--- arch/microblaze/include/asm/highmem.h | 16 ---------------- arch/mips/mm/highmem.c | 6 +++--- arch/nds32/mm/highmem.c | 6 +++--- arch/powerpc/include/asm/highmem.h | 17 ----------------- arch/sparc/mm/highmem.c | 6 +++--- arch/x86/include/asm/highmem.h | 14 -------------- arch/xtensa/mm/highmem.c | 6 +++--- include/linux/highmem.h | 7 ++++--- 11 files changed, 25 insertions(+), 71 deletions(-)
diff --git a/arch/arc/mm/highmem.c b/arch/arc/mm/highmem.c index 5d3eab4ac0b0..479b0d72d3cf 100644 --- a/arch/arc/mm/highmem.c +++ b/arch/arc/mm/highmem.c @@ -49,7 +49,7 @@ extern pte_t * pkmap_page_table; static pte_t * fixmap_page_table;
-void *kmap_atomic_high(struct page *page) +void *kmap_atomic_high_prot(struct page *page, pgprot_t prot) { int idx, cpu_idx; unsigned long vaddr; @@ -59,11 +59,11 @@ void *kmap_atomic_high(struct page *page) vaddr = FIXMAP_ADDR(idx);
set_pte_at(&init_mm, vaddr, fixmap_page_table + idx, - mk_pte(page, kmap_prot)); + mk_pte(page, prot));
return (void *)vaddr; } -EXPORT_SYMBOL(kmap_atomic_high); +EXPORT_SYMBOL(kmap_atomic_high_prot);
void kunmap_atomic_high(void *kv) { diff --git a/arch/arm/mm/highmem.c b/arch/arm/mm/highmem.c index ac8394655a6e..e013f6b81328 100644 --- a/arch/arm/mm/highmem.c +++ b/arch/arm/mm/highmem.c @@ -31,7 +31,7 @@ static inline pte_t get_fixmap_pte(unsigned long vaddr) return *ptep; }
-void *kmap_atomic_high(struct page *page) +void *kmap_atomic_high_prot(struct page *page, pgprot_t prot) { unsigned int idx; unsigned long vaddr; @@ -67,11 +67,11 @@ void *kmap_atomic_high(struct page *page) * in place, so the contained TLB flush ensures the TLB is updated * with the new mapping. */ - set_fixmap_pte(idx, mk_pte(page, kmap_prot)); + set_fixmap_pte(idx, mk_pte(page, prot));
return (void *)vaddr; } -EXPORT_SYMBOL(kmap_atomic_high); +EXPORT_SYMBOL(kmap_atomic_high_prot);
void kunmap_atomic_high(void *kvaddr) { diff --git a/arch/csky/mm/highmem.c b/arch/csky/mm/highmem.c index f4311669b5bb..3ae5c8cd7619 100644 --- a/arch/csky/mm/highmem.c +++ b/arch/csky/mm/highmem.c @@ -21,7 +21,7 @@ EXPORT_SYMBOL(kmap_flush_tlb);
EXPORT_SYMBOL(kmap);
-void *kmap_atomic_high(struct page *page) +void *kmap_atomic_high_prot(struct page *page, pgprot_t prot) { unsigned long vaddr; int idx, type; @@ -32,12 +32,12 @@ void *kmap_atomic_high(struct page *page) #ifdef CONFIG_DEBUG_HIGHMEM BUG_ON(!pte_none(*(kmap_pte - idx))); #endif - set_pte(kmap_pte-idx, mk_pte(page, kmap_prot)); + set_pte(kmap_pte-idx, mk_pte(page, prot)); flush_tlb_one((unsigned long)vaddr);
return (void *)vaddr; } -EXPORT_SYMBOL(kmap_atomic_high); +EXPORT_SYMBOL(kmap_atomic_high_prot);
void kunmap_atomic_high(void *kvaddr) { diff --git a/arch/microblaze/include/asm/highmem.h b/arch/microblaze/include/asm/highmem.h index 90d96239152f..d7c55cfd27bd 100644 --- a/arch/microblaze/include/asm/highmem.h +++ b/arch/microblaze/include/asm/highmem.h @@ -51,22 +51,6 @@ extern pte_t *pkmap_page_table; #define PKMAP_NR(virt) ((virt - PKMAP_BASE) >> PAGE_SHIFT) #define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT))
-extern void *kmap_atomic_high_prot(struct page *page, pgprot_t prot); -static inline void *kmap_atomic_prot(struct page *page, pgprot_t prot) -{ - preempt_disable(); - pagefault_disable(); - if (!PageHighMem(page)) - return page_address(page); - - return kmap_atomic_high_prot(page, prot); -} - -static inline void *kmap_atomic_high(struct page *page) -{ - return kmap_atomic_high_prot(page, kmap_prot); -} - #define flush_cache_kmaps() { flush_icache(); flush_dcache(); }
#endif /* __KERNEL__ */ diff --git a/arch/mips/mm/highmem.c b/arch/mips/mm/highmem.c index 87023bd1a33c..37e244cdb14e 100644 --- a/arch/mips/mm/highmem.c +++ b/arch/mips/mm/highmem.c @@ -18,7 +18,7 @@ void kmap_flush_tlb(unsigned long addr) } EXPORT_SYMBOL(kmap_flush_tlb);
-void *kmap_atomic_high(struct page *page) +void *kmap_atomic_high_prot(struct page *page, pgprot_t prot) { unsigned long vaddr; int idx, type; @@ -29,12 +29,12 @@ void *kmap_atomic_high(struct page *page) #ifdef CONFIG_DEBUG_HIGHMEM BUG_ON(!pte_none(*(kmap_pte - idx))); #endif - set_pte(kmap_pte-idx, mk_pte(page, kmap_prot)); + set_pte(kmap_pte-idx, mk_pte(page, prot)); local_flush_tlb_one((unsigned long)vaddr);
return (void*) vaddr; } -EXPORT_SYMBOL(kmap_atomic_high); +EXPORT_SYMBOL(kmap_atomic_high_prot);
void kunmap_atomic_high(void *kvaddr) { diff --git a/arch/nds32/mm/highmem.c b/arch/nds32/mm/highmem.c index 809f8c830f06..63ded527c1e8 100644 --- a/arch/nds32/mm/highmem.c +++ b/arch/nds32/mm/highmem.c @@ -10,7 +10,7 @@ #include <asm/fixmap.h> #include <asm/tlbflush.h>
-void *kmap_atomic_high(struct page *page) +void *kmap_atomic_high_prot(struct page *page, pgprot_t prot) { unsigned int idx; unsigned long vaddr, pte; @@ -21,7 +21,7 @@ void *kmap_atomic_high(struct page *page)
idx = type + KM_TYPE_NR * smp_processor_id(); vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); - pte = (page_to_pfn(page) << PAGE_SHIFT) | (kmap_prot); + pte = (page_to_pfn(page) << PAGE_SHIFT) | prot; ptep = pte_offset_kernel(pmd_off_k(vaddr), vaddr); set_pte(ptep, pte);
@@ -32,7 +32,7 @@ void *kmap_atomic_high(struct page *page) return (void *)vaddr; }
-EXPORT_SYMBOL(kmap_atomic_high); +EXPORT_SYMBOL(kmap_atomic_high_prot);
void kunmap_atomic_high(void *kvaddr) { diff --git a/arch/powerpc/include/asm/highmem.h b/arch/powerpc/include/asm/highmem.h index ee5de974c5ef..8d8ee3fcd800 100644 --- a/arch/powerpc/include/asm/highmem.h +++ b/arch/powerpc/include/asm/highmem.h @@ -59,23 +59,6 @@ extern pte_t *pkmap_page_table; #define PKMAP_NR(virt) ((virt-PKMAP_BASE) >> PAGE_SHIFT) #define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT))
-extern void *kmap_atomic_high_prot(struct page *page, pgprot_t prot); -static inline void *kmap_atomic_prot(struct page *page, pgprot_t prot) -{ - preempt_disable(); - pagefault_disable(); - if (!PageHighMem(page)) - return page_address(page); - - return kmap_atomic_high_prot(page, prot); -} - -static inline void *kmap_atomic_high(struct page *page) -{ - return kmap_atomic_high_prot(page, kmap_prot); -} - - #define flush_cache_kmaps() flush_cache_all()
#endif /* __KERNEL__ */ diff --git a/arch/sparc/mm/highmem.c b/arch/sparc/mm/highmem.c index 9f06d75e88e1..414f578d1e57 100644 --- a/arch/sparc/mm/highmem.c +++ b/arch/sparc/mm/highmem.c @@ -54,7 +54,7 @@ void __init kmap_init(void) kmap_prot = __pgprot(SRMMU_ET_PTE | SRMMU_PRIV | SRMMU_CACHE); }
-void *kmap_atomic_high(struct page *page) +void *kmap_atomic_high_prot(struct page *page, pgprot_t prot) { unsigned long vaddr; long idx, type; @@ -73,7 +73,7 @@ void *kmap_atomic_high(struct page *page) #ifdef CONFIG_DEBUG_HIGHMEM BUG_ON(!pte_none(*(kmap_pte-idx))); #endif - set_pte(kmap_pte-idx, mk_pte(page, kmap_prot)); + set_pte(kmap_pte-idx, mk_pte(page, prot)); /* XXX Fix - Anton */ #if 0 __flush_tlb_one(vaddr); @@ -83,7 +83,7 @@ void *kmap_atomic_high(struct page *page)
return (void*) vaddr; } -EXPORT_SYMBOL(kmap_atomic_high); +EXPORT_SYMBOL(kmap_atomic_high_prot);
void kunmap_atomic_high(void *kvaddr) { diff --git a/arch/x86/include/asm/highmem.h b/arch/x86/include/asm/highmem.h index be66b77885a0..0f420b24e0fc 100644 --- a/arch/x86/include/asm/highmem.h +++ b/arch/x86/include/asm/highmem.h @@ -58,20 +58,6 @@ extern unsigned long highstart_pfn, highend_pfn; #define PKMAP_NR(virt) ((virt-PKMAP_BASE) >> PAGE_SHIFT) #define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT))
-extern void *kmap_atomic_high_prot(struct page *page, pgprot_t prot); -static inline void *kmap_atomic_prot(struct page *page, pgprot_t prot) -{ - preempt_disable(); - pagefault_disable(); - if (!PageHighMem(page)) - return page_address(page); - - return kmap_atomic_high_prot(page, prot); -} -static inline void *kmap_atomic_high(struct page *page) -{ - return kmap_atomic_high_prot(page, kmap_prot); -} void *kmap_atomic_pfn(unsigned long pfn); void *kmap_atomic_prot_pfn(unsigned long pfn, pgprot_t prot);
diff --git a/arch/xtensa/mm/highmem.c b/arch/xtensa/mm/highmem.c index 50168b09510a..99b5ad137ab5 100644 --- a/arch/xtensa/mm/highmem.c +++ b/arch/xtensa/mm/highmem.c @@ -37,7 +37,7 @@ static inline enum fixed_addresses kmap_idx(int type, unsigned long color) color; }
-void *kmap_atomic_high(struct page *page) +void *kmap_atomic_high_prot(struct page *page, pgprot_t prot) { enum fixed_addresses idx; unsigned long vaddr; @@ -48,11 +48,11 @@ void *kmap_atomic_high(struct page *page) #ifdef CONFIG_DEBUG_HIGHMEM BUG_ON(!pte_none(*(kmap_pte + idx))); #endif - set_pte(kmap_pte + idx, mk_pte(page, kmap_prot)); + set_pte(kmap_pte + idx, mk_pte(page, prot));
return (void *)vaddr; } -EXPORT_SYMBOL(kmap_atomic_high); +EXPORT_SYMBOL(kmap_atomic_high_prot);
void kunmap_atomic_high(void *kvaddr) { diff --git a/include/linux/highmem.h b/include/linux/highmem.h index c36c0ee09423..89838306f50d 100644 --- a/include/linux/highmem.h +++ b/include/linux/highmem.h @@ -32,7 +32,7 @@ static inline void invalidate_kernel_vmap_range(void *vaddr, int size) #include <asm/kmap_types.h>
#ifdef CONFIG_HIGHMEM -extern void *kmap_atomic_high(struct page *page); +extern void *kmap_atomic_high_prot(struct page *page, pgprot_t prot); extern void kunmap_atomic_high(void *kvaddr); #include <asm/highmem.h>
@@ -76,14 +76,15 @@ static inline void kunmap(struct page *page) * be used in IRQ contexts, so in some (very limited) cases we need * it. */ -static inline void *kmap_atomic(struct page *page) +static inline void *kmap_atomic_prot(struct page *page, pgprot_t prot) { preempt_disable(); pagefault_disable(); if (!PageHighMem(page)) return page_address(page); - return kmap_atomic_high(page); + return kmap_atomic_high_prot(page, prot); } +#define kmap_atomic(page) kmap_atomic_prot(page, kmap_prot)
/* declarations for linux/mm/highmem.c */ unsigned int nr_free_highpages(void);
Hi,
On Thu, May 07, 2020 at 07:59:58AM -0700, ira.weiny@intel.com wrote:
From: Ira Weiny ira.weiny@intel.com
To support kmap_atomic_prot(), all architectures need to support protections passed to their kmap_atomic_high() function. Pass protections into kmap_atomic_high() and change the name to kmap_atomic_high_prot() to match.
Then define kmap_atomic_prot() as a core function which calls kmap_atomic_high_prot() when needed.
Finally, redefine kmap_atomic() as a wrapper of kmap_atomic_prot() with the default kmap_prot exported by the architectures.
Reviewed-by: Christoph Hellwig hch@lst.de Signed-off-by: Ira Weiny ira.weiny@intel.com
This patch causes a variety of crashes whem booting powerpc images in qemu.
There are lots of warnings such as:
WARNING: CPU: 0 PID: 0 at lib/locking-selftest.c:743 irqsafe1_hard_spin_12+0x50/0xb0 Modules linked in: CPU: 0 PID: 0 Comm: swapper Tainted: G W 5.7.0-rc5-next-20200515 #1 NIP: c0660c7c LR: c0660c44 CTR: c0660c2c REGS: c1223e68 TRAP: 0700 Tainted: G W (5.7.0-rc5-next-20200515) MSR: 00021000 <CE,ME> CR: 28000224 XER: 20000000
GPR00: c0669c78 c1223f20 c113d560 c0660c44 00000000 00000001 c1223ea8 00000001 GPR08: 00000000 00000001 0000fffc ffffffff 88000222 00000000 00000000 00000000 GPR16: 00000000 00000000 00000000 00000000 c0000000 00000000 00000000 c1125084 GPR24: c1125084 c1230000 c1879538 fffffffc 00000001 00000000 c1011afc c1230000 NIP [c0660c7c] irqsafe1_hard_spin_12+0x50/0xb0 LR [c0660c44] irqsafe1_hard_spin_12+0x18/0xb0 Call Trace: [c1223f20] [c1880000] megasas_mgmt_info+0xee4/0x1008 (unreliable) [c1223f40] [c0669c78] dotest+0x38/0x550 [c1223f70] [c066aa4c] locking_selftest+0x8bc/0x1d54 [c1223fa0] [c10e0bc8] start_kernel+0x3ec/0x510 [c1223ff0] [c00003a0] set_ivor+0x118/0x154 Instruction dump: 81420000 38e80001 3d4a0001 2c080000 91420000 90e20488 40820008 91020470 81290000 5529031e 7d290034 5529d97e <0f090000> 3fe0c11c 3bff3964 3bff00ac irq event stamp: 588 hardirqs last enabled at (587): [<c00b9fe4>] vprintk_emit+0x1b4/0x33c hardirqs last disabled at (588): [<c0660c44>] irqsafe1_hard_spin_12+0x18/0xb0 softirqs last enabled at (0): [<00000000>] 0x0 softirqs last disabled at (0): [<00000000>] 0x0 ---[ end trace b18fe9e172f99d03 ]---
This is followed by:
BUG: sleeping function called from invalid context at lib/mpi/mpi-pow.c:245 in_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 14, name: cryptomgr_test INFO: lockdep is turned off. CPU: 0 PID: 14 Comm: cryptomgr_test Tainted: G W 5.7.0-rc5-next-20200515 #1 Call Trace: [ce221b58] [c008755c] ___might_sleep+0x280/0x2a8 (unreliable) [ce221b78] [c06bc524] mpi_powm+0x634/0xc50 [ce221c38] [c05eafdc] rsa_dec+0x88/0x134 [ce221c78] [c05f3b40] test_akcipher_one+0x678/0x804 [ce221dc8] [c05f3d7c] alg_test_akcipher+0xb0/0x130 [ce221df8] [c05ee674] alg_test.part.0+0xb4/0x458 [ce221ed8] [c05ed2b0] cryptomgr_test+0x30/0x50 [ce221ef8] [c007cd74] kthread+0x134/0x170 [ce221f38] [c001433c] ret_from_kernel_thread+0x14/0x1c Kernel panic - not syncing: Aiee, killing interrupt handler! CPU: 0 PID: 14 Comm: cryptomgr_test Tainted: G W 5.7.0-rc5-next-20200515 #1 Call Trace: [ce221e08] [c00530fc] panic+0x148/0x34c (unreliable) [ce221e68] [c0056460] do_exit+0xac0/0xb40 [ce221eb8] [c00f5be8] find_kallsyms_symbol_value+0x0/0x128 [ce221ed8] [c05ed2d0] crypto_alg_put+0x0/0x70 [ce221ef8] [c007cd74] kthread+0x134/0x170 [ce221f38] [c001433c] ret_from_kernel_thread+0x14/0x1c
Bisect log is attached. The patch can not easily be reverted since it results in compile errors.
Note that similar failures are seen with sparc32 images. Those bisect to a different patch, but reverting that patch doesn't fix the problem. The failure pattern (warnings followed by a crash in cryptomgr_test) is the same.
Guenter
--- # bad: [bdecf38f228bcca73b31ada98b5b7ba1215eb9c9] Add linux-next specific files for 20200515 # good: [2ef96a5bb12be62ef75b5828c0aab838ebb29cb8] Linux 5.7-rc5 git bisect start 'HEAD' 'v5.7-rc5' # good: [3674d7aa7a8e61d993886c2fb7c896c5ef85e988] Merge remote-tracking branch 'crypto/master' git bisect good 3674d7aa7a8e61d993886c2fb7c896c5ef85e988 # good: [87f6f21783522e6d62127cf33ae5e95f50874beb] Merge remote-tracking branch 'spi/for-next' git bisect good 87f6f21783522e6d62127cf33ae5e95f50874beb # good: [5c428e8277d5d97c85126387d4e00aa5adde4400] Merge remote-tracking branch 'staging/staging-next' git bisect good 5c428e8277d5d97c85126387d4e00aa5adde4400 # good: [f68de67ed934e7bdef4799fd7777c86f33f14982] Merge remote-tracking branch 'hyperv/hyperv-next' git bisect good f68de67ed934e7bdef4799fd7777c86f33f14982 # bad: [54acd2dc52b069da59639eea0d0c92726f32fb01] mm/memblock: fix a typo in comment "implict"->"implicit" git bisect bad 54acd2dc52b069da59639eea0d0c92726f32fb01 # good: [784a17aa58a529b84f7cc50f351ed4acf3bd11f3] mm: remove the pgprot argument to __vmalloc git bisect good 784a17aa58a529b84f7cc50f351ed4acf3bd11f3 # good: [6cd8137ff37e9a37aee2d2a8889c8beb8eab192f] khugepaged: replace the usage of system(3) in the test git bisect good 6cd8137ff37e9a37aee2d2a8889c8beb8eab192f # bad: [6987da379826ed01b8a1cf046b67cc8cc10117cc] sparc: remove unnecessary includes git bisect bad 6987da379826ed01b8a1cf046b67cc8cc10117cc # good: [bc17b545388f64c09e83e367898e28f60277c584] mm/hugetlb: define a generic fallback for is_hugepage_only_range() git bisect good bc17b545388f64c09e83e367898e28f60277c584 # good: [9b5aa5b43f957f03a1f4a9aff5f7924e2ebbc011] arch-kmap_atomic-consolidate-duplicate-code-checkpatch-fixes git bisect good 9b5aa5b43f957f03a1f4a9aff5f7924e2ebbc011 # bad: [89194ba5ee31567eeee9c81101b334c8e3248198] arch/kmap: define kmap_atomic_prot() for all arch's git bisect bad 89194ba5ee31567eeee9c81101b334c8e3248198 # good: [022785d2bea99f8bc2a37b7b6c525eea26f6ac59] arch-kunmap_atomic-consolidate-duplicate-code-checkpatch-fixes git bisect good 022785d2bea99f8bc2a37b7b6c525eea26f6ac59 # good: [a13c2f39e3f0519ddee57d26cc66ec70e3546106] arch/kmap: don't hard code kmap_prot values git bisect good a13c2f39e3f0519ddee57d26cc66ec70e3546106 # first bad commit: [89194ba5ee31567eeee9c81101b334c8e3248198] arch/kmap: define kmap_atomic_prot() for all arch's
On Sun, May 17, 2020 at 10:37:22AM -0700, Guenter Roeck wrote:
Hi,
On Thu, May 07, 2020 at 07:59:58AM -0700, ira.weiny@intel.com wrote:
From: Ira Weiny ira.weiny@intel.com
To support kmap_atomic_prot(), all architectures need to support protections passed to their kmap_atomic_high() function. Pass protections into kmap_atomic_high() and change the name to kmap_atomic_high_prot() to match.
Then define kmap_atomic_prot() as a core function which calls kmap_atomic_high_prot() when needed.
Finally, redefine kmap_atomic() as a wrapper of kmap_atomic_prot() with the default kmap_prot exported by the architectures.
Reviewed-by: Christoph Hellwig hch@lst.de Signed-off-by: Ira Weiny ira.weiny@intel.com
This patch causes a variety of crashes whem booting powerpc images in qemu.
PowerPC has the same issue as microblaze and sparc.
I'm preping a patch with all three fixed which fixes the kunmap_atomic clean up patch...
Sorry for not seeing this last night...
Hopefully this can explain all the problems. It is clearly a bug.
Ira
There are lots of warnings such as:
WARNING: CPU: 0 PID: 0 at lib/locking-selftest.c:743 irqsafe1_hard_spin_12+0x50/0xb0 Modules linked in: CPU: 0 PID: 0 Comm: swapper Tainted: G W 5.7.0-rc5-next-20200515 #1 NIP: c0660c7c LR: c0660c44 CTR: c0660c2c REGS: c1223e68 TRAP: 0700 Tainted: G W (5.7.0-rc5-next-20200515) MSR: 00021000 <CE,ME> CR: 28000224 XER: 20000000
GPR00: c0669c78 c1223f20 c113d560 c0660c44 00000000 00000001 c1223ea8 00000001 GPR08: 00000000 00000001 0000fffc ffffffff 88000222 00000000 00000000 00000000 GPR16: 00000000 00000000 00000000 00000000 c0000000 00000000 00000000 c1125084 GPR24: c1125084 c1230000 c1879538 fffffffc 00000001 00000000 c1011afc c1230000 NIP [c0660c7c] irqsafe1_hard_spin_12+0x50/0xb0 LR [c0660c44] irqsafe1_hard_spin_12+0x18/0xb0 Call Trace: [c1223f20] [c1880000] megasas_mgmt_info+0xee4/0x1008 (unreliable) [c1223f40] [c0669c78] dotest+0x38/0x550 [c1223f70] [c066aa4c] locking_selftest+0x8bc/0x1d54 [c1223fa0] [c10e0bc8] start_kernel+0x3ec/0x510 [c1223ff0] [c00003a0] set_ivor+0x118/0x154 Instruction dump: 81420000 38e80001 3d4a0001 2c080000 91420000 90e20488 40820008 91020470 81290000 5529031e 7d290034 5529d97e <0f090000> 3fe0c11c 3bff3964 3bff00ac irq event stamp: 588 hardirqs last enabled at (587): [<c00b9fe4>] vprintk_emit+0x1b4/0x33c hardirqs last disabled at (588): [<c0660c44>] irqsafe1_hard_spin_12+0x18/0xb0 softirqs last enabled at (0): [<00000000>] 0x0 softirqs last disabled at (0): [<00000000>] 0x0 ---[ end trace b18fe9e172f99d03 ]---
This is followed by:
BUG: sleeping function called from invalid context at lib/mpi/mpi-pow.c:245 in_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 14, name: cryptomgr_test INFO: lockdep is turned off. CPU: 0 PID: 14 Comm: cryptomgr_test Tainted: G W 5.7.0-rc5-next-20200515 #1 Call Trace: [ce221b58] [c008755c] ___might_sleep+0x280/0x2a8 (unreliable) [ce221b78] [c06bc524] mpi_powm+0x634/0xc50 [ce221c38] [c05eafdc] rsa_dec+0x88/0x134 [ce221c78] [c05f3b40] test_akcipher_one+0x678/0x804 [ce221dc8] [c05f3d7c] alg_test_akcipher+0xb0/0x130 [ce221df8] [c05ee674] alg_test.part.0+0xb4/0x458 [ce221ed8] [c05ed2b0] cryptomgr_test+0x30/0x50 [ce221ef8] [c007cd74] kthread+0x134/0x170 [ce221f38] [c001433c] ret_from_kernel_thread+0x14/0x1c Kernel panic - not syncing: Aiee, killing interrupt handler! CPU: 0 PID: 14 Comm: cryptomgr_test Tainted: G W 5.7.0-rc5-next-20200515 #1 Call Trace: [ce221e08] [c00530fc] panic+0x148/0x34c (unreliable) [ce221e68] [c0056460] do_exit+0xac0/0xb40 [ce221eb8] [c00f5be8] find_kallsyms_symbol_value+0x0/0x128 [ce221ed8] [c05ed2d0] crypto_alg_put+0x0/0x70 [ce221ef8] [c007cd74] kthread+0x134/0x170 [ce221f38] [c001433c] ret_from_kernel_thread+0x14/0x1c
Bisect log is attached. The patch can not easily be reverted since it results in compile errors.
Note that similar failures are seen with sparc32 images. Those bisect to a different patch, but reverting that patch doesn't fix the problem. The failure pattern (warnings followed by a crash in cryptomgr_test) is the same.
Guenter
# bad: [bdecf38f228bcca73b31ada98b5b7ba1215eb9c9] Add linux-next specific files for 20200515 # good: [2ef96a5bb12be62ef75b5828c0aab838ebb29cb8] Linux 5.7-rc5 git bisect start 'HEAD' 'v5.7-rc5' # good: [3674d7aa7a8e61d993886c2fb7c896c5ef85e988] Merge remote-tracking branch 'crypto/master' git bisect good 3674d7aa7a8e61d993886c2fb7c896c5ef85e988 # good: [87f6f21783522e6d62127cf33ae5e95f50874beb] Merge remote-tracking branch 'spi/for-next' git bisect good 87f6f21783522e6d62127cf33ae5e95f50874beb # good: [5c428e8277d5d97c85126387d4e00aa5adde4400] Merge remote-tracking branch 'staging/staging-next' git bisect good 5c428e8277d5d97c85126387d4e00aa5adde4400 # good: [f68de67ed934e7bdef4799fd7777c86f33f14982] Merge remote-tracking branch 'hyperv/hyperv-next' git bisect good f68de67ed934e7bdef4799fd7777c86f33f14982 # bad: [54acd2dc52b069da59639eea0d0c92726f32fb01] mm/memblock: fix a typo in comment "implict"->"implicit" git bisect bad 54acd2dc52b069da59639eea0d0c92726f32fb01 # good: [784a17aa58a529b84f7cc50f351ed4acf3bd11f3] mm: remove the pgprot argument to __vmalloc git bisect good 784a17aa58a529b84f7cc50f351ed4acf3bd11f3 # good: [6cd8137ff37e9a37aee2d2a8889c8beb8eab192f] khugepaged: replace the usage of system(3) in the test git bisect good 6cd8137ff37e9a37aee2d2a8889c8beb8eab192f # bad: [6987da379826ed01b8a1cf046b67cc8cc10117cc] sparc: remove unnecessary includes git bisect bad 6987da379826ed01b8a1cf046b67cc8cc10117cc # good: [bc17b545388f64c09e83e367898e28f60277c584] mm/hugetlb: define a generic fallback for is_hugepage_only_range() git bisect good bc17b545388f64c09e83e367898e28f60277c584 # good: [9b5aa5b43f957f03a1f4a9aff5f7924e2ebbc011] arch-kmap_atomic-consolidate-duplicate-code-checkpatch-fixes git bisect good 9b5aa5b43f957f03a1f4a9aff5f7924e2ebbc011 # bad: [89194ba5ee31567eeee9c81101b334c8e3248198] arch/kmap: define kmap_atomic_prot() for all arch's git bisect bad 89194ba5ee31567eeee9c81101b334c8e3248198 # good: [022785d2bea99f8bc2a37b7b6c525eea26f6ac59] arch-kunmap_atomic-consolidate-duplicate-code-checkpatch-fixes git bisect good 022785d2bea99f8bc2a37b7b6c525eea26f6ac59 # good: [a13c2f39e3f0519ddee57d26cc66ec70e3546106] arch/kmap: don't hard code kmap_prot values git bisect good a13c2f39e3f0519ddee57d26cc66ec70e3546106 # first bad commit: [89194ba5ee31567eeee9c81101b334c8e3248198] arch/kmap: define kmap_atomic_prot() for all arch's
From: Ira Weiny ira.weiny@intel.com
kmap_atomic_prot() is now exported by all architectures. Use this function rather than open coding a driver specific kmap_atomic.
Acked-by: Daniel Vetter daniel.vetter@ffwll.ch Reviewed-by: Christian König christian.koenig@amd.com Reviewed-by: Christoph Hellwig hch@lst.de Signed-off-by: Ira Weiny ira.weiny@intel.com --- drivers/gpu/drm/ttm/ttm_bo_util.c | 56 ++-------------------------- drivers/gpu/drm/vmwgfx/vmwgfx_blit.c | 16 ++++---- include/drm/ttm/ttm_bo_api.h | 4 -- 3 files changed, 12 insertions(+), 64 deletions(-)
diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c index 52d2b71f1588..f09b096ba4fd 100644 --- a/drivers/gpu/drm/ttm/ttm_bo_util.c +++ b/drivers/gpu/drm/ttm/ttm_bo_util.c @@ -257,54 +257,6 @@ static int ttm_copy_io_page(void *dst, void *src, unsigned long page) return 0; }
-#ifdef CONFIG_X86 -#define __ttm_kmap_atomic_prot(__page, __prot) kmap_atomic_prot(__page, __prot) -#define __ttm_kunmap_atomic(__addr) kunmap_atomic(__addr) -#else -#define __ttm_kmap_atomic_prot(__page, __prot) vmap(&__page, 1, 0, __prot) -#define __ttm_kunmap_atomic(__addr) vunmap(__addr) -#endif - - -/** - * ttm_kmap_atomic_prot - Efficient kernel map of a single page with - * specified page protection. - * - * @page: The page to map. - * @prot: The page protection. - * - * This function maps a TTM page using the kmap_atomic api if available, - * otherwise falls back to vmap. The user must make sure that the - * specified page does not have an aliased mapping with a different caching - * policy unless the architecture explicitly allows it. Also mapping and - * unmapping using this api must be correctly nested. Unmapping should - * occur in the reverse order of mapping. - */ -void *ttm_kmap_atomic_prot(struct page *page, pgprot_t prot) -{ - if (pgprot_val(prot) == pgprot_val(PAGE_KERNEL)) - return kmap_atomic(page); - else - return __ttm_kmap_atomic_prot(page, prot); -} -EXPORT_SYMBOL(ttm_kmap_atomic_prot); - -/** - * ttm_kunmap_atomic_prot - Unmap a page that was mapped using - * ttm_kmap_atomic_prot. - * - * @addr: The virtual address from the map. - * @prot: The page protection. - */ -void ttm_kunmap_atomic_prot(void *addr, pgprot_t prot) -{ - if (pgprot_val(prot) == pgprot_val(PAGE_KERNEL)) - kunmap_atomic(addr); - else - __ttm_kunmap_atomic(addr); -} -EXPORT_SYMBOL(ttm_kunmap_atomic_prot); - static int ttm_copy_io_ttm_page(struct ttm_tt *ttm, void *src, unsigned long page, pgprot_t prot) @@ -316,13 +268,13 @@ static int ttm_copy_io_ttm_page(struct ttm_tt *ttm, void *src, return -ENOMEM;
src = (void *)((unsigned long)src + (page << PAGE_SHIFT)); - dst = ttm_kmap_atomic_prot(d, prot); + dst = kmap_atomic_prot(d, prot); if (!dst) return -ENOMEM;
memcpy_fromio(dst, src, PAGE_SIZE);
- ttm_kunmap_atomic_prot(dst, prot); + kunmap_atomic(dst);
return 0; } @@ -338,13 +290,13 @@ static int ttm_copy_ttm_io_page(struct ttm_tt *ttm, void *dst, return -ENOMEM;
dst = (void *)((unsigned long)dst + (page << PAGE_SHIFT)); - src = ttm_kmap_atomic_prot(s, prot); + src = kmap_atomic_prot(s, prot); if (!src) return -ENOMEM;
memcpy_toio(dst, src, PAGE_SIZE);
- ttm_kunmap_atomic_prot(src, prot); + kunmap_atomic(src);
return 0; } diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_blit.c b/drivers/gpu/drm/vmwgfx/vmwgfx_blit.c index bb46ca0c458f..94d456a1d1a9 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_blit.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_blit.c @@ -374,12 +374,12 @@ static int vmw_bo_cpu_blit_line(struct vmw_bo_blit_line_data *d, copy_size = min_t(u32, copy_size, PAGE_SIZE - src_page_offset);
if (unmap_src) { - ttm_kunmap_atomic_prot(d->src_addr, d->src_prot); + kunmap_atomic(d->src_addr); d->src_addr = NULL; }
if (unmap_dst) { - ttm_kunmap_atomic_prot(d->dst_addr, d->dst_prot); + kunmap_atomic(d->dst_addr); d->dst_addr = NULL; }
@@ -388,8 +388,8 @@ static int vmw_bo_cpu_blit_line(struct vmw_bo_blit_line_data *d, return -EINVAL;
d->dst_addr = - ttm_kmap_atomic_prot(d->dst_pages[dst_page], - d->dst_prot); + kmap_atomic_prot(d->dst_pages[dst_page], + d->dst_prot); if (!d->dst_addr) return -ENOMEM;
@@ -401,8 +401,8 @@ static int vmw_bo_cpu_blit_line(struct vmw_bo_blit_line_data *d, return -EINVAL;
d->src_addr = - ttm_kmap_atomic_prot(d->src_pages[src_page], - d->src_prot); + kmap_atomic_prot(d->src_pages[src_page], + d->src_prot); if (!d->src_addr) return -ENOMEM;
@@ -499,9 +499,9 @@ int vmw_bo_cpu_blit(struct ttm_buffer_object *dst, } out: if (d.src_addr) - ttm_kunmap_atomic_prot(d.src_addr, d.src_prot); + kunmap_atomic(d.src_addr); if (d.dst_addr) - ttm_kunmap_atomic_prot(d.dst_addr, d.dst_prot); + kunmap_atomic(d.dst_addr);
return ret; } diff --git a/include/drm/ttm/ttm_bo_api.h b/include/drm/ttm/ttm_bo_api.h index 0a9d042e075a..de1ccdcd5703 100644 --- a/include/drm/ttm/ttm_bo_api.h +++ b/include/drm/ttm/ttm_bo_api.h @@ -668,10 +668,6 @@ int ttm_bo_mmap_obj(struct vm_area_struct *vma, struct ttm_buffer_object *bo); int ttm_bo_mmap(struct file *filp, struct vm_area_struct *vma, struct ttm_bo_device *bdev);
-void *ttm_kmap_atomic_prot(struct page *page, pgprot_t prot); - -void ttm_kunmap_atomic_prot(void *addr, pgprot_t prot); - /** * ttm_bo_io *
From: Ira Weiny ira.weiny@intel.com
kmap_atomic_to_page() has no callers and is only defined on 1 arch and declared on another. Remove it.
Suggested-by: Al Viro viro@zeniv.linux.org.uk Signed-off-by: Ira Weiny ira.weiny@intel.com
--- Changes from V2: New Patch for this series --- arch/csky/include/asm/highmem.h | 1 - arch/csky/mm/highmem.c | 13 ------------- arch/nds32/include/asm/highmem.h | 1 - 3 files changed, 15 deletions(-)
diff --git a/arch/csky/include/asm/highmem.h b/arch/csky/include/asm/highmem.h index 263fbddcd0a3..ea2f3f39174d 100644 --- a/arch/csky/include/asm/highmem.h +++ b/arch/csky/include/asm/highmem.h @@ -33,7 +33,6 @@ 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); -extern struct page *kmap_atomic_to_page(void *ptr);
#define flush_cache_kmaps() do {} while (0)
diff --git a/arch/csky/mm/highmem.c b/arch/csky/mm/highmem.c index 3ae5c8cd7619..3b3f622f5ae9 100644 --- a/arch/csky/mm/highmem.c +++ b/arch/csky/mm/highmem.c @@ -81,19 +81,6 @@ void *kmap_atomic_pfn(unsigned long pfn) return (void *) vaddr; }
-struct page *kmap_atomic_to_page(void *ptr) -{ - unsigned long idx, vaddr = (unsigned long)ptr; - pte_t *pte; - - if (vaddr < FIXADDR_START) - return virt_to_page(ptr); - - idx = virt_to_fix(vaddr); - pte = kmap_pte - (idx - FIX_KMAP_BEGIN); - return pte_page(*pte); -} - static void __init kmap_pages_init(void) { unsigned long vaddr; diff --git a/arch/nds32/include/asm/highmem.h b/arch/nds32/include/asm/highmem.h index 4d21308549c9..a48a6536d41a 100644 --- a/arch/nds32/include/asm/highmem.h +++ b/arch/nds32/include/asm/highmem.h @@ -52,7 +52,6 @@ extern void kmap_init(void); */ #ifdef CONFIG_HIGHMEM extern void *kmap_atomic_pfn(unsigned long pfn); -extern struct page *kmap_atomic_to_page(void *ptr); #endif
#endif
From: Ira Weiny ira.weiny@intel.com
parisc reimplements the kmap calls except to flush it's dcache. This is arguably an abuse of kmap but regardless it is messy and confusing.
Remove the duplicate code and have parisc define ARCH_HAS_FLUSH_ON_KUNMAP for a kunmap_flush_on_unmap() architecture specific call to flush the cache.
Suggested-by: Al Viro viro@zeniv.linux.org.uk Signed-off-by: Ira Weiny ira.weiny@intel.com
--- Changes from V2: New Patch for this series --- arch/parisc/include/asm/cacheflush.h | 28 ++-------------------------- include/linux/highmem.h | 10 +++++++--- 2 files changed, 9 insertions(+), 29 deletions(-)
diff --git a/arch/parisc/include/asm/cacheflush.h b/arch/parisc/include/asm/cacheflush.h index 119c9a7681bc..99663fc1f997 100644 --- a/arch/parisc/include/asm/cacheflush.h +++ b/arch/parisc/include/asm/cacheflush.h @@ -100,35 +100,11 @@ flush_anon_page(struct vm_area_struct *vma, struct page *page, unsigned long vma } }
-#include <asm/kmap_types.h> - -#define ARCH_HAS_KMAP - -static inline void *kmap(struct page *page) -{ - might_sleep(); - return page_address(page); -} - -static inline void kunmap(struct page *page) -{ - flush_kernel_dcache_page_addr(page_address(page)); -} - -static inline void *kmap_atomic(struct page *page) -{ - preempt_disable(); - pagefault_disable(); - return page_address(page); -} - -static inline void kunmap_atomic_high(void *addr) +#define ARCH_HAS_FLUSH_ON_KUNMAP +static inline void kunmap_flush_on_unmap(void *addr) { flush_kernel_dcache_page_addr(addr); }
-#define kmap_atomic_prot(page, prot) kmap_atomic(page) -#define kmap_atomic_pfn(pfn) kmap_atomic(pfn_to_page(pfn)) - #endif /* _PARISC_CACHEFLUSH_H */
diff --git a/include/linux/highmem.h b/include/linux/highmem.h index 89838306f50d..cc0c3904e501 100644 --- a/include/linux/highmem.h +++ b/include/linux/highmem.h @@ -129,7 +129,6 @@ static inline struct page *kmap_to_page(void *addr)
static inline unsigned long totalhigh_pages(void) { return 0UL; }
-#ifndef ARCH_HAS_KMAP static inline void *kmap(struct page *page) { might_sleep(); @@ -138,6 +137,9 @@ static inline void *kmap(struct page *page)
static inline void kunmap(struct page *page) { +#ifdef ARCH_HAS_FLUSH_ON_KUNMAP + kunmap_flush_on_unmap(page_address(page)); +#endif }
static inline void *kmap_atomic(struct page *page) @@ -150,14 +152,16 @@ static inline void *kmap_atomic(struct page *page)
static inline void kunmap_atomic_high(void *addr) { - /* Nothing to do in the CONFIG_HIGHMEM=n case as kunmap_atomic() + /* Mostly nothing to do in the CONFIG_HIGHMEM=n case as kunmap_atomic() * handles re-enabling faults + preemption */ +#ifdef ARCH_HAS_FLUSH_ON_KUNMAP + kunmap_flush_on_unmap(addr); +#endif }
#define kmap_atomic_pfn(pfn) kmap_atomic(pfn_to_page(pfn))
#define kmap_flush_unused() do {} while(0) -#endif
#endif /* CONFIG_HIGHMEM */
On Thu, 7 May 2020 08:00:01 -0700 ira.weiny@intel.com wrote:
parisc reimplements the kmap calls except to flush it's dcache. This is arguably an abuse of kmap but regardless it is messy and confusing.
Remove the duplicate code and have parisc define ARCH_HAS_FLUSH_ON_KUNMAP for a kunmap_flush_on_unmap() architecture specific call to flush the cache.
checkpatch says:
ERROR: #define of 'ARCH_HAS_FLUSH_ON_KUNMAP' is wrong - use Kconfig variables or standard guards instead #69: FILE: arch/parisc/include/asm/cacheflush.h:103: +#define ARCH_HAS_FLUSH_ON_KUNMAP
which is fair enough, I guess. More conventional would be
arch/parisc/include/asm/cacheflush.h:
static inline void kunmap_flush_on_unmap(void *addr) { ... } #define kunmap_flush_on_unmap kunmap_flush_on_unmap
include/linux/highmem.h:
#ifndef kunmap_flush_on_unmap static inline void kunmap_flush_on_unmap(void *addr) { } #define kunmap_flush_on_unmap kunmap_flush_on_unmap #endif
static inline void kunmap_atomic_high(void *addr) { /* Mostly nothing to do in the CONFIG_HIGHMEM=n case as kunmap_atomic() * handles re-enabling faults + preemption */ kunmap_flush_on_unmap(addr); }
but I don't really think it's worth bothering changing it.
(Ditto patch 3/15)
On Thu, May 07, 2020 at 01:52:58PM -0700, Andrew Morton wrote:
On Thu, 7 May 2020 08:00:01 -0700 ira.weiny@intel.com wrote:
parisc reimplements the kmap calls except to flush it's dcache. This is arguably an abuse of kmap but regardless it is messy and confusing.
Remove the duplicate code and have parisc define ARCH_HAS_FLUSH_ON_KUNMAP for a kunmap_flush_on_unmap() architecture specific call to flush the cache.
checkpatch says:
ERROR: #define of 'ARCH_HAS_FLUSH_ON_KUNMAP' is wrong - use Kconfig variables or standard guards instead #69: FILE: arch/parisc/include/asm/cacheflush.h:103: +#define ARCH_HAS_FLUSH_ON_KUNMAP
which is fair enough, I guess. More conventional would be
arch/parisc/include/asm/cacheflush.h:
static inline void kunmap_flush_on_unmap(void *addr) { ... } #define kunmap_flush_on_unmap kunmap_flush_on_unmap
include/linux/highmem.h:
#ifndef kunmap_flush_on_unmap static inline void kunmap_flush_on_unmap(void *addr) { } #define kunmap_flush_on_unmap kunmap_flush_on_unmap #endif
static inline void kunmap_atomic_high(void *addr) { /* Mostly nothing to do in the CONFIG_HIGHMEM=n case as kunmap_atomic() * handles re-enabling faults + preemption */ kunmap_flush_on_unmap(addr); }
but I don't really think it's worth bothering changing it.
(Ditto patch 3/15)
Yes I was following the pattern already there.
I'll fix up the last patch now. Ira
From: Ira Weiny ira.weiny@intel.com
linux/highmem.h has not been needed for the pte_offset_map => kmap_atomic use in sparc for some time (~2002)
Remove this include.
Suggested-by: Al Viro viro@zeniv.linux.org.uk Signed-off-by: Ira Weiny ira.weiny@intel.com
--- Changes from V2: New Patch for this series --- arch/sparc/mm/io-unit.c | 1 - arch/sparc/mm/iommu.c | 1 - 2 files changed, 2 deletions(-)
diff --git a/arch/sparc/mm/io-unit.c b/arch/sparc/mm/io-unit.c index 289276b99b01..08238d989cfd 100644 --- a/arch/sparc/mm/io-unit.c +++ b/arch/sparc/mm/io-unit.c @@ -10,7 +10,6 @@ #include <linux/slab.h> #include <linux/spinlock.h> #include <linux/mm.h> -#include <linux/highmem.h> /* pte_offset_map => kmap_atomic */ #include <linux/bitops.h> #include <linux/dma-mapping.h> #include <linux/of.h> diff --git a/arch/sparc/mm/iommu.c b/arch/sparc/mm/iommu.c index b00dde13681b..f1e08e30b64e 100644 --- a/arch/sparc/mm/iommu.c +++ b/arch/sparc/mm/iommu.c @@ -12,7 +12,6 @@ #include <linux/init.h> #include <linux/mm.h> #include <linux/slab.h> -#include <linux/highmem.h> /* pte_offset_map => kmap_atomic */ #include <linux/dma-mapping.h> #include <linux/of.h> #include <linux/of_device.h>
From: Ira Weiny ira.weiny@intel.com
Most architectures define kmap_prot to be PAGE_KERNEL.
Let sparc and xtensa define there own and define PAGE_KERNEL as the default if not overridden.
Suggested-by: Christoph Hellwig hch@infradead.org Signed-off-by: Ira Weiny ira.weiny@intel.com
--- Changes from V2: New Patch for this series --- arch/arc/include/asm/highmem.h | 3 --- arch/arm/include/asm/highmem.h | 2 -- arch/csky/include/asm/highmem.h | 2 -- arch/microblaze/include/asm/highmem.h | 1 - arch/mips/include/asm/highmem.h | 2 -- arch/nds32/include/asm/highmem.h | 1 - arch/powerpc/include/asm/highmem.h | 1 - arch/sparc/include/asm/highmem.h | 3 ++- arch/sparc/mm/highmem.c | 4 ---- arch/x86/include/asm/fixmap.h | 1 - include/linux/highmem.h | 4 ++++ 11 files changed, 6 insertions(+), 18 deletions(-)
diff --git a/arch/arc/include/asm/highmem.h b/arch/arc/include/asm/highmem.h index 70900a73bfc8..6e5eafb3afdd 100644 --- a/arch/arc/include/asm/highmem.h +++ b/arch/arc/include/asm/highmem.h @@ -25,9 +25,6 @@ #define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT)) #define PKMAP_NR(virt) (((virt) - PKMAP_BASE) >> PAGE_SHIFT)
-#define kmap_prot PAGE_KERNEL - - #include <asm/cacheflush.h>
extern void kmap_init(void); diff --git a/arch/arm/include/asm/highmem.h b/arch/arm/include/asm/highmem.h index b0d4bd8dc3c1..31811be38d78 100644 --- a/arch/arm/include/asm/highmem.h +++ b/arch/arm/include/asm/highmem.h @@ -10,8 +10,6 @@ #define PKMAP_NR(virt) (((virt) - PKMAP_BASE) >> PAGE_SHIFT) #define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT))
-#define kmap_prot PAGE_KERNEL - #define flush_cache_kmaps() \ do { \ if (cache_is_vivt()) \ diff --git a/arch/csky/include/asm/highmem.h b/arch/csky/include/asm/highmem.h index ea2f3f39174d..14645e3d5cd5 100644 --- a/arch/csky/include/asm/highmem.h +++ b/arch/csky/include/asm/highmem.h @@ -38,8 +38,6 @@ extern void *kmap_atomic_pfn(unsigned long pfn);
extern void kmap_init(void);
-#define kmap_prot PAGE_KERNEL - #endif /* __KERNEL__ */
#endif /* __ASM_CSKY_HIGHMEM_H */ diff --git a/arch/microblaze/include/asm/highmem.h b/arch/microblaze/include/asm/highmem.h index d7c55cfd27bd..284ca8fb54c1 100644 --- a/arch/microblaze/include/asm/highmem.h +++ b/arch/microblaze/include/asm/highmem.h @@ -25,7 +25,6 @@ #include <linux/uaccess.h> #include <asm/fixmap.h>
-#define kmap_prot PAGE_KERNEL extern pte_t *kmap_pte; extern pte_t *pkmap_page_table;
diff --git a/arch/mips/include/asm/highmem.h b/arch/mips/include/asm/highmem.h index 76dec0bd4f59..f1f788b57166 100644 --- a/arch/mips/include/asm/highmem.h +++ b/arch/mips/include/asm/highmem.h @@ -54,8 +54,6 @@ extern void *kmap_atomic_pfn(unsigned long pfn);
extern void kmap_init(void);
-#define kmap_prot PAGE_KERNEL - #endif /* __KERNEL__ */
#endif /* _ASM_HIGHMEM_H */ diff --git a/arch/nds32/include/asm/highmem.h b/arch/nds32/include/asm/highmem.h index a48a6536d41a..5717647d14d1 100644 --- a/arch/nds32/include/asm/highmem.h +++ b/arch/nds32/include/asm/highmem.h @@ -32,7 +32,6 @@ #define LAST_PKMAP_MASK (LAST_PKMAP - 1) #define PKMAP_NR(virt) (((virt) - (PKMAP_BASE)) >> PAGE_SHIFT) #define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT)) -#define kmap_prot PAGE_KERNEL
static inline void flush_cache_kmaps(void) { diff --git a/arch/powerpc/include/asm/highmem.h b/arch/powerpc/include/asm/highmem.h index 8d8ee3fcd800..104026f7d6bc 100644 --- a/arch/powerpc/include/asm/highmem.h +++ b/arch/powerpc/include/asm/highmem.h @@ -29,7 +29,6 @@ #include <asm/page.h> #include <asm/fixmap.h>
-#define kmap_prot PAGE_KERNEL extern pte_t *kmap_pte; extern pte_t *pkmap_page_table;
diff --git a/arch/sparc/include/asm/highmem.h b/arch/sparc/include/asm/highmem.h index f4babe67cb5d..37f8694bde84 100644 --- a/arch/sparc/include/asm/highmem.h +++ b/arch/sparc/include/asm/highmem.h @@ -25,11 +25,12 @@ #include <asm/vaddrs.h> #include <asm/kmap_types.h> #include <asm/pgtable.h> +#include <asm/pgtsrmmu.h>
/* declarations for highmem.c */ extern unsigned long highstart_pfn, highend_pfn;
-extern pgprot_t kmap_prot; +#define kmap_prot __pgprot(SRMMU_ET_PTE | SRMMU_PRIV | SRMMU_CACHE); extern pte_t *pkmap_page_table;
void kmap_init(void) __init; diff --git a/arch/sparc/mm/highmem.c b/arch/sparc/mm/highmem.c index 414f578d1e57..d237d902f9c3 100644 --- a/arch/sparc/mm/highmem.c +++ b/arch/sparc/mm/highmem.c @@ -32,9 +32,6 @@ #include <asm/pgalloc.h> #include <asm/vaddrs.h>
-pgprot_t kmap_prot; -EXPORT_SYMBOL(kmap_prot); - static pte_t *kmap_pte;
void __init kmap_init(void) @@ -51,7 +48,6 @@ void __init kmap_init(void)
/* cache the first kmap pte */ kmap_pte = pte_offset_kernel(dir, address); - kmap_prot = __pgprot(SRMMU_ET_PTE | SRMMU_PRIV | SRMMU_CACHE); }
void *kmap_atomic_high_prot(struct page *page, pgprot_t prot) diff --git a/arch/x86/include/asm/fixmap.h b/arch/x86/include/asm/fixmap.h index 28183ee3cc42..b9527a54db99 100644 --- a/arch/x86/include/asm/fixmap.h +++ b/arch/x86/include/asm/fixmap.h @@ -152,7 +152,6 @@ extern void reserve_top_address(unsigned long reserve); extern int fixmaps_set;
extern pte_t *kmap_pte; -#define kmap_prot PAGE_KERNEL extern pte_t *pkmap_page_table;
void __native_set_fixmap(enum fixed_addresses idx, pte_t pte); diff --git a/include/linux/highmem.h b/include/linux/highmem.h index cc0c3904e501..bf470c16cecb 100644 --- a/include/linux/highmem.h +++ b/include/linux/highmem.h @@ -40,6 +40,10 @@ extern void kunmap_atomic_high(void *kvaddr); static inline void kmap_flush_tlb(unsigned long addr) { } #endif
+#ifndef kmap_prot +#define kmap_prot PAGE_KERNEL +#endif + void *kmap_high(struct page *page); static inline void *kmap(struct page *page) {
On Thu, 7 May 2020 08:00:03 -0700 ira.weiny@intel.com wrote:
From: Ira Weiny ira.weiny@intel.com
Most architectures define kmap_prot to be PAGE_KERNEL.
Let sparc and xtensa define there own and define PAGE_KERNEL as the default if not overridden.
checkpatch considered useful ;)
From: Andrew Morton akpm@linux-foundation.org Subject: kmap-consolidate-kmap_prot-definitions-checkpatch-fixes
WARNING: macros should not use a trailing semicolon #134: FILE: arch/sparc/include/asm/highmem.h:33: +#define kmap_prot __pgprot(SRMMU_ET_PTE | SRMMU_PRIV | SRMMU_CACHE);
total: 0 errors, 1 warnings, 100 lines checked
NOTE: For some of the reported defects, checkpatch may be able to mechanically convert to the typical style using --fix or --fix-inplace.
./patches/kmap-consolidate-kmap_prot-definitions.patch has style problems, please review.
NOTE: If any of the errors are false positives, please report them to the maintainer, see CHECKPATCH in MAINTAINERS.
Please run checkpatch prior to sending patches
Cc: Ira Weiny ira.weiny@intel.com Signed-off-by: Andrew Morton akpm@linux-foundation.org ---
arch/sparc/include/asm/highmem.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
--- a/arch/sparc/include/asm/highmem.h~kmap-consolidate-kmap_prot-definitions-checkpatch-fixes +++ a/arch/sparc/include/asm/highmem.h @@ -30,7 +30,7 @@ /* declarations for highmem.c */ extern unsigned long highstart_pfn, highend_pfn;
-#define kmap_prot __pgprot(SRMMU_ET_PTE | SRMMU_PRIV | SRMMU_CACHE); +#define kmap_prot __pgprot(SRMMU_ET_PTE | SRMMU_PRIV | SRMMU_CACHE) extern pte_t *pkmap_page_table;
void kmap_init(void) __init; _
On Thu, May 07, 2020 at 01:53:07PM -0700, Andrew Morton wrote:
On Thu, 7 May 2020 08:00:03 -0700 ira.weiny@intel.com wrote:
From: Ira Weiny ira.weiny@intel.com
Most architectures define kmap_prot to be PAGE_KERNEL.
Let sparc and xtensa define there own and define PAGE_KERNEL as the default if not overridden.
checkpatch considered useful ;)
Yes sorry... V3.1 on it's way...
Ira
From: Andrew Morton akpm@linux-foundation.org Subject: kmap-consolidate-kmap_prot-definitions-checkpatch-fixes
WARNING: macros should not use a trailing semicolon #134: FILE: arch/sparc/include/asm/highmem.h:33: +#define kmap_prot __pgprot(SRMMU_ET_PTE | SRMMU_PRIV | SRMMU_CACHE);
total: 0 errors, 1 warnings, 100 lines checked
NOTE: For some of the reported defects, checkpatch may be able to mechanically convert to the typical style using --fix or --fix-inplace.
./patches/kmap-consolidate-kmap_prot-definitions.patch has style problems, please review.
NOTE: If any of the errors are false positives, please report them to the maintainer, see CHECKPATCH in MAINTAINERS.
Please run checkpatch prior to sending patches
Cc: Ira Weiny ira.weiny@intel.com Signed-off-by: Andrew Morton akpm@linux-foundation.org
arch/sparc/include/asm/highmem.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
--- a/arch/sparc/include/asm/highmem.h~kmap-consolidate-kmap_prot-definitions-checkpatch-fixes +++ a/arch/sparc/include/asm/highmem.h @@ -30,7 +30,7 @@ /* declarations for highmem.c */ extern unsigned long highstart_pfn, highend_pfn;
-#define kmap_prot __pgprot(SRMMU_ET_PTE | SRMMU_PRIV | SRMMU_CACHE); +#define kmap_prot __pgprot(SRMMU_ET_PTE | SRMMU_PRIV | SRMMU_CACHE) extern pte_t *pkmap_page_table;
void kmap_init(void) __init; _
From: Ira Weiny ira.weiny@intel.com
Most architectures define kmap_prot to be PAGE_KERNEL.
Let sparc and xtensa define there own and define PAGE_KERNEL as the default if not overridden.
Suggested-by: Christoph Hellwig hch@infradead.org Signed-off-by: Ira Weiny ira.weiny@intel.com
--- Changes from V3: Fix semicolon in macro
Changes from V2: New Patch for this series --- arch/arc/include/asm/highmem.h | 3 --- arch/arm/include/asm/highmem.h | 2 -- arch/csky/include/asm/highmem.h | 2 -- arch/microblaze/include/asm/highmem.h | 1 - arch/mips/include/asm/highmem.h | 2 -- arch/nds32/include/asm/highmem.h | 1 - arch/powerpc/include/asm/highmem.h | 1 - arch/sparc/include/asm/highmem.h | 3 ++- arch/sparc/mm/highmem.c | 4 ---- arch/x86/include/asm/fixmap.h | 1 - include/linux/highmem.h | 4 ++++ 11 files changed, 6 insertions(+), 18 deletions(-)
diff --git a/arch/arc/include/asm/highmem.h b/arch/arc/include/asm/highmem.h index 70900a73bfc8..6e5eafb3afdd 100644 --- a/arch/arc/include/asm/highmem.h +++ b/arch/arc/include/asm/highmem.h @@ -25,9 +25,6 @@ #define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT)) #define PKMAP_NR(virt) (((virt) - PKMAP_BASE) >> PAGE_SHIFT)
-#define kmap_prot PAGE_KERNEL - - #include <asm/cacheflush.h>
extern void kmap_init(void); diff --git a/arch/arm/include/asm/highmem.h b/arch/arm/include/asm/highmem.h index b0d4bd8dc3c1..31811be38d78 100644 --- a/arch/arm/include/asm/highmem.h +++ b/arch/arm/include/asm/highmem.h @@ -10,8 +10,6 @@ #define PKMAP_NR(virt) (((virt) - PKMAP_BASE) >> PAGE_SHIFT) #define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT))
-#define kmap_prot PAGE_KERNEL - #define flush_cache_kmaps() \ do { \ if (cache_is_vivt()) \ diff --git a/arch/csky/include/asm/highmem.h b/arch/csky/include/asm/highmem.h index ea2f3f39174d..14645e3d5cd5 100644 --- a/arch/csky/include/asm/highmem.h +++ b/arch/csky/include/asm/highmem.h @@ -38,8 +38,6 @@ extern void *kmap_atomic_pfn(unsigned long pfn);
extern void kmap_init(void);
-#define kmap_prot PAGE_KERNEL - #endif /* __KERNEL__ */
#endif /* __ASM_CSKY_HIGHMEM_H */ diff --git a/arch/microblaze/include/asm/highmem.h b/arch/microblaze/include/asm/highmem.h index d7c55cfd27bd..284ca8fb54c1 100644 --- a/arch/microblaze/include/asm/highmem.h +++ b/arch/microblaze/include/asm/highmem.h @@ -25,7 +25,6 @@ #include <linux/uaccess.h> #include <asm/fixmap.h>
-#define kmap_prot PAGE_KERNEL extern pte_t *kmap_pte; extern pte_t *pkmap_page_table;
diff --git a/arch/mips/include/asm/highmem.h b/arch/mips/include/asm/highmem.h index 76dec0bd4f59..f1f788b57166 100644 --- a/arch/mips/include/asm/highmem.h +++ b/arch/mips/include/asm/highmem.h @@ -54,8 +54,6 @@ extern void *kmap_atomic_pfn(unsigned long pfn);
extern void kmap_init(void);
-#define kmap_prot PAGE_KERNEL - #endif /* __KERNEL__ */
#endif /* _ASM_HIGHMEM_H */ diff --git a/arch/nds32/include/asm/highmem.h b/arch/nds32/include/asm/highmem.h index a48a6536d41a..5717647d14d1 100644 --- a/arch/nds32/include/asm/highmem.h +++ b/arch/nds32/include/asm/highmem.h @@ -32,7 +32,6 @@ #define LAST_PKMAP_MASK (LAST_PKMAP - 1) #define PKMAP_NR(virt) (((virt) - (PKMAP_BASE)) >> PAGE_SHIFT) #define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT)) -#define kmap_prot PAGE_KERNEL
static inline void flush_cache_kmaps(void) { diff --git a/arch/powerpc/include/asm/highmem.h b/arch/powerpc/include/asm/highmem.h index 8d8ee3fcd800..104026f7d6bc 100644 --- a/arch/powerpc/include/asm/highmem.h +++ b/arch/powerpc/include/asm/highmem.h @@ -29,7 +29,6 @@ #include <asm/page.h> #include <asm/fixmap.h>
-#define kmap_prot PAGE_KERNEL extern pte_t *kmap_pte; extern pte_t *pkmap_page_table;
diff --git a/arch/sparc/include/asm/highmem.h b/arch/sparc/include/asm/highmem.h index f4babe67cb5d..ddb03c04f1f3 100644 --- a/arch/sparc/include/asm/highmem.h +++ b/arch/sparc/include/asm/highmem.h @@ -25,11 +25,12 @@ #include <asm/vaddrs.h> #include <asm/kmap_types.h> #include <asm/pgtable.h> +#include <asm/pgtsrmmu.h>
/* declarations for highmem.c */ extern unsigned long highstart_pfn, highend_pfn;
-extern pgprot_t kmap_prot; +#define kmap_prot __pgprot(SRMMU_ET_PTE | SRMMU_PRIV | SRMMU_CACHE) extern pte_t *pkmap_page_table;
void kmap_init(void) __init; diff --git a/arch/sparc/mm/highmem.c b/arch/sparc/mm/highmem.c index 414f578d1e57..d237d902f9c3 100644 --- a/arch/sparc/mm/highmem.c +++ b/arch/sparc/mm/highmem.c @@ -32,9 +32,6 @@ #include <asm/pgalloc.h> #include <asm/vaddrs.h>
-pgprot_t kmap_prot; -EXPORT_SYMBOL(kmap_prot); - static pte_t *kmap_pte;
void __init kmap_init(void) @@ -51,7 +48,6 @@ void __init kmap_init(void)
/* cache the first kmap pte */ kmap_pte = pte_offset_kernel(dir, address); - kmap_prot = __pgprot(SRMMU_ET_PTE | SRMMU_PRIV | SRMMU_CACHE); }
void *kmap_atomic_high_prot(struct page *page, pgprot_t prot) diff --git a/arch/x86/include/asm/fixmap.h b/arch/x86/include/asm/fixmap.h index 28183ee3cc42..b9527a54db99 100644 --- a/arch/x86/include/asm/fixmap.h +++ b/arch/x86/include/asm/fixmap.h @@ -152,7 +152,6 @@ extern void reserve_top_address(unsigned long reserve); extern int fixmaps_set;
extern pte_t *kmap_pte; -#define kmap_prot PAGE_KERNEL extern pte_t *pkmap_page_table;
void __native_set_fixmap(enum fixed_addresses idx, pte_t pte); diff --git a/include/linux/highmem.h b/include/linux/highmem.h index cc0c3904e501..bf470c16cecb 100644 --- a/include/linux/highmem.h +++ b/include/linux/highmem.h @@ -40,6 +40,10 @@ extern void kunmap_atomic_high(void *kvaddr); static inline void kmap_flush_tlb(unsigned long addr) { } #endif
+#ifndef kmap_prot +#define kmap_prot PAGE_KERNEL +#endif + void *kmap_high(struct page *page); static inline void *kmap(struct page *page) {
dri-devel@lists.freedesktop.org