mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-08 02:03:56 -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 *vfio_get_device_info(int fd)
|
||||||
{
|
{
|
||||||
struct vfio_device_info *info;
|
struct vfio_device_info *info;
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
|
|
||||||
|
#include "system/kvm.h"
|
||||||
#include "hw/vfio/vfio-common.h"
|
#include "hw/vfio/vfio-common.h"
|
||||||
#include "hw/vfio/pci.h"
|
#include "hw/vfio/pci.h"
|
||||||
#include "hw/hw.h"
|
#include "hw/hw.h"
|
||||||
|
@ -253,6 +254,64 @@ bool vfio_get_info_dma_avail(struct vfio_iommu_type1_info *info,
|
||||||
return true;
|
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,
|
int vfio_get_dev_region_info(VFIODevice *vbasedev, uint32_t type,
|
||||||
uint32_t subtype, struct vfio_region_info **info)
|
uint32_t subtype, struct vfio_region_info **info)
|
||||||
{
|
{
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
#include "qemu/chardev_open.h"
|
#include "qemu/chardev_open.h"
|
||||||
#include "pci.h"
|
#include "pci.h"
|
||||||
#include "vfio-iommufd.h"
|
#include "vfio-iommufd.h"
|
||||||
|
#include "vfio-helpers.h"
|
||||||
|
|
||||||
#define TYPE_HOST_IOMMU_DEVICE_IOMMUFD_VFIO \
|
#define TYPE_HOST_IOMMU_DEVICE_IOMMUFD_VFIO \
|
||||||
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(
|
vfio_ss.add(files(
|
||||||
'common.c',
|
'common.c',
|
||||||
'container.c',
|
'container.c',
|
||||||
|
'helpers.c',
|
||||||
))
|
))
|
||||||
vfio_ss.add(when: 'CONFIG_PSERIES', if_true: files('spapr.c'))
|
vfio_ss.add(when: 'CONFIG_PSERIES', if_true: files('spapr.c'))
|
||||||
vfio_ss.add(when: 'CONFIG_VFIO_PCI', if_true: files(
|
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_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_AMD_XGBE', if_true: files('amd-xgbe.c'))
|
||||||
system_ss.add(when: 'CONFIG_VFIO', if_true: files(
|
system_ss.add(when: 'CONFIG_VFIO', if_true: files(
|
||||||
'helpers.c',
|
|
||||||
'container-base.c',
|
'container-base.c',
|
||||||
'migration.c',
|
'migration.c',
|
||||||
'migration-multifd.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_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 */
|
#endif /* HW_VFIO_VFIO_HELPERS_H */
|
||||||
|
|
|
@ -130,9 +130,6 @@ bool vfio_attach_device(char *name, VFIODevice *vbasedev,
|
||||||
void vfio_detach_device(VFIODevice *vbasedev);
|
void vfio_detach_device(VFIODevice *vbasedev);
|
||||||
VFIODevice *vfio_get_vfio_device(Object *obj);
|
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);
|
bool vfio_cpr_register_container(VFIOContainerBase *bcontainer, Error **errp);
|
||||||
void vfio_cpr_unregister_container(VFIOContainerBase *bcontainer);
|
void vfio_cpr_unregister_container(VFIOContainerBase *bcontainer);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue