Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 935cdee7 authored by Michael S. Tsirkin's avatar Michael S. Tsirkin
Browse files

vhost: avoid backend flush on vring ops



vring changes already do a flush internally where appropriate, so we do
not need a second flush.

It's currently not very expensive but a follow-up patch makes flush more
heavy-weight, so remove the extra flush here to avoid regressing
performance if call or kick fds are changed on data path.

Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
parent 4a7d6455
Loading
Loading
Loading
Loading
+5 −2
Original line number Original line Diff line number Diff line
@@ -942,7 +942,10 @@ static long vhost_net_ioctl(struct file *f, unsigned int ioctl,
		return vhost_net_reset_owner(n);
		return vhost_net_reset_owner(n);
	default:
	default:
		mutex_lock(&n->dev.mutex);
		mutex_lock(&n->dev.mutex);
		r = vhost_dev_ioctl(&n->dev, ioctl, arg);
		r = vhost_dev_ioctl(&n->dev, ioctl, argp);
		if (r == -ENOIOCTLCMD)
			r = vhost_vring_ioctl(&n->dev, ioctl, argp);
		else
			vhost_net_flush(n);
			vhost_net_flush(n);
		mutex_unlock(&n->dev.mutex);
		mutex_unlock(&n->dev.mutex);
		return r;
		return r;
+4 −1
Original line number Original line Diff line number Diff line
@@ -970,7 +970,10 @@ static long vhost_scsi_ioctl(struct file *f, unsigned int ioctl,
		return vhost_scsi_set_features(vs, features);
		return vhost_scsi_set_features(vs, features);
	default:
	default:
		mutex_lock(&vs->dev.mutex);
		mutex_lock(&vs->dev.mutex);
		r = vhost_dev_ioctl(&vs->dev, ioctl, arg);
		r = vhost_dev_ioctl(&vs->dev, ioctl, argp);
		/* TODO: flush backend after dev ioctl. */
		if (r == -ENOIOCTLCMD)
			r = vhost_vring_ioctl(&vs->dev, ioctl, argp);
		mutex_unlock(&vs->dev.mutex);
		mutex_unlock(&vs->dev.mutex);
		return r;
		return r;
	}
	}
+3 −4
Original line number Original line Diff line number Diff line
@@ -607,7 +607,7 @@ static long vhost_set_memory(struct vhost_dev *d, struct vhost_memory __user *m)
	return 0;
	return 0;
}
}


static long vhost_set_vring(struct vhost_dev *d, int ioctl, void __user *argp)
long vhost_vring_ioctl(struct vhost_dev *d, int ioctl, void __user *argp)
{
{
	struct file *eventfp, *filep = NULL;
	struct file *eventfp, *filep = NULL;
	bool pollstart = false, pollstop = false;
	bool pollstart = false, pollstop = false;
@@ -802,9 +802,8 @@ static long vhost_set_vring(struct vhost_dev *d, int ioctl, void __user *argp)
}
}


/* Caller must have device mutex */
/* Caller must have device mutex */
long vhost_dev_ioctl(struct vhost_dev *d, unsigned int ioctl, unsigned long arg)
long vhost_dev_ioctl(struct vhost_dev *d, unsigned int ioctl, void __user *argp)
{
{
	void __user *argp = (void __user *)arg;
	struct file *eventfp, *filep = NULL;
	struct file *eventfp, *filep = NULL;
	struct eventfd_ctx *ctx = NULL;
	struct eventfd_ctx *ctx = NULL;
	u64 p;
	u64 p;
@@ -875,7 +874,7 @@ long vhost_dev_ioctl(struct vhost_dev *d, unsigned int ioctl, unsigned long arg)
			fput(filep);
			fput(filep);
		break;
		break;
	default:
	default:
		r = vhost_set_vring(d, ioctl, argp);
		r = -ENOIOCTLCMD;
		break;
		break;
	}
	}
done:
done:
+2 −1
Original line number Original line Diff line number Diff line
@@ -164,7 +164,8 @@ long vhost_dev_check_owner(struct vhost_dev *);
long vhost_dev_reset_owner(struct vhost_dev *);
long vhost_dev_reset_owner(struct vhost_dev *);
void vhost_dev_cleanup(struct vhost_dev *, bool locked);
void vhost_dev_cleanup(struct vhost_dev *, bool locked);
void vhost_dev_stop(struct vhost_dev *);
void vhost_dev_stop(struct vhost_dev *);
long vhost_dev_ioctl(struct vhost_dev *, unsigned int ioctl, unsigned long arg);
long vhost_dev_ioctl(struct vhost_dev *, unsigned int ioctl, void __user *argp);
long vhost_vring_ioctl(struct vhost_dev *d, int ioctl, void __user *argp);
int vhost_vq_access_ok(struct vhost_virtqueue *vq);
int vhost_vq_access_ok(struct vhost_virtqueue *vq);
int vhost_log_access_ok(struct vhost_dev *);
int vhost_log_access_ok(struct vhost_dev *);