[PATCH v3 00/18] Tidy up cache.S

Fuad Tabba
2021-05-20T12:46:31Z

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/
[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/
[4] https://lore.kernel.org/linux-arch/20200511075115.GA16134@willie-the-truck/
[5] https://lore.kernel.org/linux-arch/20200510075510.987823-3-hch@lst.de/
[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