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

Commit 5dade710 authored by Nicholas Bellinger's avatar Nicholas Bellinger
Browse files

tcm_vhost: Avoid VIRTIO_RING_F_EVENT_IDX feature bit



This patch adds a VHOST_SCSI_FEATURES mask minus VIRTIO_RING_F_EVENT_IDX
so that vhost-scsi-pci userspace will strip this feature bit once
GET_FEATURES reports it as being unsupported on the host.

This is to avoid a bug where ->handle_kicks() are missed when EVENT_IDX
is enabled by default in userspace code.

(mst: Rename to VHOST_SCSI_FEATURES + add comment)

Acked-by: default avatarMichael S. Tsirkin <mst@redhat.com>
Reviewed-by: default avatarAsias He <asias@redhat.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
parent 8f27d487
Loading
Loading
Loading
Loading
+11 −2
Original line number Original line Diff line number Diff line
@@ -60,6 +60,15 @@ enum {
	VHOST_SCSI_VQ_IO = 2,
	VHOST_SCSI_VQ_IO = 2,
};
};


/*
 * VIRTIO_RING_F_EVENT_IDX seems broken. Not sure the bug is in
 * kernel but disabling it helps.
 * TODO: debug and remove the workaround.
 */
enum {
	VHOST_SCSI_FEATURES = VHOST_FEATURES & (~VIRTIO_RING_F_EVENT_IDX)
};

#define VHOST_SCSI_MAX_TARGET	256
#define VHOST_SCSI_MAX_TARGET	256
#define VHOST_SCSI_MAX_VQ	128
#define VHOST_SCSI_MAX_VQ	128


@@ -946,7 +955,7 @@ static void vhost_scsi_flush(struct vhost_scsi *vs)


static int vhost_scsi_set_features(struct vhost_scsi *vs, u64 features)
static int vhost_scsi_set_features(struct vhost_scsi *vs, u64 features)
{
{
	if (features & ~VHOST_FEATURES)
	if (features & ~VHOST_SCSI_FEATURES)
		return -EOPNOTSUPP;
		return -EOPNOTSUPP;


	mutex_lock(&vs->dev.mutex);
	mutex_lock(&vs->dev.mutex);
@@ -992,7 +1001,7 @@ static long vhost_scsi_ioctl(struct file *f, unsigned int ioctl,
			return -EFAULT;
			return -EFAULT;
		return 0;
		return 0;
	case VHOST_GET_FEATURES:
	case VHOST_GET_FEATURES:
		features = VHOST_FEATURES;
		features = VHOST_SCSI_FEATURES;
		if (copy_to_user(featurep, &features, sizeof features))
		if (copy_to_user(featurep, &features, sizeof features))
			return -EFAULT;
			return -EFAULT;
		return 0;
		return 0;