aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason Wang <jasowang@redhat.com>2019-05-17 00:29:52 -0400
committerMichael S. Tsirkin <mst@redhat.com>2019-05-27 11:08:23 -0400
commitc1ea02f15ab5efb3e93fc3144d895410bf79fcf2 (patch)
tree5953d50a42d2f086a21d6f9cfe8f97d4f6b6b7e3
parente79b431fb901ba1106670bcc80b9b617b25def7d (diff)
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: 057cbf49a1f0 ("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>
-rw-r--r--drivers/vhost/scsi.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/drivers/vhost/scsi.c b/drivers/vhost/scsi.c
index 27c9dac9f518..a9caf1bc3c3e 100644
--- a/drivers/vhost/scsi.c
+++ b/drivers/vhost/scsi.c
@@ -918,7 +918,7 @@ vhost_scsi_handle_vq(struct vhost_scsi *vs, struct vhost_virtqueue *vq)
918 struct iov_iter in_iter, prot_iter, data_iter; 918 struct iov_iter in_iter, prot_iter, data_iter;
919 u64 tag; 919 u64 tag;
920 u32 exp_data_len, data_direction; 920 u32 exp_data_len, data_direction;
921 int ret, prot_bytes; 921 int ret, prot_bytes, c = 0;
922 u16 lun; 922 u16 lun;
923 u8 task_attr; 923 u8 task_attr;
924 bool t10_pi = vhost_has_feature(vq, VIRTIO_SCSI_F_T10_PI); 924 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)
938 938
939 vhost_disable_notify(&vs->dev, vq); 939 vhost_disable_notify(&vs->dev, vq);
940 940
941 for (;;) { 941 do {
942 ret = vhost_scsi_get_desc(vs, vq, &vc); 942 ret = vhost_scsi_get_desc(vs, vq, &vc);
943 if (ret) 943 if (ret)
944 goto err; 944 goto err;
@@ -1118,7 +1118,7 @@ err:
1118 break; 1118 break;
1119 else if (ret == -EIO) 1119 else if (ret == -EIO)
1120 vhost_scsi_send_bad_target(vs, vq, vc.head, vc.out); 1120 vhost_scsi_send_bad_target(vs, vq, vc.head, vc.out);
1121 } 1121 } while (likely(!vhost_exceeds_weight(vq, ++c, 0)));
1122out: 1122out:
1123 mutex_unlock(&vq->mutex); 1123 mutex_unlock(&vq->mutex);
1124} 1124}
@@ -1177,7 +1177,7 @@ vhost_scsi_ctl_handle_vq(struct vhost_scsi *vs, struct vhost_virtqueue *vq)
1177 } v_req; 1177 } v_req;
1178 struct vhost_scsi_ctx vc; 1178 struct vhost_scsi_ctx vc;
1179 size_t typ_size; 1179 size_t typ_size;
1180 int ret; 1180 int ret, c = 0;
1181 1181
1182 mutex_lock(&vq->mutex); 1182 mutex_lock(&vq->mutex);
1183 /* 1183 /*
@@ -1191,7 +1191,7 @@ vhost_scsi_ctl_handle_vq(struct vhost_scsi *vs, struct vhost_virtqueue *vq)
1191 1191
1192 vhost_disable_notify(&vs->dev, vq); 1192 vhost_disable_notify(&vs->dev, vq);
1193 1193
1194 for (;;) { 1194 do {
1195 ret = vhost_scsi_get_desc(vs, vq, &vc); 1195 ret = vhost_scsi_get_desc(vs, vq, &vc);
1196 if (ret) 1196 if (ret)
1197 goto err; 1197 goto err;
@@ -1270,7 +1270,7 @@ err:
1270 break; 1270 break;
1271 else if (ret == -EIO) 1271 else if (ret == -EIO)
1272 vhost_scsi_send_bad_target(vs, vq, vc.head, vc.out); 1272 vhost_scsi_send_bad_target(vs, vq, vc.head, vc.out);
1273 } 1273 } while (likely(!vhost_exceeds_weight(vq, ++c, 0)));
1274out: 1274out:
1275 mutex_unlock(&vq->mutex); 1275 mutex_unlock(&vq->mutex);
1276} 1276}