39 lines
1.6 KiB
Diff
39 lines
1.6 KiB
Diff
|
From c1fce65e2b720684ea6ba76ae59921542bd154bb Mon Sep 17 00:00:00 2001
|
||
|
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
||
|
Date: Fri, 20 Nov 2015 12:22:14 -0500
|
||
|
Subject: [PATCH 3/3] libvchan: Read prod/cons only once.
|
||
|
|
||
|
We must ensure that the prod/cons are only read once and that
|
||
|
the compiler won't try to optimize the reads. That is split
|
||
|
the read of these in multiple instructions influencing later
|
||
|
branch code. As such insert barriers when fetching the cons
|
||
|
and prod index.
|
||
|
|
||
|
This is part of XSA155.
|
||
|
|
||
|
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
||
|
---
|
||
|
tools/libvchan/io.c | 2 ++
|
||
|
1 file changed, 2 insertions(+)
|
||
|
|
||
|
Index: xen-4.6.0-testing/tools/libvchan/io.c
|
||
|
===================================================================
|
||
|
--- xen-4.6.0-testing.orig/tools/libvchan/io.c
|
||
|
+++ xen-4.6.0-testing/tools/libvchan/io.c
|
||
|
@@ -117,6 +117,7 @@ static inline int send_notify(struct lib
|
||
|
static inline int raw_get_data_ready(struct libxenvchan *ctrl)
|
||
|
{
|
||
|
uint32_t ready = rd_prod(ctrl) - rd_cons(ctrl);
|
||
|
+ xen_mb(); /* Ensure 'ready' is read only once. */
|
||
|
if (ready > rd_ring_size(ctrl))
|
||
|
/* We have no way to return errors. Locking up the ring is
|
||
|
* better than the alternatives. */
|
||
|
@@ -158,6 +159,7 @@ int libxenvchan_data_ready(struct libxen
|
||
|
static inline int raw_get_buffer_space(struct libxenvchan *ctrl)
|
||
|
{
|
||
|
uint32_t ready = wr_ring_size(ctrl) - (wr_prod(ctrl) - wr_cons(ctrl));
|
||
|
+ xen_mb(); /* Ensure 'ready' is read only once. */
|
||
|
if (ready > wr_ring_size(ctrl))
|
||
|
/* We have no way to return errors. Locking up the ring is
|
||
|
* better than the alternatives. */
|