version 1.10, 2006/05/27 19:54:59 |
version 1.11, 2006/07/02 16:29:49 |
Line 511 xennet_alloc_rx_buffer(struct xennet_xen |
|
Line 511 xennet_alloc_rx_buffer(struct xennet_xen |
|
for (i = 0; sc->sc_free_rxreql != 0; i++) { |
for (i = 0; sc->sc_free_rxreql != 0; i++) { |
req = SLIST_FIRST(&sc->sc_rxreq_head); |
req = SLIST_FIRST(&sc->sc_rxreq_head); |
KASSERT(req != NULL); |
KASSERT(req != NULL); |
|
KASSERT(req == &sc->sc_rxreqs[req->rxreq_id]); |
RING_GET_REQUEST(&sc->sc_rx_ring, req_prod + i)->id = |
RING_GET_REQUEST(&sc->sc_rx_ring, req_prod + i)->id = |
req->rxreq_id; |
req->rxreq_id; |
if (xengnt_grant_transfer(sc->sc_xbusd->xbusd_otherend_id, |
if (xengnt_grant_transfer(sc->sc_xbusd->xbusd_otherend_id, |
Line 648 xennet_rx_mbuf_free(struct mbuf *m, cadd |
|
Line 649 xennet_rx_mbuf_free(struct mbuf *m, cadd |
|
struct xennet_rxreq *req = arg; |
struct xennet_rxreq *req = arg; |
struct xennet_xenbus_softc *sc = req->rxreq_sc; |
struct xennet_xenbus_softc *sc = req->rxreq_sc; |
|
|
|
int s = splnet(); |
|
|
SLIST_INSERT_HEAD(&sc->sc_rxreq_head, req, rxreq_next); |
SLIST_INSERT_HEAD(&sc->sc_rxreq_head, req, rxreq_next); |
sc->sc_free_rxreql++; |
sc->sc_free_rxreql++; |
|
|
Line 659 xennet_rx_mbuf_free(struct mbuf *m, cadd |
|
Line 662 xennet_rx_mbuf_free(struct mbuf *m, cadd |
|
|
|
if (m) |
if (m) |
pool_cache_put(&mbpool_cache, m); |
pool_cache_put(&mbpool_cache, m); |
|
splx(s); |
} |
} |
|
|
|
|
|
|
netif_rx_response_t *rx = RING_GET_RESPONSE(&sc->sc_rx_ring, i); |
netif_rx_response_t *rx = RING_GET_RESPONSE(&sc->sc_rx_ring, i); |
req = &sc->sc_rxreqs[rx->id]; |
req = &sc->sc_rxreqs[rx->id]; |
KASSERT(req->rxreq_gntref != GRANT_INVALID_REF); |
KASSERT(req->rxreq_gntref != GRANT_INVALID_REF); |
|
KASSERT(req->rxreq_id == rx->id); |
ma = xengnt_revoke_transfer(req->rxreq_gntref); |
ma = xengnt_revoke_transfer(req->rxreq_gntref); |
if (ma == 0) { |
if (ma == 0) { |
DPRINTFN(XEDB_EVENT, ("xennet_handler ma == 0\n")); |
DPRINTFN(XEDB_EVENT, ("xennet_handler ma == 0\n")); |
|
|
xennet_rx_mbuf_free(NULL, (void *)va, PAGE_SIZE, req); |
xennet_rx_mbuf_free(NULL, (void *)va, PAGE_SIZE, req); |
continue; |
continue; |
} |
} |
|
MCLAIM(m, &sc->sc_ethercom.ec_rx_mowner); |
|
|
m->m_pkthdr.rcvif = ifp; |
m->m_pkthdr.rcvif = ifp; |
if (__predict_true(sc->sc_rx_ring.req_prod_pvt != |
if (__predict_true(sc->sc_rx_ring.req_prod_pvt != |
|
|
* memory, copy data and push the receive |
* memory, copy data and push the receive |
* buffer back to the hypervisor. |
* buffer back to the hypervisor. |
*/ |
*/ |
m->m_len = MHLEN; |
m->m_len = min(MHLEN, rx->status); |
m->m_pkthdr.len = 0; |
m->m_pkthdr.len = 0; |
m_copyback(m, 0, rx->status, pktp); |
m_copyback(m, 0, rx->status, pktp); |
xennet_rx_mbuf_free(NULL, (void *)va, PAGE_SIZE, req); |
xennet_rx_mbuf_free(NULL, (void *)va, PAGE_SIZE, req); |
Line 986 xennet_softstart(void *arg) |
|
Line 992 xennet_softstart(void *arg) |
|
/* we will be able to send m */ |
/* we will be able to send m */ |
IFQ_DEQUEUE(&ifp->if_snd, m); |
IFQ_DEQUEUE(&ifp->if_snd, m); |
} |
} |
|
MCLAIM(m, &sc->sc_ethercom.ec_tx_mowner); |
|
|
KASSERT(((pa ^ (pa + m->m_pkthdr.len - 1)) & PG_FRAME) == 0); |
KASSERT(((pa ^ (pa + m->m_pkthdr.len - 1)) & PG_FRAME) == 0); |
|
|