Commit 1fe9b6fe authored by Michael S. Tsirkin's avatar Michael S. Tsirkin Committed by Linus Torvalds

virtio: fix oops on OOM

virtio ring was changed to return an error code on OOM,
but one caller was missed and still checks for vq->vring.num.
The fix is just to check for <0 error code.

Long term it might make sense to change goto add_head to
just return an error on oom instead, but let's apply
a minimal fix for 2.6.35.
Reported-by: default avatarChris Mason <chris.mason@oracle.com>
Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
Tested-by: default avatarChris Mason <chris.mason@oracle.com>
Cc: stable@kernel.org # .34.x
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 2e65a207
...@@ -164,7 +164,8 @@ int virtqueue_add_buf_gfp(struct virtqueue *_vq, ...@@ -164,7 +164,8 @@ int virtqueue_add_buf_gfp(struct virtqueue *_vq,
gfp_t gfp) gfp_t gfp)
{ {
struct vring_virtqueue *vq = to_vvq(_vq); struct vring_virtqueue *vq = to_vvq(_vq);
unsigned int i, avail, head, uninitialized_var(prev); unsigned int i, avail, uninitialized_var(prev);
int head;
START_USE(vq); START_USE(vq);
...@@ -174,7 +175,7 @@ int virtqueue_add_buf_gfp(struct virtqueue *_vq, ...@@ -174,7 +175,7 @@ int virtqueue_add_buf_gfp(struct virtqueue *_vq,
* buffers, then go indirect. FIXME: tune this threshold */ * buffers, then go indirect. FIXME: tune this threshold */
if (vq->indirect && (out + in) > 1 && vq->num_free) { if (vq->indirect && (out + in) > 1 && vq->num_free) {
head = vring_add_indirect(vq, sg, out, in, gfp); head = vring_add_indirect(vq, sg, out, in, gfp);
if (head != vq->vring.num) if (likely(head >= 0))
goto add_head; goto add_head;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment