]> xenbits.xensource.com Git - xen.git/commitdiff
libvchan: Read prod/cons only once.
authorKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Thu, 10 Mar 2016 07:27:21 +0000 (08:27 +0100)
committerJan Beulich <jbeulich@suse.com>
Thu, 10 Mar 2016 07:27:21 +0000 (08:27 +0100)
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>
master commit: 7d66a4ba695ab8d13b214fb816dd59e443ae1ec9
master date: 2015-12-18 09:50:02 -0500

tools/libvchan/io.c

index 40d072d3ac8bf83e3a8aeea9b2d0f5971b50c665..47db76bdb64bd9f91ec6e1f7fad6876f21432e1d 100644 (file)
@@ -118,6 +118,7 @@ static inline int send_notify(struct libxenvchan *ctrl, uint8_t bit)
 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. */
@@ -159,6 +160,7 @@ int libxenvchan_data_ready(struct libxenvchan *ctrl)
 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. */