Lines Matching defs:rxq

148 static void	vtnet_rx_vq_process(struct vtnet_rxq *rxq, int tries);
821 struct vtnet_rxq *rxq;
823 rxq = &sc->vtnet_rxqs[id];
825 snprintf(rxq->vtnrx_name, sizeof(rxq->vtnrx_name), "%s-rx%d",
827 mtx_init(&rxq->vtnrx_mtx, rxq->vtnrx_name, NULL, MTX_DEF);
829 rxq->vtnrx_sc = sc;
830 rxq->vtnrx_id = id;
832 rxq->vtnrx_sg = sglist_alloc(sc->vtnet_rx_nsegs, M_NOWAIT);
833 if (rxq->vtnrx_sg == NULL)
838 if (tcp_lro_init_args(&rxq->vtnrx_lro, sc->vtnet_ifp,
844 NET_TASK_INIT(&rxq->vtnrx_intrtask, 0, vtnet_rxq_tq_intr, rxq);
845 rxq->vtnrx_tq = taskqueue_create(rxq->vtnrx_name, M_NOWAIT,
846 taskqueue_thread_enqueue, &rxq->vtnrx_tq);
848 return (rxq->vtnrx_tq == NULL ? ENOMEM : 0);
916 vtnet_destroy_rxq(struct vtnet_rxq *rxq)
919 rxq->vtnrx_sc = NULL;
920 rxq->vtnrx_id = -1;
923 tcp_lro_free(&rxq->vtnrx_lro);
926 if (rxq->vtnrx_sg != NULL) {
927 sglist_free(rxq->vtnrx_sg);
928 rxq->vtnrx_sg = NULL;
931 if (mtx_initialized(&rxq->vtnrx_mtx) != 0)
932 mtx_destroy(&rxq->vtnrx_mtx);
1019 struct vtnet_rxq *rxq;
1034 rxq = &sc->vtnet_rxqs[i];
1036 vtnet_rx_vq_intr, rxq, &rxq->vtnrx_vq,
1037 "%s-rx%d", device_get_nameunit(dev), rxq->vtnrx_id);
1047 rxq = &sc->vtnet_rxqs[i];
1048 VQ_ALLOC_INFO_INIT(&info[idx], 0, NULL, rxq, &rxq->vtnrx_vq,
1049 "%s-rx%d", device_get_nameunit(dev), rxq->vtnrx_id);
1460 vtnet_rxq_populate(struct vtnet_rxq *rxq)
1466 error = vtnet_netmap_rxq_populate(rxq);
1471 vq = rxq->vtnrx_vq;
1475 error = vtnet_rxq_new_buf(rxq);
1495 vtnet_rxq_free_mbufs(struct vtnet_rxq *rxq)
1501 struct netmap_kring *kring = netmap_kring_on(NA(rxq->vtnrx_sc->vtnet_ifp),
1502 rxq->vtnrx_id, NR_RX);
1507 vq = rxq->vtnrx_vq;
1516 ("%s: mbufs remaining in rx queue %p", __func__, rxq));
1564 vtnet_rxq_replace_lro_nomrg_buf(struct vtnet_rxq *rxq, struct mbuf *m0,
1571 sc = rxq->vtnrx_sc;
1633 error = vtnet_rxq_enqueue_buf(rxq, m_new);
1655 vtnet_rxq_replace_buf(struct vtnet_rxq *rxq, struct mbuf *m, int len)
1661 sc = rxq->vtnrx_sc;
1664 return (vtnet_rxq_replace_lro_nomrg_buf(rxq, m, len));
1674 error = vtnet_rxq_enqueue_buf(rxq, m_new);
1685 vtnet_rxq_enqueue_buf(struct vtnet_rxq *rxq, struct mbuf *m)
1691 sc = rxq->vtnrx_sc;
1692 sg = rxq->vtnrx_sg;
1696 VTNET_RXQ_LOCK_ASSERT(rxq);
1729 return (virtqueue_enqueue(rxq->vtnrx_vq, m, sg, 0, sg->sg_nseg));
1733 vtnet_rxq_new_buf(struct vtnet_rxq *rxq)
1739 sc = rxq->vtnrx_sc;
1745 error = vtnet_rxq_enqueue_buf(rxq, m);
1753 vtnet_rxq_csum_needs_csum(struct vtnet_rxq *rxq, struct mbuf *m, uint16_t etype,
1759 sc = rxq->vtnrx_sc;
1779 error = vtnet_rxq_csum_data_valid(rxq, m, etype, hoff, hdr);
1826 vtnet_rxq_csum_data_valid(struct vtnet_rxq *rxq, struct mbuf *m,
1835 sc = rxq->vtnrx_sc;
1887 vtnet_rxq_csum(struct vtnet_rxq *rxq, struct mbuf *m,
1906 return (vtnet_rxq_csum_needs_csum(rxq, m, etype, hoff, hdr));
1908 return (vtnet_rxq_csum_data_valid(rxq, m, etype, hoff, hdr));
1912 vtnet_rxq_discard_merged_bufs(struct vtnet_rxq *rxq, int nbufs)
1917 m = virtqueue_dequeue(rxq->vtnrx_vq, NULL);
1920 vtnet_rxq_discard_buf(rxq, m);
1925 vtnet_rxq_discard_buf(struct vtnet_rxq *rxq, struct mbuf *m)
1933 error = vtnet_rxq_enqueue_buf(rxq, m);
1939 vtnet_rxq_merged_eof(struct vtnet_rxq *rxq, struct mbuf *m_head, int nbufs)
1945 sc = rxq->vtnrx_sc;
1946 vq = rxq->vtnrx_vq;
1955 rxq->vtnrx_stats.vrxs_ierrors++;
1959 if (vtnet_rxq_new_buf(rxq) != 0) {
1960 rxq->vtnrx_stats.vrxs_iqdrops++;
1961 vtnet_rxq_discard_buf(rxq, m);
1963 vtnet_rxq_discard_merged_bufs(rxq, nbufs);
1989 vtnet_lro_rx(struct vtnet_rxq *rxq, struct mbuf *m)
1993 lro = &rxq->vtnrx_lro;
2005 vtnet_rxq_input(struct vtnet_rxq *rxq, struct mbuf *m,
2011 sc = rxq->vtnrx_sc;
2027 m->m_pkthdr.flowid = rxq->vtnrx_id;
2032 if (vtnet_rxq_csum(rxq, m, hdr) == 0)
2033 rxq->vtnrx_stats.vrxs_csum++;
2035 rxq->vtnrx_stats.vrxs_csum_failed++;
2044 rxq->vtnrx_stats.vrxs_host_lro++;
2049 rxq->vtnrx_stats.vrxs_ipackets++;
2050 rxq->vtnrx_stats.vrxs_ibytes += m->m_pkthdr.len;
2054 if (vtnet_lro_rx(rxq, m) == 0)
2063 vtnet_rxq_eof(struct vtnet_rxq *rxq)
2071 sc = rxq->vtnrx_sc;
2072 vq = rxq->vtnrx_vq;
2077 VTNET_RXQ_LOCK_ASSERT(rxq);
2090 rxq->vtnrx_stats.vrxs_ierrors++;
2091 vtnet_rxq_discard_buf(rxq, m);
2114 if (vtnet_rxq_replace_buf(rxq, m, len) != 0) {
2115 rxq->vtnrx_stats.vrxs_iqdrops++;
2116 vtnet_rxq_discard_buf(rxq, m);
2118 vtnet_rxq_discard_merged_bufs(rxq, nbufs);
2128 if (vtnet_rxq_merged_eof(rxq, m, nbufs) != 0)
2163 vtnet_rxq_input(rxq, m, &lhdr);
2169 tcp_lro_flush_all(&rxq->vtnrx_lro);
2179 vtnet_rx_vq_process(struct vtnet_rxq *rxq, int tries)
2188 sc = rxq->vtnrx_sc;
2191 if (__predict_false(rxq->vtnrx_id >= sc->vtnet_act_vq_pairs)) {
2198 vtnet_rxq_disable_intr(rxq);
2202 VTNET_RXQ_LOCK(rxq);
2213 nmirq = netmap_rx_irq(ifp, rxq->vtnrx_id, &more);
2215 VTNET_RXQ_UNLOCK(rxq);
2217 taskqueue_enqueue(rxq->vtnrx_tq, &rxq->vtnrx_intrtask);
2225 VTNET_RXQ_UNLOCK(rxq);
2229 more = vtnet_rxq_eof(rxq);
2230 if (more || vtnet_rxq_enable_intr(rxq) != 0) {
2232 vtnet_rxq_disable_intr(rxq);
2240 rxq->vtnrx_stats.vrxs_rescheduled++;
2241 VTNET_RXQ_UNLOCK(rxq);
2242 taskqueue_enqueue(rxq->vtnrx_tq, &rxq->vtnrx_intrtask);
2244 VTNET_RXQ_UNLOCK(rxq);
2250 struct vtnet_rxq *rxq;
2252 rxq = xrxq;
2253 vtnet_rx_vq_process(rxq, VTNET_INTR_DISABLE_RETRIES);
2259 struct vtnet_rxq *rxq;
2261 rxq = xrxq;
2262 vtnet_rx_vq_process(rxq, 0);
3067 struct vtnet_rxq *rxq;
3083 rxq = &sc->vtnet_rxqs[i];
3084 error = taskqueue_start_threads(&rxq->vtnrx_tq, 1, PI_NET,
3085 "%s rxq %d", device_get_nameunit(dev), rxq->vtnrx_id);
3088 rxq->vtnrx_id);
3104 struct vtnet_rxq *rxq;
3109 rxq = &sc->vtnet_rxqs[i];
3110 if (rxq->vtnrx_tq != NULL) {
3111 taskqueue_free(rxq->vtnrx_tq);
3112 rxq->vtnrx_tq = NULL;
3126 struct vtnet_rxq *rxq;
3131 rxq = &sc->vtnet_rxqs[i];
3132 if (rxq->vtnrx_tq != NULL)
3133 taskqueue_drain(rxq->vtnrx_tq, &rxq->vtnrx_intrtask);
3148 struct vtnet_rxq *rxq;
3153 rxq = &sc->vtnet_rxqs[i];
3154 vtnet_rxq_free_mbufs(rxq);
3164 struct vtnet_rxq *rxq;
3177 rxq = &sc->vtnet_rxqs[i];
3178 VTNET_RXQ_LOCK(rxq);
3179 VTNET_RXQ_UNLOCK(rxq);
3282 struct vtnet_rxq *rxq;
3301 rxq = &sc->vtnet_rxqs[i];
3304 VTNET_RXQ_LOCK(rxq);
3305 error = vtnet_rxq_populate(rxq);
3306 VTNET_RXQ_UNLOCK(rxq);
4081 struct sysctl_oid_list *child, struct vtnet_rxq *rxq)
4088 snprintf(namebuf, sizeof(namebuf), "rxq%d", rxq->vtnrx_id);
4093 stats = &rxq->vtnrx_stats;
4290 vtnet_rxq_enable_intr(struct vtnet_rxq *rxq)
4293 return (virtqueue_enable_intr(rxq->vtnrx_vq));
4297 vtnet_rxq_disable_intr(struct vtnet_rxq *rxq)
4300 virtqueue_disable_intr(rxq->vtnrx_vq);
4330 struct vtnet_rxq *rxq;
4334 rxq = &sc->vtnet_rxqs[i];
4335 if (vtnet_rxq_enable_intr(rxq) != 0)
4336 taskqueue_enqueue(rxq->vtnrx_tq, &rxq->vtnrx_intrtask);