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:
parent
7d45285fc9
commit
d0a073a186
@ -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
|
||||||
|
21
kvm-all.c
21
kvm-all.c
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user