public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH v7 00/29] KVM: s390: gmap rewrite, the real deal
@ 2026-02-04 15:02 Claudio Imbrenda
  2026-02-04 15:02 ` [PATCH v7 01/29] KVM: s390: Refactor pgste lock and unlock functions Claudio Imbrenda
                   ` (29 more replies)
  0 siblings, 30 replies; 31+ messages in thread
From: Claudio Imbrenda @ 2026-02-04 15:02 UTC (permalink / raw)
  To: kvm
  Cc: linux-kernel, linux-s390, borntraeger, frankja, nsg, nrb, seiden,
	gra, schlameuss, hca, svens, agordeev, gor, david,
	gerald.schaefer

This series is the last big series of the gmap rewrite. It introduces
the new code and actually uses it. The old code is then removed.

KVM on s390 will now use the mmu_notifier, like most other
architectures. The gmap address space is now completely separate from
userspace; no level of the page tables is shared between guest mapping
and userspace.

One of the biggest advantages is that the page size of userspace is
completely independent of the page size used by the guest. Userspace
can mix normal pages, THPs, hugetlbfs, and more.

It's now possible to have nested guests and guests with huge pages
running on the same host. In fact, it's possible to have a nested
guest on a guest with huge pages. Transparent hugepages are also
possible.

Patches 1 to 11 are mostly preparations; introducing some new bits and
functions, and moving code around.

Patches 12 to 21 are the meat of the new gmap code; page table management
functions and gmap management. This is the code that will be used to
manage guest memory.

Patch 24 is unfortunately big; the existing code is converted to use
the new gmap and all references to the old gmap are removed. This needs
to be done all at once, unfortunately, hence the size of the patch.

Patch 25 and 26 remove all the now unused code.

Patch 27 and 28 allow for 1M pages to be used to back guests, and add
some more functions that are useful for testing.

Patch 29 contains selftests for the storage key interface introduced in
the patch 28

v6->v7:
* Added selftests for the newly introduced KEYOP ioctl
* Fix the bugs found by the newly introduced selftests
* Fix a bug in the memslot removal code
* Fix a few bugs in vSIE shadowing/deshawoding code
* Fix deadlock between shadowing code and normal fault handling
* Added proper locking for memslot manipulation operations
* Added capability for the KEYOP ioctl, and API documentation
* Minor documentation fixes
* Fixed many style issues in comments
* Fixed regression with ucontrol VMs

v5->v6:
* Added a mutex to avoid races during import-like operations in
  protected guests
* The functions uv_convert_from_secure_folio() and uv_destroy_folio()
  now work on the whole folio, and not just its first page
* Added warnings if uv_convert_from_secure_pte() fails in ptep_*()
* Changed the way shadow gmaps do reference counting
* Use a bitmap for gmap flags, instead of individual bool variables
* Rework the make_secure logic to work on gmap only, and not on
  userspace addresses
* Some refactorings
* Rebased onto 6.19-rc2
* Added more comments
* Minor style fixes

v4->v5:
* fix some locking issues
* fix comments and documentation

v3->v4:
* dat_link() can now return -ENOMEM when appropriate
* fixed a few vSIE races that led to use-after-free or deadlocks
* split part of the previous patch 23 and move it after patch 17, merge
  the rest of the patch into patch 19
* fix -ENOMEM handling in handle_pfmf() and handle_sske()

v2->v3:
* Add lots of small comments and cosmetic fixes
* Rename some functions to improve clarity
* Remove unused helper functions and macros
* Rename inline asm constraints labels to make them more understandable
* Refactor the code to pre-allocate the page tables (using custom
  caches) when sleeping is allowed, use the cached pages when holding
  spinlocks and handle gracefully allocation failures (i.e. retry
  instead of killing the guest)
* Refactor the code for fault handling; it's now in a separate file,
  and it takes a callback that can be optionally called when all the
  relevant locks are still held
* Use assembler mnemonics instead of manually specifying the opcode
  where appropriate
* Remove the LEVEL_* enum, and use TABLE_TYPE_* macros instead;
  introduce new TABLE_TYPE_PAGE_TABLE
* Remove usage of cpu_has_idte() since it is being removed from the
  kernel
* Improve storage key handling and PGSTE locking
* Introduce struct guest_fault to represent the state of a guest fault
  that is being resolved
* Minor CMMA fixes


Claudio Imbrenda (29):
  KVM: s390: Refactor pgste lock and unlock functions
  KVM: s390: Add P bit in table entry bitfields, move union vaddress
  s390: Make UV folio operations work on whole folio
  s390: Move sske_frame() to a header
  KVM: s390: Add gmap_helper_set_unused()
  KVM: s390: Introduce import_lock
  KVM: s390: Export two functions
  s390/mm: Warn if uv_convert_from_secure_pte() fails
  KVM: s390: vsie: Pass gmap explicitly as parameter
  KVM: s390: Enable KVM_GENERIC_MMU_NOTIFIER
  KVM: s390: Rename some functions in gaccess.c
  KVM: s390: KVM-specific bitfields and helper functions
  KVM: s390: KVM page table management functions: allocation
  KVM: s390: KVM page table management functions: clear and replace
  KVM: s390: KVM page table management functions: walks
  KVM: s390: KVM page table management functions: storage keys
  KVM: s390: KVM page table management functions: lifecycle management
  KVM: s390: KVM page table management functions: CMMA
  KVM: s390: New gmap code
  KVM: s390: Add helper functions for fault handling
  KVM: s390: Add some helper functions needed for vSIE
  KVM: s390: Stop using CONFIG_PGSTE
  KVM: s390: Storage key functions refactoring
  KVM: s390: Switch to new gmap
  KVM: s390: Remove gmap from s390/mm
  KVM: S390: Remove PGSTE code from linux/s390 mm
  KVM: s390: Enable 1M pages for gmap
  KVM: s390: Storage key manipulation IOCTL
  KVM: s390: selftests: Add selftest for the KVM_S390_KEYOP ioctl

 Documentation/virt/kvm/api.rst           |   42 +
 MAINTAINERS                              |    2 -
 arch/s390/Kconfig                        |    3 -
 arch/s390/include/asm/dat-bits.h         |   32 +-
 arch/s390/include/asm/gmap.h             |  174 --
 arch/s390/include/asm/gmap_helpers.h     |    1 +
 arch/s390/include/asm/hugetlb.h          |    6 -
 arch/s390/include/asm/kvm_host.h         |    7 +
 arch/s390/include/asm/mmu.h              |   13 -
 arch/s390/include/asm/mmu_context.h      |    6 +-
 arch/s390/include/asm/page.h             |    4 -
 arch/s390/include/asm/pgalloc.h          |    4 -
 arch/s390/include/asm/pgtable.h          |  171 +-
 arch/s390/include/asm/tlb.h              |    3 -
 arch/s390/include/asm/uaccess.h          |   70 +-
 arch/s390/include/asm/uv.h               |    3 +-
 arch/s390/kernel/uv.c                    |  142 +-
 arch/s390/kvm/Kconfig                    |    2 +
 arch/s390/kvm/Makefile                   |    3 +-
 arch/s390/kvm/dat.c                      | 1391 ++++++++++++
 arch/s390/kvm/dat.h                      |  970 +++++++++
 arch/s390/kvm/diag.c                     |    2 +-
 arch/s390/kvm/faultin.c                  |  148 ++
 arch/s390/kvm/faultin.h                  |   92 +
 arch/s390/kvm/gaccess.c                  |  958 +++++----
 arch/s390/kvm/gaccess.h                  |   20 +-
 arch/s390/kvm/gmap-vsie.c                |  141 --
 arch/s390/kvm/gmap.c                     | 1235 +++++++++++
 arch/s390/kvm/gmap.h                     |  244 +++
 arch/s390/kvm/intercept.c                |   15 +-
 arch/s390/kvm/interrupt.c                |    6 +-
 arch/s390/kvm/kvm-s390.c                 |  954 ++++-----
 arch/s390/kvm/kvm-s390.h                 |   27 +-
 arch/s390/kvm/priv.c                     |  213 +-
 arch/s390/kvm/pv.c                       |  177 +-
 arch/s390/kvm/vsie.c                     |  192 +-
 arch/s390/lib/uaccess.c                  |  184 +-
 arch/s390/mm/Makefile                    |    1 -
 arch/s390/mm/fault.c                     |    4 +-
 arch/s390/mm/gmap.c                      | 2436 ----------------------
 arch/s390/mm/gmap_helpers.c              |   96 +-
 arch/s390/mm/hugetlbpage.c               |   24 -
 arch/s390/mm/page-states.c               |    1 +
 arch/s390/mm/pageattr.c                  |    7 -
 arch/s390/mm/pgalloc.c                   |   24 -
 arch/s390/mm/pgtable.c                   |  814 +-------
 include/uapi/linux/kvm.h                 |   11 +
 mm/khugepaged.c                          |    9 -
 tools/testing/selftests/kvm/Makefile.kvm |    1 +
 tools/testing/selftests/kvm/s390/keyop.c |  299 +++
 50 files changed, 5889 insertions(+), 5495 deletions(-)
 delete mode 100644 arch/s390/include/asm/gmap.h
 create mode 100644 arch/s390/kvm/dat.c
 create mode 100644 arch/s390/kvm/dat.h
 create mode 100644 arch/s390/kvm/faultin.c
 create mode 100644 arch/s390/kvm/faultin.h
 delete mode 100644 arch/s390/kvm/gmap-vsie.c
 create mode 100644 arch/s390/kvm/gmap.c
 create mode 100644 arch/s390/kvm/gmap.h
 delete mode 100644 arch/s390/mm/gmap.c
 create mode 100644 tools/testing/selftests/kvm/s390/keyop.c

