[PATCH v3 00/18] Tidy up cache.S
From: Fuad Tabba <hidden>
Date: 2021-05-20 12:46:31
Hi, Changes since v2 [1]: - Brought in Mark's patches that add conditional cache fixups, only generating an extable entry if a label is provided [2]. NOTE: The patches missed some of the code comments to reflect the changes. I took the liberty of fixing the comments in Mark's patch. - Modified the user_alt macro to make the fixup label optional, in the same way as Mark's patches [2], to avoid code duplication later in the series. - Tidied up the new cache flush (clean/invalidate) macro by removing code duplication, conditional variables/labels. Moved the ttbr manipulation, fixup handler, and rets inline in __flush_cache_user_range. (Mark) - Fixed comments and commit messages. (Mark) Changes since v1 [3]: - Apply ARM64_WORKAROUND_CLEAN_CACHE errata to swsusp_arch_suspend_exit (Mark) - Remove toggling of uaccess from the newly created cache flush (clean/invalidate) macro and leave it up to the caller (Robin) - Fix renaming of cache maintenance functions (Ard, Mark) - Fix comment on maintenance operations in machine_kexec_post_load (Ard) - Fix commit msg comments to clarify some of the changes and outline potential performance impact (Mark) - Fix code comments that refer to flush_icache_range when the intended function is __flush_icache_range As has been noted before [4], the code in cache.S isn't very tidy. Some of its functions accept address ranges by start and size, whereas others with similar names do so by start and end. This has resulted in at least one bug [5]. Moreover, invalidate_icache_range and __flush_icache_range toggle uaccess, which isn't necessary because they work on the kernel linear map [6]. This patch series attempts to fix these issues, as well as tidy up the code in general to reduce ambiguity and make it consistent with Arm terminology and with the functions' actual operations. No functional change intended in this series. However, there might be a performance impact due to the reduced number of instructions in general. This series is based on v5.13-rc1. You can find the applied series here [7]. Cheers, /fuad [1] https://lore.kernel.org/linux-arm-kernel/20210517075124.152151-1-tabba@google.com/ (local) [2] https://git.kernel.org/pub/scm/linux/kernel/git/mark/linux.git/log/?h=arm64/cleanups/cache [3] https://lore.kernel.org/linux-arm-kernel/20210511144252.3779113-1-tabba@google.com/T/ (local) [4] https://lore.kernel.org/linux-arch/20200511075115.GA16134@willie-the-truck/ (local) [5] https://lore.kernel.org/linux-arch/20200510075510.987823-3-hch@lst.de/ (local) [6] https://lore.kernel.org/linux-arch/20200511110014.lb9PEahJ4hVOYrbwIb_qUHXyNy9KQzNFdb_I3YlzY6A@z/ [7] https://android-kvm.googlesource.com/linux/+/refs/heads/tabba/fixcache-5.13 Fuad Tabba (16): arm64: Apply errata to swsusp_arch_suspend_exit arm64: assembler: user_alt label optional arm64: Do not enable uaccess for flush_icache_range arm64: Do not enable uaccess for invalidate_icache_range arm64: Downgrade flush_icache_range to invalidate arm64: Move documentation of dcache_by_line_op arm64: Fix comments to refer to correct function __flush_icache_range arm64: __inval_dcache_area to take end parameter instead of size arm64: dcache_by_line_op to take end parameter instead of size arm64: __flush_dcache_area to take end parameter instead of size arm64: __clean_dcache_area_poc to take end parameter instead of size arm64: __clean_dcache_area_pop to take end parameter instead of size arm64: __clean_dcache_area_pou to take end parameter instead of size arm64: sync_icache_aliases to take end parameter instead of size arm64: Fix cache maintenance function comments arm64: Rename arm64-internal cache maintenance functions Mark Rutland (2): arm64: assembler: replace `kaddr` with `addr` arm64: assembler: add conditional cache fixups arch/arm64/include/asm/alternative-macros.h | 9 +- arch/arm64/include/asm/arch_gicv3.h | 3 +- arch/arm64/include/asm/assembler.h | 80 ++++++---- arch/arm64/include/asm/cacheflush.h | 69 +++++---- arch/arm64/include/asm/efi.h | 2 +- arch/arm64/include/asm/kvm_mmu.h | 7 +- arch/arm64/kernel/alternative.c | 2 +- arch/arm64/kernel/efi-entry.S | 9 +- arch/arm64/kernel/head.S | 13 +- arch/arm64/kernel/hibernate-asm.S | 7 +- arch/arm64/kernel/hibernate.c | 20 ++- arch/arm64/kernel/idreg-override.c | 3 +- arch/arm64/kernel/image-vars.h | 2 +- arch/arm64/kernel/insn.c | 2 +- arch/arm64/kernel/kaslr.c | 12 +- arch/arm64/kernel/machine_kexec.c | 30 ++-- arch/arm64/kernel/probes/uprobes.c | 2 +- arch/arm64/kernel/smp.c | 8 +- arch/arm64/kernel/smp_spin_table.c | 7 +- arch/arm64/kernel/sys_compat.c | 2 +- arch/arm64/kvm/arm.c | 2 +- arch/arm64/kvm/hyp/nvhe/cache.S | 4 +- arch/arm64/kvm/hyp/nvhe/setup.c | 3 +- arch/arm64/kvm/hyp/nvhe/tlb.c | 2 +- arch/arm64/kvm/hyp/pgtable.c | 13 +- arch/arm64/lib/uaccess_flushcache.c | 4 +- arch/arm64/mm/cache.S | 163 +++++++++++--------- arch/arm64/mm/flush.c | 29 ++-- 28 files changed, 294 insertions(+), 215 deletions(-) base-commit: 6efb943b8616ec53a5e444193dccf1af9ad627b5 -- 2.31.1.751.gd2f1c929bd-goog _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel