|
@@ -25,6 +25,7 @@
|
|
#include "qemu/cutils.h"
|
|
#include "qemu/cutils.h"
|
|
#include "qemu/chardev_open.h"
|
|
#include "qemu/chardev_open.h"
|
|
#include "pci.h"
|
|
#include "pci.h"
|
|
|
|
+#include "exec/ram_addr.h"
|
|
|
|
|
|
static int iommufd_cdev_map(const VFIOContainerBase *bcontainer, hwaddr iova,
|
|
static int iommufd_cdev_map(const VFIOContainerBase *bcontainer, hwaddr iova,
|
|
ram_addr_t size, void *vaddr, bool readonly)
|
|
ram_addr_t size, void *vaddr, bool readonly)
|
|
@@ -146,6 +147,32 @@ err:
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int iommufd_query_dirty_bitmap(const VFIOContainerBase *bcontainer,
|
|
|
|
+ VFIOBitmap *vbmap, hwaddr iova,
|
|
|
|
+ hwaddr size, Error **errp)
|
|
|
|
+{
|
|
|
|
+ VFIOIOMMUFDContainer *container = container_of(bcontainer,
|
|
|
|
+ VFIOIOMMUFDContainer,
|
|
|
|
+ bcontainer);
|
|
|
|
+ unsigned long page_size = qemu_real_host_page_size();
|
|
|
|
+ VFIOIOASHwpt *hwpt;
|
|
|
|
+
|
|
|
|
+ QLIST_FOREACH(hwpt, &container->hwpt_list, next) {
|
|
|
|
+ if (!iommufd_hwpt_dirty_tracking(hwpt)) {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (!iommufd_backend_get_dirty_bitmap(container->be, hwpt->hwpt_id,
|
|
|
|
+ iova, size, page_size,
|
|
|
|
+ (uint64_t *)vbmap->bitmap,
|
|
|
|
+ errp)) {
|
|
|
|
+ return -EINVAL;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
static int iommufd_cdev_getfd(const char *sysfs_path, Error **errp)
|
|
static int iommufd_cdev_getfd(const char *sysfs_path, Error **errp)
|
|
{
|
|
{
|
|
ERRP_GUARD();
|
|
ERRP_GUARD();
|
|
@@ -771,6 +798,7 @@ static void vfio_iommu_iommufd_class_init(ObjectClass *klass, void *data)
|
|
vioc->detach_device = iommufd_cdev_detach;
|
|
vioc->detach_device = iommufd_cdev_detach;
|
|
vioc->pci_hot_reset = iommufd_cdev_pci_hot_reset;
|
|
vioc->pci_hot_reset = iommufd_cdev_pci_hot_reset;
|
|
vioc->set_dirty_page_tracking = iommufd_set_dirty_page_tracking;
|
|
vioc->set_dirty_page_tracking = iommufd_set_dirty_page_tracking;
|
|
|
|
+ vioc->query_dirty_bitmap = iommufd_query_dirty_bitmap;
|
|
};
|
|
};
|
|
|
|
|
|
static bool hiod_iommufd_vfio_realize(HostIOMMUDevice *hiod, void *opaque,
|
|
static bool hiod_iommufd_vfio_realize(HostIOMMUDevice *hiod, void *opaque,
|