mirror of
https://github.com/torvalds/linux.git
synced 2026-09-26 01:52:03 +02:00
KVM: s390: gmap: Make storage keys optional
Guard guest storage key handling behind `KVM_S390_MANAGES_S390_GUEST`. This enables other KVM implementations to use gmap without implementing storage key infrastructure. Define KVM_S390_MANAGES_S390_GUEST to 1 for KVM hosts managing s390 guests (in kvm_host_s390.h). A KVM implementation not implementing those features must define KVM_S390_MANAGES_S390_GUEST to 0 in its kvm_host_<guest_arch>.h. No functional changes besides the new guard. Signed-off-by: Steffen Eiden <seiden@linux.ibm.com> Reviewed-by: Christian Borntraeger <borntraeger@linux.ibm.com> Signed-off-by: Christian Borntraeger <borntraeger@linux.ibm.com>
This commit is contained in:
parent
d487a24041
commit
a07276d5d1
|
|
@ -32,6 +32,8 @@
|
|||
|
||||
#define KVM_INTERNAL_MEM_SLOTS 1
|
||||
|
||||
#define KVM_S390_MANAGES_S390_GUEST 1
|
||||
|
||||
/*
|
||||
* These seem to be used for allocating ->chip in the routing table, which we
|
||||
* don't use. 1 is as small as we can get to reduce the needed memory. If we
|
||||
|
|
|
|||
|
|
@ -613,6 +613,7 @@ long _dat_walk_gfn_range(gfn_t start, gfn_t end, union asce asce,
|
|||
return dat_crste_walk_range(start, min(end, asce_end(asce)), table, &walk);
|
||||
}
|
||||
|
||||
#if KVM_S390_MANAGES_S390_GUEST
|
||||
int dat_get_storage_key(union asce asce, gfn_t gfn, union skey *skey)
|
||||
{
|
||||
union crste *crstep;
|
||||
|
|
@ -843,6 +844,7 @@ long dat_reset_skeys(union asce asce, gfn_t start)
|
|||
|
||||
return _dat_walk_gfn_range(start, asce_end(asce), asce, &ops, DAT_WALK_IGN_HOLES, NULL);
|
||||
}
|
||||
#endif /* KVM_S390_MANAGES_S390_GUEST */
|
||||
|
||||
struct slot_priv {
|
||||
unsigned long token;
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@
|
|||
#ifndef ARCH_KVM_GMAP_DAT_H
|
||||
#define ARCH_KVM_GMAP_DAT_H
|
||||
|
||||
#include <linux/kvm_host.h>
|
||||
#include <linux/radix-tree.h>
|
||||
#include <linux/refcount.h>
|
||||
#include <linux/io.h>
|
||||
|
|
@ -532,6 +533,8 @@ int dat_entry_walk(struct kvm_s390_mmu_cache *mc, gfn_t gfn, union asce asce, in
|
|||
void dat_free_level(struct crst_table *table, bool owns_ptes);
|
||||
struct crst_table *dat_alloc_crst_sleepable(unsigned long init);
|
||||
int dat_set_asce_limit(struct kvm_s390_mmu_cache *mc, union asce *asce, int newtype);
|
||||
|
||||
#if KVM_S390_MANAGES_S390_GUEST
|
||||
int dat_get_storage_key(union asce asce, gfn_t gfn, union skey *skey);
|
||||
int dat_set_storage_key(struct kvm_s390_mmu_cache *mc, union asce asce, gfn_t gfn,
|
||||
union skey skey, bool nq);
|
||||
|
|
@ -539,6 +542,7 @@ int dat_cond_set_storage_key(struct kvm_s390_mmu_cache *mmc, union asce asce, gf
|
|||
union skey skey, union skey *oldkey, bool nq, bool mr, bool mc);
|
||||
int dat_reset_reference_bit(union asce asce, gfn_t gfn, union skey *skey);
|
||||
long dat_reset_skeys(union asce asce, gfn_t start);
|
||||
#endif /* KVM_S390_MANAGES_S390_GUEST */
|
||||
|
||||
unsigned long dat_get_ptval(struct page_table *table, struct ptval_param param);
|
||||
void dat_set_ptval(struct page_table *table, struct ptval_param param, unsigned long val);
|
||||
|
|
|
|||
|
|
@ -945,6 +945,8 @@ void gmap_split_huge_pages(struct gmap *gmap)
|
|||
} while (start);
|
||||
}
|
||||
|
||||
#if KVM_S390_MANAGES_S390_GUEST
|
||||
|
||||
static int _gmap_enable_skeys(struct gmap *gmap)
|
||||
{
|
||||
gfn_t start = 0;
|
||||
|
|
@ -977,6 +979,7 @@ int gmap_enable_skeys(struct gmap *gmap)
|
|||
mmap_write_unlock(gmap->kvm->mm);
|
||||
return rc;
|
||||
}
|
||||
#endif /* KVM_S390_MANAGES_S390_GUEST */
|
||||
|
||||
static long _destroy_pages_pte(union pte *ptep, gfn_t gfn, gfn_t next, struct dat_walk *walk)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -10,6 +10,8 @@
|
|||
#ifndef ARCH_KVM_GMAP_GMAP_H
|
||||
#define ARCH_KVM_GMAP_GMAP_H
|
||||
|
||||
#include <linux/kvm_host.h>
|
||||
|
||||
#include "dat.h"
|
||||
|
||||
/**
|
||||
|
|
@ -98,7 +100,11 @@ int gmap_set_limit(struct gmap *gmap, gfn_t limit);
|
|||
int gmap_ucas_translate(struct kvm_s390_mmu_cache *mc, struct gmap *gmap, gpa_t *gaddr);
|
||||
int gmap_ucas_map(struct gmap *gmap, gfn_t p_gfn, gfn_t c_gfn, unsigned long count);
|
||||
void gmap_ucas_unmap(struct gmap *gmap, gfn_t c_gfn, unsigned long count);
|
||||
|
||||
#if KVM_S390_MANAGES_S390_GUEST
|
||||
int gmap_enable_skeys(struct gmap *gmap);
|
||||
#endif /* KVM_S390_MANAGES_S390_GUEST */
|
||||
|
||||
int gmap_pv_destroy_range(struct gmap *gmap, gfn_t start, gfn_t end, bool interruptible);
|
||||
int gmap_insert_rmap(struct kvm_s390_mmu_cache *mc, struct gmap *sg, gfn_t p_gfn,
|
||||
gfn_t r_gfn, int level);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user