mirror of
https://github.com/torvalds/linux.git
synced 2024-11-28 15:11:31 +00:00
tools/lguest: fix missing rmb().
The virtio spec was missing a barrier in example code, so I went back to look at the lguest code. Indeed, we need one. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
parent
8c6bab4f38
commit
8fd9a6365e
@ -177,6 +177,7 @@ static struct termios orig_term;
|
||||
* in precise order.
|
||||
*/
|
||||
#define wmb() __asm__ __volatile__("" : : : "memory")
|
||||
#define rmb() __asm__ __volatile__("" : : : "memory")
|
||||
#define mb() __asm__ __volatile__("" : : : "memory")
|
||||
|
||||
/* Wrapper for the last available index. Makes it easier to change. */
|
||||
@ -676,6 +677,12 @@ static unsigned wait_for_vq_desc(struct virtqueue *vq,
|
||||
errx(1, "Guest moved used index from %u to %u",
|
||||
last_avail, vq->vring.avail->idx);
|
||||
|
||||
/*
|
||||
* Make sure we read the descriptor number *after* we read the ring
|
||||
* update; don't let the cpu or compiler change the order.
|
||||
*/
|
||||
rmb();
|
||||
|
||||
/*
|
||||
* Grab the next descriptor number they're advertising, and increment
|
||||
* the index we've seen.
|
||||
@ -694,6 +701,12 @@ static unsigned wait_for_vq_desc(struct virtqueue *vq,
|
||||
desc = vq->vring.desc;
|
||||
i = head;
|
||||
|
||||
/*
|
||||
* We have to read the descriptor after we read the descriptor number,
|
||||
* but there's a data dependency there so the CPU shouldn't reorder
|
||||
* that: no rmb() required.
|
||||
*/
|
||||
|
||||
/*
|
||||
* If this is an indirect entry, then this buffer contains a descriptor
|
||||
* table which we handle as if it's any normal descriptor chain.
|
||||
|
Loading…
Reference in New Issue
Block a user