Lines Matching refs:ring

86 viona_tx_wait_outstanding(viona_vring_t *ring)  in viona_tx_wait_outstanding()  argument
88 ASSERT(MUTEX_HELD(&ring->vr_lock)); in viona_tx_wait_outstanding()
90 while (ring->vr_xfer_outstanding != 0) { in viona_tx_wait_outstanding()
96 cv_wait(&ring->vr_cv, &ring->vr_lock); in viona_tx_wait_outstanding()
142 viona_tx_ring_alloc(viona_vring_t *ring, const uint16_t qsz) in viona_tx_ring_alloc() argument
149 ring->vr_txdesb = dp; in viona_tx_ring_alloc()
153 dp->d_ring = ring; in viona_tx_ring_alloc()
160 ring->vr_txiov = kmem_alloc(sizeof (struct iovec) * qsz, KM_SLEEP); in viona_tx_ring_alloc()
164 viona_tx_ring_free(viona_vring_t *ring, const uint16_t qsz) in viona_tx_ring_free() argument
166 if (ring->vr_txdesb != NULL) { in viona_tx_ring_free()
167 viona_desb_t *dp = ring->vr_txdesb; in viona_tx_ring_free()
172 kmem_free(ring->vr_txdesb, sizeof (viona_desb_t) * qsz); in viona_tx_ring_free()
173 ring->vr_txdesb = NULL; in viona_tx_ring_free()
176 if (ring->vr_txiov != NULL) { in viona_tx_ring_free()
177 kmem_free(ring->vr_txiov, sizeof (struct iovec) * qsz); in viona_tx_ring_free()
178 ring->vr_txiov = NULL; in viona_tx_ring_free()
183 viona_tx_done(viona_vring_t *ring, uint32_t len, uint16_t cookie) in viona_tx_done() argument
185 vq_pushchain(ring, len, cookie); in viona_tx_done()
188 viona_intr_ring(ring, B_FALSE); in viona_tx_done()
194 viona_worker_tx(viona_vring_t *ring, viona_link_t *link) in viona_worker_tx() argument
196 (void) thread_vsetname(curthread, "viona_tx_%p", ring); in viona_worker_tx()
198 ASSERT(MUTEX_HELD(&ring->vr_lock)); in viona_worker_tx()
199 ASSERT3U(ring->vr_state, ==, VRS_RUN); in viona_worker_tx()
201 mutex_exit(&ring->vr_lock); in viona_worker_tx()
206 viona_ring_disable_notify(ring); in viona_worker_tx()
207 while (viona_ring_num_avail(ring) != 0) { in viona_worker_tx()
208 viona_tx(link, ring); in viona_worker_tx()
218 mutex_enter(&ring->vr_lock); in viona_worker_tx()
219 const bool need_bail = vring_need_bail(ring); in viona_worker_tx()
220 mutex_exit(&ring->vr_lock); in viona_worker_tx()
238 viona_ring_enable_notify(ring); in viona_worker_tx()
241 if (viona_ring_num_avail(ring) == 0 && in viona_worker_tx()
247 viona_intr_ring(ring, B_TRUE); in viona_worker_tx()
250 mutex_enter(&ring->vr_lock); in viona_worker_tx()
252 if (vring_need_bail(ring)) { in viona_worker_tx()
253 ring->vr_state = VRS_STOP; in viona_worker_tx()
254 viona_tx_wait_outstanding(ring); in viona_worker_tx()
258 if (vmm_drv_lease_expired(ring->vr_lease)) { in viona_worker_tx()
259 ring->vr_state_flags |= VRSF_RENEW; in viona_worker_tx()
265 viona_tx_wait_outstanding(ring); in viona_worker_tx()
268 viona_ring_lease_renew(ring); in viona_worker_tx()
269 ring->vr_state_flags &= ~VRSF_RENEW; in viona_worker_tx()
273 ring->vr_state = VRS_STOP; in viona_worker_tx()
278 if (viona_ring_num_avail(ring) != 0) { in viona_worker_tx()
283 (void) cv_wait_sig(&ring->vr_cv, &ring->vr_lock); in viona_worker_tx()
285 mutex_exit(&ring->vr_lock); in viona_worker_tx()
293 viona_vring_t *ring = dp->d_ring; in viona_desb_release() local
321 viona_tx_done(ring, len, cookie); in viona_desb_release()
323 mutex_enter(&ring->vr_lock); in viona_desb_release()
324 if ((--ring->vr_xfer_outstanding) == 0) { in viona_desb_release()
325 cv_broadcast(&ring->vr_cv); in viona_desb_release()
327 mutex_exit(&ring->vr_lock); in viona_desb_release()
331 viona_tx_csum(viona_vring_t *ring, const struct virtio_net_hdr *hdr, in viona_tx_csum() argument
334 viona_link_t *link = ring->vr_link; in viona_tx_csum()
352 VIONA_RING_STAT_INCR(ring, fail_hcksum); in viona_tx_csum()
479 VIONA_RING_STAT_INCR(ring, fail_hcksum); in viona_tx_csum()
493 VIONA_RING_STAT_INCR(ring, fail_hcksum6); in viona_tx_csum()
499 VIONA_RING_STAT_INCR(ring, fail_hcksum_proto); in viona_tx_csum()
504 viona_tx(viona_link_t *link, viona_vring_t *ring) in viona_tx() argument
506 struct iovec *iov = ring->vr_txiov; in viona_tx()
507 const uint_t max_segs = ring->vr_size; in viona_tx()
522 n = vq_popchain(ring, iov, max_segs, &cookie, &pages); in viona_tx()
524 VIONA_PROBE1(tx_absent, viona_vring_t *, ring); in viona_tx()
525 VIONA_RING_STAT_INCR(ring, tx_absent); in viona_tx()
544 if (ring->vr_txdesb != NULL) { in viona_tx()
545 dp = &ring->vr_txdesb[cookie]; in viona_tx()
664 if (viona_hook(link, ring, &mp, B_TRUE) != 0) { in viona_tx()
696 if (!viona_tx_csum(ring, hdr, mp_head, len - iov[0].iov_len)) { in viona_tx()
704 mutex_enter(&ring->vr_lock); in viona_tx()
705 ring->vr_xfer_outstanding++; in viona_tx()
706 mutex_exit(&ring->vr_lock); in viona_tx()
714 viona_tx_done(ring, len, cookie); in viona_tx()
768 VIONA_PROBE3(tx_drop, viona_vring_t *, ring, uint32_t, len, in viona_tx()
771 viona_tx_done(ring, len, cookie); in viona_tx()