Message ID | 20210112170410.905976187@linutronix.de (mailing list archive) |
---|---|
State | Not Applicable |
Headers | show |
Series | mm/highmem: Fix fallout from generic kmap_local conversions | expand |
On 2021-01-12 18:01, Thomas Gleixner wrote: > The recent conversion to the generic kmap_local infrastructure failed to > assign the proper pre/post map/unmap flush operations for sparc. > > Sparc requires cache flush before map/unmap and tlb flush afterwards. > > Fixes: 3293efa97807 ("sparc/mm/highmem: Switch to generic kmap atomic") > Reported-by: Andreas Larsson <andreas@gaisler.com> > Signed-off-by: Thomas Gleixner <tglx@linutronix.de> > Cc: "David S. Miller" <davem@davemloft.net> > Cc: sparclinux@vger.kernel.org > --- > arch/sparc/include/asm/highmem.h | 9 +++++---- > 1 file changed, 5 insertions(+), 4 deletions(-) > > --- a/arch/sparc/include/asm/highmem.h > +++ b/arch/sparc/include/asm/highmem.h > @@ -50,10 +50,11 @@ extern pte_t *pkmap_page_table; > > #define flush_cache_kmaps() flush_cache_all() > > -/* FIXME: Use __flush_tlb_one(vaddr) instead of flush_cache_all() -- Anton */ > -#define arch_kmap_local_post_map(vaddr, pteval) flush_cache_all() > -#define arch_kmap_local_post_unmap(vaddr) flush_cache_all() > - > +/* FIXME: Use __flush_*_one(vaddr) instead of flush_*_all() -- Anton */ > +#define arch_kmap_local_pre_map(vaddr, pteval) flush_cache_all() > +#define arch_kmap_local_pre_unmap(vaddr) flush_cache_all() > +#define arch_kmap_local_post_map(vaddr, pteval) flush_tlb_all() > +#define arch_kmap_local_post_unmap(vaddr) flush_tlb_all() > > #endif /* __KERNEL__ */ Yes! I found, just an hour before your patched was posted, that an equivalent fix helped back where the switch-to-generic patch first occurred. This patch was successfully tested on master. Tested-by: Andreas Larsson <andreas@gaisler.com>
--- a/arch/sparc/include/asm/highmem.h +++ b/arch/sparc/include/asm/highmem.h @@ -50,10 +50,11 @@ extern pte_t *pkmap_page_table; #define flush_cache_kmaps() flush_cache_all() -/* FIXME: Use __flush_tlb_one(vaddr) instead of flush_cache_all() -- Anton */ -#define arch_kmap_local_post_map(vaddr, pteval) flush_cache_all() -#define arch_kmap_local_post_unmap(vaddr) flush_cache_all() - +/* FIXME: Use __flush_*_one(vaddr) instead of flush_*_all() -- Anton */ +#define arch_kmap_local_pre_map(vaddr, pteval) flush_cache_all() +#define arch_kmap_local_pre_unmap(vaddr) flush_cache_all() +#define arch_kmap_local_post_map(vaddr, pteval) flush_tlb_all() +#define arch_kmap_local_post_unmap(vaddr) flush_tlb_all() #endif /* __KERNEL__ */
The recent conversion to the generic kmap_local infrastructure failed to assign the proper pre/post map/unmap flush operations for sparc. Sparc requires cache flush before map/unmap and tlb flush afterwards. Fixes: 3293efa97807 ("sparc/mm/highmem: Switch to generic kmap atomic") Reported-by: Andreas Larsson <andreas@gaisler.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: "David S. Miller" <davem@davemloft.net> Cc: sparclinux@vger.kernel.org --- arch/sparc/include/asm/highmem.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)