summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/dev/pv/hyperv.c24
1 files changed, 13 insertions, 11 deletions
diff --git a/sys/dev/pv/hyperv.c b/sys/dev/pv/hyperv.c
index b52af62cbc6..2babb159910 100644
--- a/sys/dev/pv/hyperv.c
+++ b/sys/dev/pv/hyperv.c
@@ -1266,8 +1266,6 @@ hv_ring_write(struct hv_ring_data *wrd, struct iovec *iov, int iov_cnt,
return (EAGAIN);
}
- mtx_enter(&wrd->rd_lock);
-
oprod = wrd->rd_prod;
for (i = 0; i < iov_cnt; i++)
@@ -1278,8 +1276,7 @@ hv_ring_write(struct hv_ring_data *wrd, struct iovec *iov, int iov_cnt,
membar_sync();
wrd->rd_ring->br_windex = wrd->rd_prod;
-
- mtx_leave(&wrd->rd_lock);
+ membar_sync();
/* Signal when the ring transitions from being empty to non-empty */
if (wrd->rd_ring->br_imask == 0 &&
@@ -1320,7 +1317,9 @@ hv_channel_send(struct hv_channel *ch, void *data, uint32_t datalen,
iov[2].iov_base = &zeropad;
iov[2].iov_len = pktlen_aligned - pktlen;
+ mtx_enter(&ch->ch_wrd.rd_lock);
rv = hv_ring_write(&ch->ch_wrd, iov, 3, &needsig);
+ mtx_leave(&ch->ch_wrd.rd_lock);
if (rv == 0 && needsig)
hv_channel_setevent(sc, ch);
@@ -1361,7 +1360,9 @@ hv_channel_send_sgl(struct hv_channel *ch, struct vmbus_gpa *sgl,
iov[3].iov_base = &zeropad;
iov[3].iov_len = pktlen_aligned - pktlen;
+ mtx_enter(&ch->ch_wrd.rd_lock);
rv = hv_ring_write(&ch->ch_wrd, iov, 4, &needsig);
+ mtx_leave(&ch->ch_wrd.rd_lock);
if (rv == 0 && needsig)
hv_channel_setevent(sc, ch);
@@ -1379,9 +1380,7 @@ hv_ring_peek(struct hv_ring_data *rrd, void *data, uint32_t datalen)
if (avail < datalen)
return (EAGAIN);
- mtx_enter(&rrd->rd_lock);
hv_ring_get(rrd, (uint8_t *)data, datalen, 1);
- mtx_leave(&rrd->rd_lock);
return (0);
}
@@ -1400,8 +1399,6 @@ hv_ring_read(struct hv_ring_data *rrd, void *data, uint32_t datalen,
return (EAGAIN);
}
- mtx_enter(&rrd->rd_lock);
-
if (offset) {
rrd->rd_cons += offset;
rrd->rd_cons %= rrd->rd_data_size;
@@ -1413,8 +1410,6 @@ hv_ring_read(struct hv_ring_data *rrd, void *data, uint32_t datalen,
membar_sync();
rrd->rd_ring->br_rindex = rrd->rd_cons;
- mtx_leave(&rrd->rd_lock);
-
return (0);
}
@@ -1428,12 +1423,17 @@ hv_channel_recv(struct hv_channel *ch, void *data, uint32_t datalen,
*rlen = 0;
- if ((rv = hv_ring_peek(&ch->ch_rrd, &cph, sizeof(cph))) != 0)
+ mtx_enter(&ch->ch_rrd.rd_lock);
+
+ if ((rv = hv_ring_peek(&ch->ch_rrd, &cph, sizeof(cph))) != 0) {
+ mtx_leave(&ch->ch_rrd.rd_lock);
return (rv);
+ }
offset = raw ? 0 : VMBUS_CHANPKT_GETLEN(cph.cph_hlen);
pktlen = VMBUS_CHANPKT_GETLEN(cph.cph_tlen) - offset;
if (pktlen > datalen) {
+ mtx_leave(&ch->ch_rrd.rd_lock);
printf("%s: pktlen %u datalen %u\n", __func__, pktlen, datalen);
return (EINVAL);
}
@@ -1444,6 +1444,8 @@ hv_channel_recv(struct hv_channel *ch, void *data, uint32_t datalen,
*rid = cph.cph_tid;
}
+ mtx_leave(&ch->ch_rrd.rd_lock);
+
return (rv);
}