[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [Patch v2 23/29] s390x/kvm: let the CPU model control CMM(A
From: |
David Hildenbrand |
Subject: |
[Qemu-devel] [Patch v2 23/29] s390x/kvm: let the CPU model control CMM(A) |
Date: |
Mon, 8 Aug 2016 17:32:52 +0200 |
Starting with recent kernels, if the cmma attributes are available, we
actually have hardware support. Enabling CMMA then means providing the
guest VCPU with CMM, therefore enabling its CMM facility.
Let's not blindly enable CMM anymore but let's control it using CPU models.
For disabled CPU models, CMMA will continue to always get enabled.
Also enable it in the applicable default models.
Please note that CMM doesn't work with hugetlbfs, therefore we will
warn the user and keep it disabled. Migrating from/to a hugetlbfs
configuration works, as it will be disabled on both sides.
Acked-by: Cornelia Huck <address@hidden>
Signed-off-by: David Hildenbrand <address@hidden>
---
target-s390x/gen-features.c | 1 +
target-s390x/kvm.c | 47 ++++++++++++++++++++++++++++++++++-----------
2 files changed, 37 insertions(+), 11 deletions(-)
diff --git a/target-s390x/gen-features.c b/target-s390x/gen-features.c
index 1dfcc9a..95f99d9 100644
--- a/target-s390x/gen-features.c
+++ b/target-s390x/gen-features.c
@@ -372,6 +372,7 @@ static uint16_t full_GEN13_GA1[] = {
static uint16_t default_GEN9_GA1[] = {
S390_FEAT_STORE_HYPERVISOR_INFO,
S390_FEAT_GROUP_MSA_EXT_1,
+ S390_FEAT_CMM,
};
#define default_GEN9_GA2 EmptyFeat
#define default_GEN9_GA3 EmptyFeat
diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c
index 3c0929b..5de4490 100644
--- a/target-s390x/kvm.c
+++ b/target-s390x/kvm.c
@@ -174,6 +174,18 @@ int kvm_s390_set_mem_limit(KVMState *s, uint64_t
new_limit, uint64_t *hw_limit)
return kvm_vm_ioctl(s, KVM_SET_DEVICE_ATTR, &attr);
}
+static bool kvm_s390_cmma_available(void)
+{
+ static bool initialized, value;
+
+ if (!initialized) {
+ initialized = true;
+ value = kvm_vm_check_mem_attr(kvm_state, KVM_S390_VM_MEM_ENABLE_CMMA)
&&
+ kvm_vm_check_mem_attr(kvm_state, KVM_S390_VM_MEM_CLR_CMMA);
+ }
+ return value;
+}
+
void kvm_s390_cmma_reset(void)
{
int rc;
@@ -182,11 +194,15 @@ void kvm_s390_cmma_reset(void)
.attr = KVM_S390_VM_MEM_CLR_CMMA,
};
+ if (!mem_path || !kvm_s390_cmma_available()) {
+ return;
+ }
+
rc = kvm_vm_ioctl(kvm_state, KVM_SET_DEVICE_ATTR, &attr);
trace_kvm_clear_cmma(rc);
}
-static void kvm_s390_enable_cmma(KVMState *s)
+static void kvm_s390_enable_cmma(void)
{
int rc;
struct kvm_device_attr attr = {
@@ -194,12 +210,7 @@ static void kvm_s390_enable_cmma(KVMState *s)
.attr = KVM_S390_VM_MEM_ENABLE_CMMA,
};
- if (!kvm_vm_check_mem_attr(s, KVM_S390_VM_MEM_ENABLE_CMMA) ||
- !kvm_vm_check_mem_attr(s, KVM_S390_VM_MEM_CLR_CMMA)) {
- return;
- }
-
- rc = kvm_vm_ioctl(s, KVM_SET_DEVICE_ATTR, &attr);
+ rc = kvm_vm_ioctl(kvm_state, KVM_SET_DEVICE_ATTR, &attr);
trace_kvm_enable_cmma(rc);
}
@@ -259,10 +270,6 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
cap_mem_op = kvm_check_extension(s, KVM_CAP_S390_MEM_OP);
cap_s390_irq = kvm_check_extension(s, KVM_CAP_S390_INJECT_IRQ);
- if (!mem_path) {
- kvm_s390_enable_cmma(s);
- }
-
if (!kvm_check_extension(s, KVM_CAP_S390_GMAP)
|| !kvm_check_extension(s, KVM_CAP_S390_COW)) {
phys_mem_set_alloc(legacy_s390_alloc);
@@ -2520,6 +2527,11 @@ void kvm_s390_get_host_cpu_model(S390CPUModel *model,
Error **errp)
return;
}
+ /* with cpu model support, CMM is only indicated if really available */
+ if (kvm_s390_cmma_available()) {
+ set_bit(S390_FEAT_CMM, model->features);
+ }
+
if (s390_known_cpu_type(cpu_type)) {
/* we want the exact model, even if some features are missing */
model->def = s390_find_cpu_def(cpu_type, ibc_gen(unblocked_ibc),
@@ -2552,6 +2564,10 @@ void kvm_s390_apply_cpu_model(const S390CPUModel *model,
Error **errp)
int rc;
if (!model) {
+ /* compatibility handling if cpu models are disabled */
+ if (kvm_s390_cmma_available() && !mem_path) {
+ kvm_s390_enable_cmma();
+ }
return;
}
if (!kvm_s390_cpu_models_supported()) {
@@ -2580,4 +2596,13 @@ void kvm_s390_apply_cpu_model(const S390CPUModel *model,
Error **errp)
error_setg(errp, "KVM: Error configuring CPU subfunctions: %d", rc);
return;
}
+ /* enable CMM via CMMA - disable on hugetlbfs */
+ if (test_bit(S390_FEAT_CMM, model->features)) {
+ if (mem_path) {
+ error_report("Warning: CMM will not be enabled because it is not "
+ "compatible to hugetlbfs.");
+ } else {
+ kvm_s390_enable_cmma();
+ }
+ }
}
--
2.6.6
- [Qemu-devel] [Patch v2 05/29] s390x/cpumodel: generate CPU feature lists for CPU models, (continued)
- [Qemu-devel] [Patch v2 05/29] s390x/cpumodel: generate CPU feature lists for CPU models, David Hildenbrand, 2016/08/08
- [Qemu-devel] [Patch v2 18/29] s390x/sclp: propagate hmfai, David Hildenbrand, 2016/08/08
- [Qemu-devel] [Patch v2 02/29] s390x/cpumodel: "host" and "qemu" as CPU subclasses, David Hildenbrand, 2016/08/08
- [Qemu-devel] [Patch v2 04/29] s390x/cpumodel: introduce CPU features, David Hildenbrand, 2016/08/08
- [Qemu-devel] [Patch v2 26/29] qmp: add QMP interface "query-cpu-model-baseline", David Hildenbrand, 2016/08/08
- [Qemu-devel] [Patch v2 24/29] qmp: add QMP interface "query-cpu-model-expansion", David Hildenbrand, 2016/08/08
- [Qemu-devel] [Patch v2 29/29] s390x/cpumodel: implement QMP interface "query-cpu-model-baseline", David Hildenbrand, 2016/08/08
- [Qemu-devel] [Patch v2 08/29] s390x/cpumodel: register defined CPU models as subclasses, David Hildenbrand, 2016/08/08
- [Qemu-devel] [Patch v2 20/29] s390x/kvm: allow runtime-instrumentation for "none" machine, David Hildenbrand, 2016/08/08
- [Qemu-devel] [Patch v2 28/29] s390x/cpumodel: implement QMP interface "query-cpu-model-comparison", David Hildenbrand, 2016/08/08
- [Qemu-devel] [Patch v2 23/29] s390x/kvm: let the CPU model control CMM(A),
David Hildenbrand <=
- [Qemu-devel] [Patch v2 27/29] s390x/cpumodel: implement QMP interface "query-cpu-model-expansion", David Hildenbrand, 2016/08/08
- [Qemu-devel] [Patch v2 14/29] s390x/sclp: introduce sclp feature blocks, David Hildenbrand, 2016/08/08
- [Qemu-devel] [Patch v2 16/29] s390x/sclp: propagate the ibc val(lowest and unblocked ibc), David Hildenbrand, 2016/08/08
- [Qemu-devel] [Patch v2 19/29] linux-headers: update against kvm/next, David Hildenbrand, 2016/08/08
- [Qemu-devel] [Patch v2 13/29] s390x/sclp: factor out preparation of cpu entries, David Hildenbrand, 2016/08/08
- [Qemu-devel] [Patch v2 09/29] s390x/cpumodel: store the CPU model in the CPU instance, David Hildenbrand, 2016/08/08
- [Qemu-devel] [Patch v2 21/29] s390x/kvm: implement CPU model support, David Hildenbrand, 2016/08/08
- [Qemu-devel] [Patch v2 22/29] s390x/kvm: disable host model for existing compat machines, David Hildenbrand, 2016/08/08
- [Qemu-devel] [Patch v2 25/29] qmp: add QMP interface "query-cpu-model-comparison", David Hildenbrand, 2016/08/08
- Re: [Qemu-devel] [Patch v2 00/29] s390x CPU models: exposing features, no-reply, 2016/08/08