kvm: encapsulate HAS_DEVICE for vm attrs

More and more virtual machine specifics between kvm and qemu will be
transferred with vm attributes.
So we encapsulate the common logic in a generic function.

Additionally we need only to check during initialization if kvm supports
virtual machine attributes.

Cc: Paolo Bonzini <pbonzini@redhat.com>
Suggested-by: Thomas Huth <thuth@linux.vnet.ibm.com>
Reviewed-by: Thomas Huth <thuth@linux.vnet.ibm.com>
Signed-off-by: Dominik Dingel <dingel@linux.vnet.ibm.com>
Signed-off-by: Jens Freimann <jfrei@linux.vnet.ibm.com>
Message-Id: <1426164834-38648-2-git-send-email-jfrei@linux.vnet.ibm.com>
Acked-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
This commit is contained in:
Dominik Dingel 2015-03-12 13:53:49 +01:00 committed by Cornelia Huck
parent 7d45285fc9
commit d0a073a186
2 changed files with 33 additions and 0 deletions

View File

@ -224,6 +224,18 @@ int kvm_vcpu_ioctl(CPUState *cpu, int type, ...);
*/ */
int kvm_device_ioctl(int fd, int type, ...); int kvm_device_ioctl(int fd, int type, ...);
/**
* kvm_vm_check_attr - check for existence of a specific vm attribute
* @s: The KVMState pointer
* @group: the group
* @attr: the attribute of that group to query for
*
* Returns: 1 if the attribute exists
* 0 if the attribute either does not exist or if the vm device
* interface is unavailable
*/
int kvm_vm_check_attr(KVMState *s, uint32_t group, uint64_t attr);
/** /**
* kvm_create_device - create a KVM device for the device control API * kvm_create_device - create a KVM device for the device control API
* @KVMState: The KVMState pointer * @KVMState: The KVMState pointer

View File

@ -126,6 +126,7 @@ bool kvm_gsi_routing_allowed;
bool kvm_gsi_direct_mapping; bool kvm_gsi_direct_mapping;
bool kvm_allowed; bool kvm_allowed;
bool kvm_readonly_mem_allowed; bool kvm_readonly_mem_allowed;
bool kvm_vm_attributes_allowed;
static const KVMCapabilityInfo kvm_required_capabilites[] = { static const KVMCapabilityInfo kvm_required_capabilites[] = {
KVM_CAP_INFO(USER_MEMORY), KVM_CAP_INFO(USER_MEMORY),
@ -1598,6 +1599,9 @@ static int kvm_init(MachineState *ms)
kvm_resamplefds_allowed = kvm_resamplefds_allowed =
(kvm_check_extension(s, KVM_CAP_IRQFD_RESAMPLE) > 0); (kvm_check_extension(s, KVM_CAP_IRQFD_RESAMPLE) > 0);
kvm_vm_attributes_allowed =
(kvm_check_extension(s, KVM_CAP_VM_ATTRIBUTES) > 0);
ret = kvm_arch_init(ms, s); ret = kvm_arch_init(ms, s);
if (ret < 0) { if (ret < 0) {
goto err; goto err;
@ -1936,6 +1940,23 @@ int kvm_device_ioctl(int fd, int type, ...)
return ret; return ret;
} }
int kvm_vm_check_attr(KVMState *s, uint32_t group, uint64_t attr)
{
int ret;
struct kvm_device_attr attribute = {
.group = group,
.attr = attr,
};
if (!kvm_vm_attributes_allowed) {
return 0;
}
ret = kvm_vm_ioctl(s, KVM_HAS_DEVICE_ATTR, &attribute);
/* kvm returns 0 on success for HAS_DEVICE_ATTR */
return ret ? 0 : 1;
}
int kvm_has_sync_mmu(void) int kvm_has_sync_mmu(void)
{ {
return kvm_check_extension(kvm_state, KVM_CAP_SYNC_MMU); return kvm_check_extension(kvm_state, KVM_CAP_SYNC_MMU);