Re: [PATCH v4 00/10] Independent per-CPU data section for nVHE

2020-10-02 Thread Marc Zyngier
On Tue, 22 Sep 2020 21:49:00 +0100, David Brazdil wrote:
> Introduce '.hyp.data..percpu' as part of ongoing effort to make nVHE
> hyp code self-contained and independent of the rest of the kernel.
> 
> Main benefits:
>  * independent nVHE per-CPU data section that can be unmapped from host,
>  * more robust linking of nVHE hyp code,
>  * no need for hyp-specific macros to access per-CPU variables.
> 
> [...]

Applied to next, thanks!

[01/10] kvm: arm64: Partially link nVHE hyp code, simplify HYPCOPY
commit: ab25464bdabd45f283cc1194e332040f89071106
[02/10] kvm: arm64: Move nVHE hyp namespace macros to hyp_image.h
commit: ce492a16ffb8814d9651c3fdafc363bfa1b01189
[03/10] kvm: arm64: Only define __kvm_ex_table for CONFIG_KVM
commit: 3471ee06e33e413d7fa73c1aa3092e6e794b9e05
[04/10] kvm: arm64: Remove __hyp_this_cpu_read
commit: 717cf94adb54095d14a6674baea73123188f2901
[05/10] kvm: arm64: Remove hyp_adr/ldr_this_cpu
commit: ea391027d35546d9155f1350123b5af8bddec706
[06/10] kvm: arm64: Add helpers for accessing nVHE hyp per-cpu vars
commit: 572494995bc3d282336bfd8162741929402910b9
[07/10] kvm: arm64: Duplicate arm64_ssbd_callback_required for nVHE hyp
commit: df4c8214a18d202fa0ec221a001f640e020f7e44
[08/10] kvm: arm64: Create separate instances of kvm_host_data for VHE/nVHE
commit: 2a1198c9b436402582f7beed57028044b819329c
[09/10] kvm: arm64: Set up hyp percpu data for nVHE
commit: 30c953911c4370bfb622ee1c2fcc7e78c84df800
[10/10] kvm: arm64: Remove unnecessary hyp mappings
commit: a3bb9c3a00551726590137e3974495ce6cf6b758

Cheers,

M.
-- 
Without deviation from the norm, progress is not possible.




Re: [PATCH v4 00/10] Independent per-CPU data section for nVHE

2020-09-24 Thread Christopher Lameter
On Tue, 22 Sep 2020, David Brazdil wrote:

> Introduce '.hyp.data..percpu' as part of ongoing effort to make nVHE
> hyp code self-contained and independent of the rest of the kernel.

The percpu subsystems point is to enable the use of special hardware
instructions that can perform address calculation and a memory operation
in one interruptible instruction. This is in particular useful to avoid
higher overhead for memory management related counters because preempt
disable/enable etc can be avoided.

ARM cannot do that and thus has a LC/SC loop.

This is a patchset for ARM64 so its not clear to me what kind of advantage
there would be against a simple implementation that does a regular fetch
from a base address with an offset.

> Main benefits:
>  * independent nVHE per-CPU data section that can be unmapped from host,
>  * more robust linking of nVHE hyp code,
>  * no need for hyp-specific macros to access per-CPU variables.

Maybe simply don't use percpu variables for your arm code? Those pointers
to data will be much more indepedent of the rest of the kernel and allow a
much higher degree of being self-contained.



[PATCH v4 00/10] Independent per-CPU data section for nVHE

2020-09-22 Thread David Brazdil
Introduce '.hyp.data..percpu' as part of ongoing effort to make nVHE
hyp code self-contained and independent of the rest of the kernel.

Main benefits:
 * independent nVHE per-CPU data section that can be unmapped from host,
 * more robust linking of nVHE hyp code,
 * no need for hyp-specific macros to access per-CPU variables.

The series is structured as follows:

 - patch 1: Improve existing hyp build rules. This could be sent and merged
independently of per-CPU but this series builds on it.

 - patches 2-3: Minor cleanups.

 - patches 4-5: Replace hyp helpers for accessing per-CPU variables
 with common helpers modified to work correctly in hyp. Per-CPU
 variables can now be accessed with one API anywhere.

 - patches 6-8: Where VHE and nVHE use per-CPU variables defined in
 kernel proper, move their definitions to hyp/ where they are
 duplicated and owned by VHE/nVHE, respectively. Non-VHE hyp code
 now refers only to per-CPU variables defined in its source files.
 Helpers are added so that kernel proper can continue to access
 nVHE hyp variables, same way as it does with other nVHE symbols.

 - patches 9-10: Introduce '.hyp.data..percpu' ELF section and allocate
 memory for every CPU core during KVM init. All nVHE per-CPU state
 is now grouped together in ELF and in memory. Introducing a new
 per-CPU variable does not require adding new memory mappings any
 more. nVHE hyp code cannot accidentally refer to kernel-proper
 per-CPU data as it only has the pointer to its own per-CPU memory.

Patches are rebased on v5.9-rc6 and available in branch 'topic/percpu-v4' at:
https://android-kvm.googlesource.com/linux

For maintainers: In case of interest, there are patches that remove the need
for redefining macros under DEBUG_PREEMPT available at the same repo, branch
'topic/percpu-v3-debug-preempt'. Since they are non-trivial, I am not going
to post them here so late in the 5.10 window. I plan to post them for 5.11
when they will also be useful for other patches.

Changes v3 -> v4:
 * Drop patch that marked pages allocated for hyp reserved
 * Copy arm64_ssbd_callback_required at cpu_init_hyp_mode
 * Use read_sysreg in __hyp_my_cpu_offset
 * Simplify per-CPU region allocation code
 * Use same subsection name regex as other kernel linker scripts
 * Rename helper per-CPU macros
 * Add .gitignore for hyp linker script

Changes v2 -> v3:
 * Use PERCPU_INPUT in hyp.ld instead of modifying PERCPU_SECTION
 * Only pass linker script once to LD (fix error message)
 * Renamed '.hyp.o' to '.nvhe.o'
 * Use __KVM_VHE_HYPERVISOR__ to select TPIDR_EL2 instead of alternatives
 * Move all prefixing-related macros to hyp_image.h

Changes v1 -> v2:
 * partially link hyp code, add linker script

David Brazdil (10):
  kvm: arm64: Partially link nVHE hyp code, simplify HYPCOPY
  kvm: arm64: Move nVHE hyp namespace macros to hyp_image.h
  kvm: arm64: Only define __kvm_ex_table for CONFIG_KVM
  kvm: arm64: Remove __hyp_this_cpu_read
  kvm: arm64: Remove hyp_adr/ldr_this_cpu
  kvm: arm64: Add helpers for accessing nVHE hyp per-cpu vars
  kvm: arm64: Duplicate arm64_ssbd_callback_required for nVHE hyp
  kvm: arm64: Create separate instances of kvm_host_data for VHE/nVHE
  kvm: arm64: Set up hyp percpu data for nVHE
  kvm: arm64: Remove unnecessary hyp mappings

 arch/arm64/include/asm/assembler.h| 29 +---
 arch/arm64/include/asm/hyp_image.h| 36 ++
 arch/arm64/include/asm/kvm_asm.h  | 82 +++
 arch/arm64/include/asm/kvm_host.h |  2 +-
 arch/arm64/include/asm/kvm_mmu.h  | 22 ++
 arch/arm64/include/asm/percpu.h   | 28 +++-
 arch/arm64/kernel/image-vars.h|  4 --
 arch/arm64/kernel/vmlinux.lds.S   | 13 
 arch/arm64/kvm/arm.c  | 61 +
 arch/arm64/kvm/hyp/hyp-entry.S|  2 +-
 arch/arm64/kvm/hyp/include/hyp/debug-sr.h |  4 +-
 arch/arm64/kvm/hyp/include/hyp/switch.h   |  8 +--
 arch/arm64/kvm/hyp/nvhe/.gitignore|  2 +
 arch/arm64/kvm/hyp/nvhe/Makefile  | 60 +
 arch/arm64/kvm/hyp/nvhe/hyp.lds.S | 19 ++
 arch/arm64/kvm/hyp/nvhe/switch.c  |  8 ++-
 arch/arm64/kvm/hyp/vhe/switch.c   |  5 +-
 arch/arm64/kvm/hyp/vhe/sysreg-sr.c|  4 +-
 arch/arm64/kvm/pmu.c  | 13 ++--
 19 files changed, 272 insertions(+), 130 deletions(-)
 create mode 100644 arch/arm64/include/asm/hyp_image.h
 create mode 100644 arch/arm64/kvm/hyp/nvhe/.gitignore
 create mode 100644 arch/arm64/kvm/hyp/nvhe/hyp.lds.S

--
2.28.0.681.g6f77f65b4e-goog