Re: [PATCH v17 10/20] KVM: arm64: coco: Disable Steal time accounting for coco guests
From: Suzuki K Poulose <suzuki.poulose@arm.com>
Date: 2026-09-09 11:52:08
Also in:
kvm, kvmarm, linux-coco, lkml
On 09/09/2026 12:45, Fuad Tabba wrote:
Hi Suzuki, On Tue, 8 Sept 2026 at 17:23, Suzuki K Poulose [off-list ref] wrote:quoted
PVTIME support is advertised by KVM_CAP_STEAL_TIME, which doesn't take into account the kvm instance. Even with that, a VMM could skip the CAP check and proceed to configure the PVTIME as we don't do further check on the DEVICE_CTRL. Tighten this up by passing the KVM instance around wherever possible and catch things early Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>...quoted
-bool kvm_arm_pvtime_supported(void) +bool kvm_arm_pvtime_supported(struct kvm *kvm) { - return !!sched_info_on(); + return !!sched_info_on() && (!kvm || !kvm_vm_is_confidential(kvm)); }I think it would be better to leave KVM_CAP_STEAL_TIME reported and instead reject the configuration for these VMs, returning -EPERM from the KVM_ARM_VCPU_PVTIME_CTRL attr. A capability query should report what the kernel supports, not whether a given VM may use it; gating it per-VM here is also inconsistent, since the !kvm clause leaves the system-fd cap at 1 while the VM-fd cap reads 0. And -EPERM says that
But isn't that we want from a VMM perspective ? i.e., enable PVTIME if it is supported for the given VM (type). Rather than PVTIME is supported by the KVM, so I can go enable it by default. But, we endup getting a failure while we enable it. I encountered this with kvmtool, where CAP_STEAL_TIME is reported true and even the HAS_DEVICE_ATTR goes through fine, but SET_DEVICE_ATTR seemed to fail. Isn't it better to allow the VM to decide if the capability is supported for the given VM type, like we are doing for other capabilities ?
steal-time exists but isn't permitted for a confidential VM, whereas -ENXIO reads as "no such feature".
Cheers Suzuki
Cheers, /fuadquoted
int kvm_arm_pvtime_set_attr(struct kvm_vcpu *vcpu,@@ -81,7 +81,7 @@ int kvm_arm_pvtime_set_attr(struct kvm_vcpu *vcpu, int ret = 0; int idx; - if (!kvm_arm_pvtime_supported() || + if (!kvm_arm_pvtime_supported(kvm) || attr->attr != KVM_ARM_VCPU_PVTIME_IPA) return -ENXIO;@@ -110,7 +110,7 @@ int kvm_arm_pvtime_get_attr(struct kvm_vcpu *vcpu, u64 __user *user = (u64 __user *)attr->addr; u64 ipa; - if (!kvm_arm_pvtime_supported() || + if (!kvm_arm_pvtime_supported(vcpu->kvm) || attr->attr != KVM_ARM_VCPU_PVTIME_IPA) return -ENXIO;@@ -126,7 +126,7 @@ int kvm_arm_pvtime_has_attr(struct kvm_vcpu *vcpu, { switch (attr->attr) { case KVM_ARM_VCPU_PVTIME_IPA: - if (kvm_arm_pvtime_supported()) + if (kvm_arm_pvtime_supported(vcpu->kvm)) return 0; } return -ENXIO; --2.43.0