[PATCH 31/34] xenbus: use __smp_xxx barriers

Michael S. Tsirkin
2015-12-30T21:53:31Z

drivers/xen/xenbus/xenbus_comms.c uses
full memory barriers to communicate with the other side.

For guests compiled with CONFIG_SMP, smp_wmb and smp_mb
would be sufficient, so mb() and wmb() here are only needed if
a non-SMP guest runs on an SMP host.

Switch to __smp_XXX barriers which serve this exact purpose.

Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---

This is straight-forward, but untested.
I can either merge this patchset through my tree if this is
acked, or defer this and merge the patchset first,
and xen bits through xen tree afterwards.

Pls let me know.

drivers/xen/xenbus/xenbus_comms.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/xen/xenbus/xenbus_comms.c b/drivers/xen/xenbus/xenbus_comms.c
index fdb0f33..09b17c7 100644
--- a/drivers/xen/xenbus/xenbus_comms.c
+++ b/drivers/xen/xenbus/xenbus_comms.c
@@ -123,14 +123,14 @@ int xb_write(const void *data, unsigned len)
avail = len;

/* Must write data /after/ reading the consumer index. */
- mb();
+ __smp_mb();

memcpy(dst, data, avail);
data += avail;
len -= avail;

/* Other side must not see new producer until data is there. */
- wmb();
+ __smp_wmb();
intf->req_prod += avail;

/* Implies mb(): other side will see the updated producer. */
@@ -180,14 +180,14 @@ int xb_read(void *data, unsigned len)
avail = len;

/* Must read data /after/ reading the producer index. */
- rmb();
+ __smp_rmb();

memcpy(data, src, avail);
data += avail;
len -= avail;

/* Other side must not see free space until we've copied out */
- mb();
+ __smp_mb();
intf->rsp_cons += avail;

pr_debug("Finished read of %i bytes (%i to go)\n", avail, len);
--
MST