On Thu, 24 Nov 2022 19:39:20 +0200 Yishai Hadas <yishaih@xxxxxxxxxx> wrote: > +/** > + * VFIO_MIG_GET_PRECOPY_INFO - _IO(VFIO_TYPE, VFIO_BASE + 21) > + * > + * This ioctl is used on the migration data FD in the precopy phase of the > + * migration data transfer. It returns an estimate of the current data sizes > + * remaining to be transferred. It allows the user to judge when it is > + * appropriate to leave PRE_COPY for STOP_COPY. > + * > + * This ioctl is valid only in PRE_COPY states and kernel driver should > + * return -EINVAL from any other migration state. > + * > + * The vfio_precopy_info data structure returned by this ioctl provides > + * estimates of data available from the device during the PRE_COPY states. > + * This estimate is split into two categories, initial_bytes and > + * dirty_bytes. > + * > + * The initial_bytes field indicates the amount of initial mandatory precopy > + * data available from the device. This field should have a non-zero initial > + * value and decrease as migration data is read from the device. > + * It is a must to leave PRE_COPY for STOP_COPY only after this field reach > + * zero. Is this actually a requirement that's compatible with current QEMU behavior? It's my impression that a user can force the migration to move to STOP_COPY at any point in time. Thanks, Alex > + * > + * The dirty_bytes field tracks device state changes relative to data > + * previously retrieved. This field starts at zero and may increase as > + * the internal device state is modified or decrease as that modified > + * state is read from the device. > + * > + * Userspace may use the combination of these fields to estimate the > + * potential data size available during the PRE_COPY phases, as well as > + * trends relative to the rate the device is dirtying its internal > + * state, but these fields are not required to have any bearing relative > + * to the data size available during the STOP_COPY phase. > + * > + * Drivers have a lot of flexibility in when and what they transfer during the > + * PRE_COPY phase, and how they report this from VFIO_MIG_GET_PRECOPY_INFO. > + * > + * During pre-copy the migration data FD has a temporary "end of stream" that is > + * reached when both initial_bytes and dirty_byte are zero. For instance, this > + * may indicate that the device is idle and not currently dirtying any internal > + * state. When read() is done on this temporary end of stream the kernel driver > + * should return ENOMSG from read(). Userspace can wait for more data (which may > + * never come) by using poll. > + * > + * Once in STOP_COPY the migration data FD has a permanent end of stream > + * signaled in the usual way by read() always returning 0 and poll always > + * returning readable. ENOMSG may not be returned in STOP_COPY. Support > + * for this ioctl is optional. > + * > + * Return: 0 on success, -1 and errno set on failure. > + */ > +struct vfio_precopy_info { > + __u32 argsz; > + __u32 flags; > + __aligned_u64 initial_bytes; > + __aligned_u64 dirty_bytes; > }; > > +#define VFIO_MIG_GET_PRECOPY_INFO _IO(VFIO_TYPE, VFIO_BASE + 21) > + > /* > * Upon VFIO_DEVICE_FEATURE_SET, allow the device to be moved into a low power > * state with the platform-based power management. Device use of lower power