Message ID | 1377853388-39470-2-git-send-email-cornelia.huck@de.ibm.com |
---|---|
State | New |
Headers | show |
On 30.08.2013, at 11:03, Cornelia Huck wrote: > The guest side must not manipulate the index for the used buffers. Instead, > remember the state of the used buffer locally and wait until it has moved. > > Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com> Acked-by: Alexander Graf <agraf@suse.de> Christian, do you want to queue this up? Connie, next time for patch sets that only contain a single patch, please don't do a cover letter. However, when you do create a cover letter, please use git format-patch -n, so that it's obvious that this is a patch set from the subject lines :). Alex
On 30/08/13 15:13, Alexander Graf wrote: > > On 30.08.2013, at 11:03, Cornelia Huck wrote: > >> The guest side must not manipulate the index for the used buffers. Instead, >> remember the state of the used buffer locally and wait until it has moved. >> >> Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com> > > Acked-by: Alexander Graf <agraf@suse.de> > > Christian, do you want to queue this up? Either me or Conny. Conny, can you also update the binary rom image in a 2nd patch in that series? Christian
diff --git a/pc-bios/s390-ccw/virtio.c b/pc-bios/s390-ccw/virtio.c index 49f2d29..4d6e48f 100644 --- a/pc-bios/s390-ccw/virtio.c +++ b/pc-bios/s390-ccw/virtio.c @@ -123,6 +123,7 @@ static void vring_init(struct vring *vr, unsigned int num, void *p, /* We're running with interrupts off anyways, so don't bother */ vr->used->flags = VRING_USED_F_NO_NOTIFY; vr->used->idx = 0; + vr->used_idx = 0; debug_print_addr("init vr", vr); } @@ -150,8 +151,6 @@ static void vring_send_buf(struct vring *vr, void *p, int len, int flags) if (!(flags & VRING_DESC_F_NEXT)) { vr->avail->idx++; } - - vr->used->idx = vr->next_idx; } static u64 get_clock(void) @@ -180,7 +179,8 @@ static int vring_wait_reply(struct vring *vr, int timeout) struct subchannel_id schid = vr->schid; int r = 0; - while (vr->used->idx == vr->next_idx) { + /* Wait until the used index has moved. */ + while (vr->used->idx == vr->used_idx) { vring_notify(schid); if (timeout && (get_second() >= target_second)) { r = 1; @@ -189,6 +189,7 @@ static int vring_wait_reply(struct vring *vr, int timeout) yield(); } + vr->used_idx = vr->used->idx; vr->next_idx = 0; vr->desc[0].len = 0; vr->desc[0].flags = 0; diff --git a/pc-bios/s390-ccw/virtio.h b/pc-bios/s390-ccw/virtio.h index 86fdd57..772a63f 100644 --- a/pc-bios/s390-ccw/virtio.h +++ b/pc-bios/s390-ccw/virtio.h @@ -115,6 +115,7 @@ struct vring_used { struct vring { unsigned int num; int next_idx; + int used_idx; struct vring_desc *desc; struct vring_avail *avail; struct vring_used *used;
The guest side must not manipulate the index for the used buffers. Instead, remember the state of the used buffer locally and wait until it has moved. Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com> -- v1 -> v2: Move setting the used index as by Paolo's suggestion --- pc-bios/s390-ccw/virtio.c | 7 ++++--- pc-bios/s390-ccw/virtio.h | 1 + 2 files changed, 5 insertions(+), 3 deletions(-)