mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 12:42:02 +00:00
vhost: scsi: add weight support
This patch will check the weight and exit the loop if we exceeds the
weight. This is useful for preventing scsi kthread from hogging cpu
which is guest triggerable.
This addresses CVE-2019-3900.
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Stefan Hajnoczi <stefanha@redhat.com>
Fixes: 057cbf49a1
("tcm_vhost: Initial merge for vhost level target fabric driver")
Signed-off-by: Jason Wang <jasowang@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
e79b431fb9
commit
c1ea02f15a
@ -918,7 +918,7 @@ vhost_scsi_handle_vq(struct vhost_scsi *vs, struct vhost_virtqueue *vq)
|
|||||||
struct iov_iter in_iter, prot_iter, data_iter;
|
struct iov_iter in_iter, prot_iter, data_iter;
|
||||||
u64 tag;
|
u64 tag;
|
||||||
u32 exp_data_len, data_direction;
|
u32 exp_data_len, data_direction;
|
||||||
int ret, prot_bytes;
|
int ret, prot_bytes, c = 0;
|
||||||
u16 lun;
|
u16 lun;
|
||||||
u8 task_attr;
|
u8 task_attr;
|
||||||
bool t10_pi = vhost_has_feature(vq, VIRTIO_SCSI_F_T10_PI);
|
bool t10_pi = vhost_has_feature(vq, VIRTIO_SCSI_F_T10_PI);
|
||||||
@ -938,7 +938,7 @@ vhost_scsi_handle_vq(struct vhost_scsi *vs, struct vhost_virtqueue *vq)
|
|||||||
|
|
||||||
vhost_disable_notify(&vs->dev, vq);
|
vhost_disable_notify(&vs->dev, vq);
|
||||||
|
|
||||||
for (;;) {
|
do {
|
||||||
ret = vhost_scsi_get_desc(vs, vq, &vc);
|
ret = vhost_scsi_get_desc(vs, vq, &vc);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err;
|
goto err;
|
||||||
@ -1118,7 +1118,7 @@ err:
|
|||||||
break;
|
break;
|
||||||
else if (ret == -EIO)
|
else if (ret == -EIO)
|
||||||
vhost_scsi_send_bad_target(vs, vq, vc.head, vc.out);
|
vhost_scsi_send_bad_target(vs, vq, vc.head, vc.out);
|
||||||
}
|
} while (likely(!vhost_exceeds_weight(vq, ++c, 0)));
|
||||||
out:
|
out:
|
||||||
mutex_unlock(&vq->mutex);
|
mutex_unlock(&vq->mutex);
|
||||||
}
|
}
|
||||||
@ -1177,7 +1177,7 @@ vhost_scsi_ctl_handle_vq(struct vhost_scsi *vs, struct vhost_virtqueue *vq)
|
|||||||
} v_req;
|
} v_req;
|
||||||
struct vhost_scsi_ctx vc;
|
struct vhost_scsi_ctx vc;
|
||||||
size_t typ_size;
|
size_t typ_size;
|
||||||
int ret;
|
int ret, c = 0;
|
||||||
|
|
||||||
mutex_lock(&vq->mutex);
|
mutex_lock(&vq->mutex);
|
||||||
/*
|
/*
|
||||||
@ -1191,7 +1191,7 @@ vhost_scsi_ctl_handle_vq(struct vhost_scsi *vs, struct vhost_virtqueue *vq)
|
|||||||
|
|
||||||
vhost_disable_notify(&vs->dev, vq);
|
vhost_disable_notify(&vs->dev, vq);
|
||||||
|
|
||||||
for (;;) {
|
do {
|
||||||
ret = vhost_scsi_get_desc(vs, vq, &vc);
|
ret = vhost_scsi_get_desc(vs, vq, &vc);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err;
|
goto err;
|
||||||
@ -1270,7 +1270,7 @@ err:
|
|||||||
break;
|
break;
|
||||||
else if (ret == -EIO)
|
else if (ret == -EIO)
|
||||||
vhost_scsi_send_bad_target(vs, vq, vc.head, vc.out);
|
vhost_scsi_send_bad_target(vs, vq, vc.head, vc.out);
|
||||||
}
|
} while (likely(!vhost_exceeds_weight(vq, ++c, 0)));
|
||||||
out:
|
out:
|
||||||
mutex_unlock(&vq->mutex);
|
mutex_unlock(&vq->mutex);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user