mirror of https://github.com/xemu-project/xemu.git
vfio: Add Error** argument to .set_dirty_page_tracking() handler
We will use the Error object to improve error reporting in the .log_global*() handlers of VFIO. Add documentation while at it. Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Reviewed-by: Avihai Horon <avihaih@nvidia.com> Reviewed-by: Eric Auger <eric.auger@redhat.com> Signed-off-by: Cédric Le Goater <clg@redhat.com>
This commit is contained in:
parent
85ef20f167
commit
836bb30868
|
@ -1076,7 +1076,7 @@ static bool vfio_listener_log_global_start(MemoryListener *listener,
|
||||||
if (vfio_devices_all_device_dirty_tracking(bcontainer)) {
|
if (vfio_devices_all_device_dirty_tracking(bcontainer)) {
|
||||||
ret = vfio_devices_dma_logging_start(bcontainer);
|
ret = vfio_devices_dma_logging_start(bcontainer);
|
||||||
} else {
|
} else {
|
||||||
ret = vfio_container_set_dirty_page_tracking(bcontainer, true);
|
ret = vfio_container_set_dirty_page_tracking(bcontainer, true, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
@ -1096,7 +1096,7 @@ static void vfio_listener_log_global_stop(MemoryListener *listener)
|
||||||
if (vfio_devices_all_device_dirty_tracking(bcontainer)) {
|
if (vfio_devices_all_device_dirty_tracking(bcontainer)) {
|
||||||
vfio_devices_dma_logging_stop(bcontainer);
|
vfio_devices_dma_logging_stop(bcontainer);
|
||||||
} else {
|
} else {
|
||||||
ret = vfio_container_set_dirty_page_tracking(bcontainer, false);
|
ret = vfio_container_set_dirty_page_tracking(bcontainer, false, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
|
|
@ -53,14 +53,14 @@ void vfio_container_del_section_window(VFIOContainerBase *bcontainer,
|
||||||
}
|
}
|
||||||
|
|
||||||
int vfio_container_set_dirty_page_tracking(VFIOContainerBase *bcontainer,
|
int vfio_container_set_dirty_page_tracking(VFIOContainerBase *bcontainer,
|
||||||
bool start)
|
bool start, Error **errp)
|
||||||
{
|
{
|
||||||
if (!bcontainer->dirty_pages_supported) {
|
if (!bcontainer->dirty_pages_supported) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_assert(bcontainer->ops->set_dirty_page_tracking);
|
g_assert(bcontainer->ops->set_dirty_page_tracking);
|
||||||
return bcontainer->ops->set_dirty_page_tracking(bcontainer, start);
|
return bcontainer->ops->set_dirty_page_tracking(bcontainer, start, errp);
|
||||||
}
|
}
|
||||||
|
|
||||||
int vfio_container_query_dirty_bitmap(const VFIOContainerBase *bcontainer,
|
int vfio_container_query_dirty_bitmap(const VFIOContainerBase *bcontainer,
|
||||||
|
|
|
@ -209,7 +209,7 @@ static int vfio_legacy_dma_map(const VFIOContainerBase *bcontainer, hwaddr iova,
|
||||||
|
|
||||||
static int
|
static int
|
||||||
vfio_legacy_set_dirty_page_tracking(const VFIOContainerBase *bcontainer,
|
vfio_legacy_set_dirty_page_tracking(const VFIOContainerBase *bcontainer,
|
||||||
bool start)
|
bool start, Error **errp)
|
||||||
{
|
{
|
||||||
const VFIOContainer *container = container_of(bcontainer, VFIOContainer,
|
const VFIOContainer *container = container_of(bcontainer, VFIOContainer,
|
||||||
bcontainer);
|
bcontainer);
|
||||||
|
@ -227,8 +227,8 @@ vfio_legacy_set_dirty_page_tracking(const VFIOContainerBase *bcontainer,
|
||||||
ret = ioctl(container->fd, VFIO_IOMMU_DIRTY_PAGES, &dirty);
|
ret = ioctl(container->fd, VFIO_IOMMU_DIRTY_PAGES, &dirty);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
ret = -errno;
|
ret = -errno;
|
||||||
error_report("Failed to set dirty tracking flag 0x%x errno: %d",
|
error_setg_errno(errp, errno, "Failed to set dirty tracking flag 0x%x",
|
||||||
dirty.flags, errno);
|
dirty.flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -82,7 +82,7 @@ int vfio_container_add_section_window(VFIOContainerBase *bcontainer,
|
||||||
void vfio_container_del_section_window(VFIOContainerBase *bcontainer,
|
void vfio_container_del_section_window(VFIOContainerBase *bcontainer,
|
||||||
MemoryRegionSection *section);
|
MemoryRegionSection *section);
|
||||||
int vfio_container_set_dirty_page_tracking(VFIOContainerBase *bcontainer,
|
int vfio_container_set_dirty_page_tracking(VFIOContainerBase *bcontainer,
|
||||||
bool start);
|
bool start, Error **errp);
|
||||||
int vfio_container_query_dirty_bitmap(const VFIOContainerBase *bcontainer,
|
int vfio_container_query_dirty_bitmap(const VFIOContainerBase *bcontainer,
|
||||||
VFIOBitmap *vbmap,
|
VFIOBitmap *vbmap,
|
||||||
hwaddr iova, hwaddr size);
|
hwaddr iova, hwaddr size);
|
||||||
|
@ -121,9 +121,23 @@ struct VFIOIOMMUClass {
|
||||||
int (*attach_device)(const char *name, VFIODevice *vbasedev,
|
int (*attach_device)(const char *name, VFIODevice *vbasedev,
|
||||||
AddressSpace *as, Error **errp);
|
AddressSpace *as, Error **errp);
|
||||||
void (*detach_device)(VFIODevice *vbasedev);
|
void (*detach_device)(VFIODevice *vbasedev);
|
||||||
|
|
||||||
/* migration feature */
|
/* migration feature */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @set_dirty_page_tracking
|
||||||
|
*
|
||||||
|
* Start or stop dirty pages tracking on VFIO container
|
||||||
|
*
|
||||||
|
* @bcontainer: #VFIOContainerBase on which to de/activate dirty
|
||||||
|
* page tracking
|
||||||
|
* @start: indicates whether to start or stop dirty pages tracking
|
||||||
|
* @errp: pointer to Error*, to store an error if it happens.
|
||||||
|
*
|
||||||
|
* Returns zero to indicate success and negative for error
|
||||||
|
*/
|
||||||
int (*set_dirty_page_tracking)(const VFIOContainerBase *bcontainer,
|
int (*set_dirty_page_tracking)(const VFIOContainerBase *bcontainer,
|
||||||
bool start);
|
bool start, Error **errp);
|
||||||
int (*query_dirty_bitmap)(const VFIOContainerBase *bcontainer,
|
int (*query_dirty_bitmap)(const VFIOContainerBase *bcontainer,
|
||||||
VFIOBitmap *vbmap,
|
VFIOBitmap *vbmap,
|
||||||
hwaddr iova, hwaddr size);
|
hwaddr iova, hwaddr size);
|
||||||
|
|
Loading…
Reference in New Issue