mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 00:03:54 -06:00
vfio: Move vfio_kvm_device_add/del_fd() to helpers.c
vfio_kvm_device_add/del_fd() are low level routines. Move them with the other helpers. Reviewed-by: Zhenzhong Duan <zhenzhong.duan@intel.com> Reviewed-by: John Levon <john.levon@nutanix.com> Link: https://lore.kernel.org/qemu-devel/20250318095415.670319-18-clg@redhat.com Link: https://lore.kernel.org/qemu-devel/20250326075122.1299361-19-clg@redhat.com Signed-off-by: Cédric Le Goater <clg@redhat.com>
This commit is contained in:
parent
f6d7f5d02b
commit
545256134f
6 changed files with 64 additions and 62 deletions
|
@ -22,6 +22,7 @@
|
|||
#include "qemu/osdep.h"
|
||||
#include <sys/ioctl.h>
|
||||
|
||||
#include "system/kvm.h"
|
||||
#include "hw/vfio/vfio-common.h"
|
||||
#include "hw/vfio/pci.h"
|
||||
#include "hw/hw.h"
|
||||
|
@ -253,6 +254,64 @@ bool vfio_get_info_dma_avail(struct vfio_iommu_type1_info *info,
|
|||
return true;
|
||||
}
|
||||
|
||||
int vfio_kvm_device_add_fd(int fd, Error **errp)
|
||||
{
|
||||
#ifdef CONFIG_KVM
|
||||
struct kvm_device_attr attr = {
|
||||
.group = KVM_DEV_VFIO_FILE,
|
||||
.attr = KVM_DEV_VFIO_FILE_ADD,
|
||||
.addr = (uint64_t)(unsigned long)&fd,
|
||||
};
|
||||
|
||||
if (!kvm_enabled()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (vfio_kvm_device_fd < 0) {
|
||||
struct kvm_create_device cd = {
|
||||
.type = KVM_DEV_TYPE_VFIO,
|
||||
};
|
||||
|
||||
if (kvm_vm_ioctl(kvm_state, KVM_CREATE_DEVICE, &cd)) {
|
||||
error_setg_errno(errp, errno, "Failed to create KVM VFIO device");
|
||||
return -errno;
|
||||
}
|
||||
|
||||
vfio_kvm_device_fd = cd.fd;
|
||||
}
|
||||
|
||||
if (ioctl(vfio_kvm_device_fd, KVM_SET_DEVICE_ATTR, &attr)) {
|
||||
error_setg_errno(errp, errno, "Failed to add fd %d to KVM VFIO device",
|
||||
fd);
|
||||
return -errno;
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
int vfio_kvm_device_del_fd(int fd, Error **errp)
|
||||
{
|
||||
#ifdef CONFIG_KVM
|
||||
struct kvm_device_attr attr = {
|
||||
.group = KVM_DEV_VFIO_FILE,
|
||||
.attr = KVM_DEV_VFIO_FILE_DEL,
|
||||
.addr = (uint64_t)(unsigned long)&fd,
|
||||
};
|
||||
|
||||
if (vfio_kvm_device_fd < 0) {
|
||||
error_setg(errp, "KVM VFIO device isn't created yet");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (ioctl(vfio_kvm_device_fd, KVM_SET_DEVICE_ATTR, &attr)) {
|
||||
error_setg_errno(errp, errno,
|
||||
"Failed to remove fd %d from KVM VFIO device", fd);
|
||||
return -errno;
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
int vfio_get_dev_region_info(VFIODevice *vbasedev, uint32_t type,
|
||||
uint32_t subtype, struct vfio_region_info **info)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue