Skip to content

Commit 35441cd

Browse files
committed
Merge tag 'kvm-s390-next-6.14-2' of https://git.kernel.org/pub/scm/linux/kernel/git/kvms390/linux into HEAD
- some selftest fixes - move some kvm-related functions from mm into kvm - remove all usage of page->index and page->lru from kvm - fixes and cleanups for vsie
2 parents ee3a66f + 3223906 commit 35441cd

File tree

21 files changed

+990
-930
lines changed

21 files changed

+990
-930
lines changed

Documentation/virt/kvm/api.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1419,7 +1419,7 @@ fetch) is injected in the guest.
14191419
S390:
14201420
^^^^^
14211421

1422-
Returns -EINVAL if the VM has the KVM_VM_S390_UCONTROL flag set.
1422+
Returns -EINVAL or -EEXIST if the VM has the KVM_VM_S390_UCONTROL flag set.
14231423
Returns -EINVAL if called on a protected VM.
14241424

14251425
4.36 KVM_SET_TSS_ADDR

arch/s390/include/asm/gmap.h

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
/**
2424
* struct gmap_struct - guest address space
2525
* @list: list head for the mm->context gmap list
26-
* @crst_list: list of all crst tables used in the guest address space
2726
* @mm: pointer to the parent mm_struct
2827
* @guest_to_host: radix tree with guest to host address translation
2928
* @host_to_guest: radix tree with pointer to segment table entries
@@ -35,7 +34,6 @@
3534
* @guest_handle: protected virtual machine handle for the ultravisor
3635
* @host_to_rmap: radix tree with gmap_rmap lists
3736
* @children: list of shadow gmap structures
38-
* @pt_list: list of all page tables used in the shadow guest address space
3937
* @shadow_lock: spinlock to protect the shadow gmap list
4038
* @parent: pointer to the parent gmap for shadow guest address spaces
4139
* @orig_asce: ASCE for which the shadow page table has been created
@@ -45,7 +43,6 @@
4543
*/
4644
struct gmap {
4745
struct list_head list;
48-
struct list_head crst_list;
4946
struct mm_struct *mm;
5047
struct radix_tree_root guest_to_host;
5148
struct radix_tree_root host_to_guest;
@@ -61,7 +58,6 @@ struct gmap {
6158
/* Additional data for shadow guest address spaces */
6259
struct radix_tree_root host_to_rmap;
6360
struct list_head children;
64-
struct list_head pt_list;
6561
spinlock_t shadow_lock;
6662
struct gmap *parent;
6763
unsigned long orig_asce;
@@ -106,23 +102,21 @@ struct gmap *gmap_create(struct mm_struct *mm, unsigned long limit);
106102
void gmap_remove(struct gmap *gmap);
107103
struct gmap *gmap_get(struct gmap *gmap);
108104
void gmap_put(struct gmap *gmap);
105+
void gmap_free(struct gmap *gmap);
106+
struct gmap *gmap_alloc(unsigned long limit);
109107

110108
int gmap_map_segment(struct gmap *gmap, unsigned long from,
111109
unsigned long to, unsigned long len);
112110
int gmap_unmap_segment(struct gmap *gmap, unsigned long to, unsigned long len);
113111
unsigned long __gmap_translate(struct gmap *, unsigned long gaddr);
114-
unsigned long gmap_translate(struct gmap *, unsigned long gaddr);
115112
int __gmap_link(struct gmap *gmap, unsigned long gaddr, unsigned long vmaddr);
116-
int gmap_fault(struct gmap *, unsigned long gaddr, unsigned int fault_flags);
117113
void gmap_discard(struct gmap *, unsigned long from, unsigned long to);
118114
void __gmap_zap(struct gmap *, unsigned long gaddr);
119115
void gmap_unlink(struct mm_struct *, unsigned long *table, unsigned long vmaddr);
120116

121117
int gmap_read_table(struct gmap *gmap, unsigned long gaddr, unsigned long *val);
122118

123-
struct gmap *gmap_shadow(struct gmap *parent, unsigned long asce,
124-
int edat_level);
125-
int gmap_shadow_valid(struct gmap *sg, unsigned long asce, int edat_level);
119+
void gmap_unshadow(struct gmap *sg);
126120
int gmap_shadow_r2t(struct gmap *sg, unsigned long saddr, unsigned long r2t,
127121
int fake);
128122
int gmap_shadow_r3t(struct gmap *sg, unsigned long saddr, unsigned long r3t,
@@ -131,24 +125,22 @@ int gmap_shadow_sgt(struct gmap *sg, unsigned long saddr, unsigned long sgt,
131125
int fake);
132126
int gmap_shadow_pgt(struct gmap *sg, unsigned long saddr, unsigned long pgt,
133127
int fake);
134-
int gmap_shadow_pgt_lookup(struct gmap *sg, unsigned long saddr,
135-
unsigned long *pgt, int *dat_protection, int *fake);
136128
int gmap_shadow_page(struct gmap *sg, unsigned long saddr, pte_t pte);
137129

138130
void gmap_register_pte_notifier(struct gmap_notifier *);
139131
void gmap_unregister_pte_notifier(struct gmap_notifier *);
140132

141-
int gmap_mprotect_notify(struct gmap *, unsigned long start,
142-
unsigned long len, int prot);
133+
int gmap_protect_one(struct gmap *gmap, unsigned long gaddr, int prot, unsigned long bits);
143134

144135
void gmap_sync_dirty_log_pmd(struct gmap *gmap, unsigned long dirty_bitmap[4],
145136
unsigned long gaddr, unsigned long vmaddr);
146137
int s390_disable_cow_sharing(void);
147-
void s390_unlist_old_asce(struct gmap *gmap);
148138
int s390_replace_asce(struct gmap *gmap);
149139
void s390_uv_destroy_pfns(unsigned long count, unsigned long *pfns);
150140
int __s390_uv_destroy_range(struct mm_struct *mm, unsigned long start,
151141
unsigned long end, bool interruptible);
142+
int kvm_s390_wiggle_split_folio(struct mm_struct *mm, struct folio *folio, bool split);
143+
unsigned long *gmap_table_walk(struct gmap *gmap, unsigned long gaddr, int level);
152144

153145
/**
154146
* s390_uv_destroy_range - Destroy a range of pages in the given mm.

arch/s390/include/asm/kvm_host.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
#define KVM_S390_ESCA_CPU_SLOTS 248
3131
#define KVM_MAX_VCPUS 255
3232

33+
#define KVM_INTERNAL_MEM_SLOTS 1
34+
3335
/*
3436
* These seem to be used for allocating ->chip in the routing table, which we
3537
* don't use. 1 is as small as we can get to reduce the needed memory. If we
@@ -931,12 +933,14 @@ struct sie_page2 {
931933
u8 reserved928[0x1000 - 0x928]; /* 0x0928 */
932934
};
933935

936+
struct vsie_page;
937+
934938
struct kvm_s390_vsie {
935939
struct mutex mutex;
936940
struct radix_tree_root addr_to_page;
937941
int page_count;
938942
int next;
939-
struct page *pages[KVM_MAX_VCPUS];
943+
struct vsie_page *pages[KVM_MAX_VCPUS];
940944
};
941945

942946
struct kvm_s390_gisa_iam {

arch/s390/include/asm/pgtable.h

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -420,9 +420,10 @@ void setup_protection_map(void);
420420
#define PGSTE_HC_BIT 0x0020000000000000UL
421421
#define PGSTE_GR_BIT 0x0004000000000000UL
422422
#define PGSTE_GC_BIT 0x0002000000000000UL
423-
#define PGSTE_UC_BIT 0x0000800000000000UL /* user dirty (migration) */
424-
#define PGSTE_IN_BIT 0x0000400000000000UL /* IPTE notify bit */
425-
#define PGSTE_VSIE_BIT 0x0000200000000000UL /* ref'd in a shadow table */
423+
#define PGSTE_ST2_MASK 0x0000ffff00000000UL
424+
#define PGSTE_UC_BIT 0x0000000000008000UL /* user dirty (migration) */
425+
#define PGSTE_IN_BIT 0x0000000000004000UL /* IPTE notify bit */
426+
#define PGSTE_VSIE_BIT 0x0000000000002000UL /* ref'd in a shadow table */
426427

427428
/* Guest Page State used for virtualization */
428429
#define _PGSTE_GPS_ZERO 0x0000000080000000UL
@@ -2007,4 +2008,18 @@ extern void s390_reset_cmma(struct mm_struct *mm);
20072008
#define pmd_pgtable(pmd) \
20082009
((pgtable_t)__va(pmd_val(pmd) & -sizeof(pte_t)*PTRS_PER_PTE))
20092010

2011+
static inline unsigned long gmap_pgste_get_pgt_addr(unsigned long *pgt)
2012+
{
2013+
unsigned long *pgstes, res;
2014+
2015+
pgstes = pgt + _PAGE_ENTRIES;
2016+
2017+
res = (pgstes[0] & PGSTE_ST2_MASK) << 16;
2018+
res |= pgstes[1] & PGSTE_ST2_MASK;
2019+
res |= (pgstes[2] & PGSTE_ST2_MASK) >> 16;
2020+
res |= (pgstes[3] & PGSTE_ST2_MASK) >> 32;
2021+
2022+
return res;
2023+
}
2024+
20102025
#endif /* _S390_PAGE_H */

arch/s390/include/asm/uv.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -628,12 +628,12 @@ static inline int is_prot_virt_host(void)
628628
}
629629

630630
int uv_pin_shared(unsigned long paddr);
631-
int gmap_make_secure(struct gmap *gmap, unsigned long gaddr, void *uvcb);
632-
int gmap_destroy_page(struct gmap *gmap, unsigned long gaddr);
633631
int uv_destroy_folio(struct folio *folio);
634632
int uv_destroy_pte(pte_t pte);
635633
int uv_convert_from_secure_pte(pte_t pte);
636-
int gmap_convert_to_secure(struct gmap *gmap, unsigned long gaddr);
634+
int make_folio_secure(struct folio *folio, struct uv_cb_header *uvcb);
635+
int uv_convert_from_secure(unsigned long paddr);
636+
int uv_convert_from_secure_folio(struct folio *folio);
637637

638638
void setup_uv(void);
639639

0 commit comments

Comments
 (0)