-- 
2.52.0


^ permalink raw reply	[flat|nested] 31+ messages in thread

end of thread, other threads:[~2026-02-04 15:24 UTC | newest]

Thread overview: 31+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-02-04 15:02 [PATCH v7 00/29] KVM: s390: gmap rewrite, the real deal Claudio Imbrenda
2026-02-04 15:02 ` [PATCH v7 01/29] KVM: s390: Refactor pgste lock and unlock functions Claudio Imbrenda
2026-02-04 15:02 ` [PATCH v7 02/29] KVM: s390: Add P bit in table entry bitfields, move union vaddress Claudio Imbrenda
2026-02-04 15:02 ` [PATCH v7 03/29] s390: Make UV folio operations work on whole folio Claudio Imbrenda
2026-02-04 15:02 ` [PATCH v7 04/29] s390: Move sske_frame() to a header Claudio Imbrenda
2026-02-04 15:02 ` [PATCH v7 05/29] KVM: s390: Add gmap_helper_set_unused() Claudio Imbrenda
2026-02-04 15:02 ` [PATCH v7 06/29] KVM: s390: Introduce import_lock Claudio Imbrenda
2026-02-04 15:02 ` [PATCH v7 07/29] KVM: s390: Export two functions Claudio Imbrenda
2026-02-04 15:02 ` [PATCH v7 08/29] s390/mm: Warn if uv_convert_from_secure_pte() fails Claudio Imbrenda
2026-02-04 15:02 ` [PATCH v7 09/29] KVM: s390: vsie: Pass gmap explicitly as parameter Claudio Imbrenda
2026-02-04 15:02 ` [PATCH v7 10/29] KVM: s390: Enable KVM_GENERIC_MMU_NOTIFIER Claudio Imbrenda
2026-02-04 15:02 ` [PATCH v7 11/29] KVM: s390: Rename some functions in gaccess.c Claudio Imbrenda
2026-02-04 15:02 ` [PATCH v7 12/29] KVM: s390: KVM-specific bitfields and helper functions Claudio Imbrenda
2026-02-04 15:02 ` [PATCH v7 13/29] KVM: s390: KVM page table management functions: allocation Claudio Imbrenda
2026-02-04 15:02 ` [PATCH v7 14/29] KVM: s390: KVM page table management functions: clear and replace Claudio Imbrenda
2026-02-04 15:02 ` [PATCH v7 15/29] KVM: s390: KVM page table management functions: walks Claudio Imbrenda
2026-02-04 15:02 ` [PATCH v7 16/29] KVM: s390: KVM page table management functions: storage keys Claudio Imbrenda
2026-02-04 15:02 ` [PATCH v7 17/29] KVM: s390: KVM page table management functions: lifecycle management Claudio Imbrenda
2026-02-04 15:02 ` [PATCH v7 18/29] KVM: s390: KVM page table management functions: CMMA Claudio Imbrenda
2026-02-04 15:02 ` [PATCH v7 19/29] KVM: s390: New gmap code Claudio Imbrenda
2026-02-04 15:02 ` [PATCH v7 20/29] KVM: s390: Add helper functions for fault handling Claudio Imbrenda
2026-02-04 15:02 ` [PATCH v7 21/29] KVM: s390: Add some helper functions needed for vSIE Claudio Imbrenda
2026-02-04 15:02 ` [PATCH v7 22/29] KVM: s390: Stop using CONFIG_PGSTE Claudio Imbrenda
2026-02-04 15:02 ` [PATCH v7 23/29] KVM: s390: Storage key functions refactoring Claudio Imbrenda
2026-02-04 15:02 ` [PATCH v7 24/29] KVM: s390: Switch to new gmap Claudio Imbrenda
2026-02-04 15:02 ` [PATCH v7 25/29] KVM: s390: Remove gmap from s390/mm Claudio Imbrenda
2026-02-04 15:02 ` [PATCH v7 26/29] KVM: S390: Remove PGSTE code from linux/s390 mm Claudio Imbrenda
2026-02-04 15:02 ` [PATCH v7 27/29] KVM: s390: Enable 1M pages for gmap Claudio Imbrenda
2026-02-04 15:02 ` [PATCH v7 28/29] KVM: s390: Storage key manipulation IOCTL Claudio Imbrenda
2026-02-04 15:02 ` [PATCH v7 29/29] KVM: s390: selftests: Add selftest for the KVM_S390_KEYOP ioctl Claudio Imbrenda
2026-02-04 15:23 ` [PATCH v7 00/29] KVM: s390: gmap rewrite, the real deal Heiko Carstens

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox