aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/hyperv/vmbus/vmbus_br.c31
-rw-r--r--sys/dev/hyperv/vmbus/vmbus_brvar.h6
2 files changed, 21 insertions, 16 deletions
diff --git a/sys/dev/hyperv/vmbus/vmbus_br.c b/sys/dev/hyperv/vmbus/vmbus_br.c
index 7311f87fd596..c3771f2607b9 100644
--- a/sys/dev/hyperv/vmbus/vmbus_br.c
+++ b/sys/dev/hyperv/vmbus/vmbus_br.c
@@ -142,8 +142,8 @@ vmbus_rxbr_avail(const struct vmbus_rxbr *rbr)
uint32_t rindex, windex;
/* Get snapshot */
- rindex = rbr->rxbr_rindex;
- windex = rbr->rxbr_windex;
+ rindex = atomic_load_acq_32(&rbr->rxbr_rindex);
+ windex = atomic_load_acq_32(&rbr->rxbr_windex);
return (rbr->rxbr_dsize -
VMBUS_BR_WAVAIL(rindex, windex, rbr->rxbr_dsize));
@@ -289,7 +289,7 @@ vmbus_txbr_need_signal(const struct vmbus_txbr *tbr, uint32_t old_windex)
* This is the only case we need to signal when the
* ring transitions from being empty to non-empty.
*/
- if (old_windex == tbr->txbr_rindex)
+ if (old_windex == atomic_load_acq_32(&tbr->txbr_rindex))
return (TRUE);
return (FALSE);
@@ -301,8 +301,8 @@ vmbus_txbr_avail(const struct vmbus_txbr *tbr)
uint32_t rindex, windex;
/* Get snapshot */
- rindex = tbr->txbr_rindex;
- windex = tbr->txbr_windex;
+ rindex = atomic_load_acq_32(&tbr->txbr_rindex);
+ windex = atomic_load_acq_32(&tbr->txbr_windex);
return VMBUS_BR_WAVAIL(rindex, windex, tbr->txbr_dsize);
}
@@ -427,7 +427,7 @@ vmbus_txbr_write_call(struct vmbus_txbr *tbr,
* is copied.
*/
__compiler_membar();
- tbr->txbr_windex = windex;
+ atomic_store_rel_32(&tbr->txbr_windex, windex);
mtx_unlock_spin(&tbr->txbr_lock);
@@ -471,7 +471,7 @@ vmbus_txbr_write(struct vmbus_txbr *tbr, const struct iovec iov[], int iovlen,
}
/* Save br_windex for later use */
- old_windex = tbr->txbr_windex;
+ old_windex = atomic_load_acq_32(&tbr->txbr_windex);
/*
* Copy the scattered channel packet to the TX bufring.
@@ -494,7 +494,7 @@ vmbus_txbr_write(struct vmbus_txbr *tbr, const struct iovec iov[], int iovlen,
* is copied.
*/
__compiler_membar();
- tbr->txbr_windex = windex;
+ atomic_store_rel_32(&tbr->txbr_windex, windex);
mtx_unlock_spin(&tbr->txbr_lock);
@@ -557,7 +557,8 @@ vmbus_rxbr_peek(struct vmbus_rxbr *rbr, void *data, int dlen)
mtx_unlock_spin(&rbr->rxbr_lock);
return (EAGAIN);
}
- vmbus_rxbr_copyfrom(rbr, rbr->rxbr_rindex, data, dlen);
+ vmbus_rxbr_copyfrom(rbr,
+ atomic_load_acq_32(&rbr->rxbr_rindex), data, dlen);
mtx_unlock_spin(&rbr->rxbr_lock);
@@ -622,10 +623,11 @@ vmbus_rxbr_idxadv_peek(struct vmbus_rxbr *rbr, void *data, int dlen,
rindex = VMBUS_BR_IDXINC(rbr->rxbr_rindex,
idx_adv + sizeof(uint64_t), br_dsize);
__compiler_membar();
- rbr->rxbr_rindex = rindex;
+ atomic_store_rel_32(&rbr->rxbr_rindex, rindex);
}
- vmbus_rxbr_copyfrom(rbr, rbr->rxbr_rindex, data, dlen);
+ vmbus_rxbr_copyfrom(rbr,
+ atomic_load_acq_32(&rbr->rxbr_rindex), data, dlen);
mtx_unlock_spin(&rbr->rxbr_lock);
@@ -667,7 +669,7 @@ vmbus_rxbr_idxadv(struct vmbus_rxbr *rbr, uint32_t idx_adv,
rindex = VMBUS_BR_IDXINC(rbr->rxbr_rindex,
idx_adv + sizeof(uint64_t), br_dsize);
__compiler_membar();
- rbr->rxbr_rindex = rindex;
+ atomic_store_rel_32(&rbr->rxbr_rindex, rindex);
mtx_unlock_spin(&rbr->rxbr_lock);
@@ -700,7 +702,8 @@ vmbus_rxbr_read(struct vmbus_rxbr *rbr, void *data, int dlen, uint32_t skip)
/*
* Copy channel packet from RX bufring.
*/
- rindex = VMBUS_BR_IDXINC(rbr->rxbr_rindex, skip, br_dsize);
+ rindex = VMBUS_BR_IDXINC(atomic_load_acq_32(&rbr->rxbr_rindex),
+ skip, br_dsize);
rindex = vmbus_rxbr_copyfrom(rbr, rindex, data, dlen);
/*
@@ -712,7 +715,7 @@ vmbus_rxbr_read(struct vmbus_rxbr *rbr, void *data, int dlen, uint32_t skip)
* Update the read index _after_ the channel packet is fetched.
*/
__compiler_membar();
- rbr->rxbr_rindex = rindex;
+ atomic_store_rel_32(&rbr->rxbr_rindex, rindex);
mtx_unlock_spin(&rbr->rxbr_lock);
diff --git a/sys/dev/hyperv/vmbus/vmbus_brvar.h b/sys/dev/hyperv/vmbus/vmbus_brvar.h
index 95bf4338ff1c..0edcc61ae5e1 100644
--- a/sys/dev/hyperv/vmbus/vmbus_brvar.h
+++ b/sys/dev/hyperv/vmbus/vmbus_brvar.h
@@ -99,14 +99,16 @@ static __inline bool
vmbus_txbr_empty(const struct vmbus_txbr *tbr)
{
- return (tbr->txbr_windex == tbr->txbr_rindex ? true : false);
+ return (atomic_load_acq_32(&tbr->txbr_windex) ==
+ atomic_load_acq_32(&tbr->txbr_rindex) ? true : false);
}
static __inline bool
vmbus_rxbr_empty(const struct vmbus_rxbr *rbr)
{
- return (rbr->rxbr_windex == rbr->rxbr_rindex ? true : false);
+ return (atomic_load_acq_32(&rbr->rxbr_windex) ==
+ atomic_load_acq_32(&rbr->rxbr_rindex) ? true : false);
}
static __inline int