Commit 41808a72 authored by jiangdongxu's avatar jiangdongxu
Browse files

vhost-vdpa: add uAPI for logging

virt inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I86ITO



----------------------------------------------------------------------

These new ioctl add support for setting bitmaps config,
like base address and buffer size from userspace.

When setup migration, VMM will call VHOST_SET_LOG_BASE and
VHOST_SET_LOG_SIZE to set address and size of buffer used
for storing bitmaps.

Then VMM start live migration, VMM will enable logging
vhost device by set feature VHOST_F_LOG_ALL.

And during live migration iterate, VMM get dirty page info
from vhost device by calling VHOST_LOG_SYNC.

Signed-off-by: default avatarjiangdongxu <jiangdongxu1@huawei.com>
parent 690cc4a9
Loading
Loading
Loading
Loading
+49 −0
Original line number Diff line number Diff line
@@ -567,6 +567,47 @@ static long vhost_vdpa_resume(struct vhost_vdpa *v)
	return ops->resume(vdpa);
}

static long vhost_vdpa_set_log_base(struct vhost_vdpa *v, u64 __user *argp)
{
	struct vdpa_device *vdpa = v->vdpa;
	const struct vdpa_config_ops *ops = vdpa->config;
	u64 log;

	if (!ops->set_log_base)
		return -EOPNOTSUPP;

	if (copy_from_user(&log, argp, sizeof(uint64_t)))
		return -EFAULT;

	return ops->set_log_base(vdpa, log);
}

static long vhost_vdpa_set_log_size(struct vhost_vdpa *v, u64 __user *sizep)
{
	struct vdpa_device *vdpa = v->vdpa;
	const struct vdpa_config_ops *ops = vdpa->config;
	u64 log_size;

	if (!ops->set_log_size)
		return -EOPNOTSUPP;

	if (copy_from_user(&log_size, sizep, sizeof(log_size)))
		return -EFAULT;

	return ops->set_log_size(vdpa, log_size);
}

static long vhost_vdpa_log_sync(struct vhost_vdpa *v)
{
	struct vdpa_device *vdpa = v->vdpa;
	const struct vdpa_config_ops *ops = vdpa->config;

	if (!ops->log_sync)
		return -EOPNOTSUPP;

	return ops->log_sync(vdpa);
}

static long vhost_vdpa_vring_ioctl(struct vhost_vdpa *v, unsigned int cmd,
				   void __user *argp)
{
@@ -738,6 +779,14 @@ static long vhost_vdpa_unlocked_ioctl(struct file *filep,
			r = -EFAULT;
		break;
	case VHOST_SET_LOG_BASE:
		r = vhost_vdpa_set_log_base(v, argp);
		break;
	case VHOST_SET_LOG_SIZE:
		r = vhost_vdpa_set_log_size(v, argp);
		break;
	case VHOST_LOG_SYNC:
		r = vhost_vdpa_log_sync(v);
		break;
	case VHOST_SET_LOG_FD:
		r = -ENOIOCTLCMD;
		break;
+4 −0
Original line number Diff line number Diff line
@@ -43,6 +43,10 @@
 * The bit is set using an atomic 32 bit operation. */
/* Set base address for logging. */
#define VHOST_SET_LOG_BASE _IOW(VHOST_VIRTIO, 0x04, __u64)
/* Set buffer size for logging */
#define VHOST_SET_LOG_SIZE _IOW(VHOST_VIRTIO, 0x05, __u64)
/* Synchronize logging buffer from kernel space to user space */
#define VHOST_LOG_SYNC _IO(VHOST_VIRTIO, 0x06)
/* Specify an eventfd file descriptor to signal on log write. */
#define VHOST_SET_LOG_FD _IOW(VHOST_VIRTIO, 0x07, int)