summaryrefslogtreecommitdiff
path: root/include/xen/interface
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>2015-12-21 11:11:12 -0800
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2015-12-21 11:11:12 -0800
commitbfccd95e7aba73d0d3154912b17b855cb9938c50 (patch)
tree3250b7806b873170a3ff7dba0aa1664e57c5bde9 /include/xen/interface
parent252ca494ac75f0dc47469f130d6dc67ed14081f4 (diff)
parent4ef7675344d687a0ef5b0d7c0cee12da005870c0 (diff)
Merge 4.4-rc6 into usb-next
We want the USB and PHY fixes in here as well to make things easier for testing and development. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'include/xen/interface')
-rw-r--r--include/xen/interface/io/ring.h14
1 files changed, 14 insertions, 0 deletions
diff --git a/include/xen/interface/io/ring.h b/include/xen/interface/io/ring.h
index 7d28aff605c7..7dc685b4057d 100644
--- a/include/xen/interface/io/ring.h
+++ b/include/xen/interface/io/ring.h
@@ -181,6 +181,20 @@ struct __name##_back_ring { \
#define RING_GET_REQUEST(_r, _idx) \
(&((_r)->sring->ring[((_idx) & (RING_SIZE(_r) - 1))].req))
+/*
+ * Get a local copy of a request.
+ *
+ * Use this in preference to RING_GET_REQUEST() so all processing is
+ * done on a local copy that cannot be modified by the other end.
+ *
+ * Note that https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58145 may cause this
+ * to be ineffective where _req is a struct which consists of only bitfields.
+ */
+#define RING_COPY_REQUEST(_r, _idx, _req) do { \
+ /* Use volatile to force the copy into _req. */ \
+ *(_req) = *(volatile typeof(_req))RING_GET_REQUEST(_r, _idx); \
+} while (0)
+
#define RING_GET_RESPONSE(_r, _idx) \
(&((_r)->sring->ring[((_idx) & (RING_SIZE(_r) - 1))].rsp))