mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-02 23:33: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
|
@ -1333,64 +1333,6 @@ void vfio_reset_handler(void *opaque)
|
|||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
struct vfio_device_info *vfio_get_device_info(int fd)
|
||||
{
|
||||
struct vfio_device_info *info;
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include "qemu/chardev_open.h"
|
||||
#include "pci.h"
|
||||
#include "vfio-iommufd.h"
|
||||
#include "vfio-helpers.h"
|
||||
|
||||
#define TYPE_HOST_IOMMU_DEVICE_IOMMUFD_VFIO \
|
||||
TYPE_HOST_IOMMU_DEVICE_IOMMUFD "-vfio"
|
||||
|
|
|
@ -2,6 +2,7 @@ vfio_ss = ss.source_set()
|
|||
vfio_ss.add(files(
|
||||
'common.c',
|
||||
'container.c',
|
||||
'helpers.c',
|
||||
))
|
||||
vfio_ss.add(when: 'CONFIG_PSERIES', if_true: files('spapr.c'))
|
||||
vfio_ss.add(when: 'CONFIG_VFIO_PCI', if_true: files(
|
||||
|
@ -18,7 +19,6 @@ specific_ss.add_all(when: 'CONFIG_VFIO', if_true: vfio_ss)
|
|||
system_ss.add(when: 'CONFIG_VFIO_XGMAC', if_true: files('calxeda-xgmac.c'))
|
||||
system_ss.add(when: 'CONFIG_VFIO_AMD_XGBE', if_true: files('amd-xgbe.c'))
|
||||
system_ss.add(when: 'CONFIG_VFIO', if_true: files(
|
||||
'helpers.c',
|
||||
'container-base.c',
|
||||
'migration.c',
|
||||
'migration-multifd.c',
|
||||
|
|
|
@ -26,4 +26,7 @@ bool vfio_get_info_dma_avail(struct vfio_iommu_type1_info *info,
|
|||
|
||||
int vfio_bitmap_alloc(VFIOBitmap *vbmap, hwaddr size);
|
||||
|
||||
int vfio_kvm_device_add_fd(int fd, Error **errp);
|
||||
int vfio_kvm_device_del_fd(int fd, Error **errp);
|
||||
|
||||
#endif /* HW_VFIO_VFIO_HELPERS_H */
|
||||
|
|
|
@ -130,9 +130,6 @@ bool vfio_attach_device(char *name, VFIODevice *vbasedev,
|
|||
void vfio_detach_device(VFIODevice *vbasedev);
|
||||
VFIODevice *vfio_get_vfio_device(Object *obj);
|
||||
|
||||
int vfio_kvm_device_add_fd(int fd, Error **errp);
|
||||
int vfio_kvm_device_del_fd(int fd, Error **errp);
|
||||
|
||||
bool vfio_cpr_register_container(VFIOContainerBase *bcontainer, Error **errp);
|
||||
void vfio_cpr_unregister_container(VFIOContainerBase *bcontainer);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue