Changeset View
Changeset View
Standalone View
Standalone View
head/sys/dev/netmap/netmap_mem2.c
Show First 20 Lines • Show All 1,839 Lines • ▼ Show 20 Lines | |||||
static void | static void | ||||
netmap_free_rings(struct netmap_adapter *na) | netmap_free_rings(struct netmap_adapter *na) | ||||
{ | { | ||||
enum txrx t; | enum txrx t; | ||||
for_rx_tx(t) { | for_rx_tx(t) { | ||||
u_int i; | u_int i; | ||||
for (i = 0; i < nma_get_nrings(na, t) + 1; i++) { | for (i = 0; i < netmap_all_rings(na, t); i++) { | ||||
struct netmap_kring *kring = NMR(na, t)[i]; | struct netmap_kring *kring = NMR(na, t)[i]; | ||||
struct netmap_ring *ring = kring->ring; | struct netmap_ring *ring = kring->ring; | ||||
if (ring == NULL || kring->users > 0 || (kring->nr_kflags & NKR_NEEDRING)) { | if (ring == NULL || kring->users > 0 || (kring->nr_kflags & NKR_NEEDRING)) { | ||||
if (netmap_verbose) | if (netmap_verbose) | ||||
D("NOT deleting ring %s (ring %p, users %d neekring %d)", | D("NOT deleting ring %s (ring %p, users %d neekring %d)", | ||||
kring->name, ring, kring->users, kring->nr_kflags & NKR_NEEDRING); | kring->name, ring, kring->users, kring->nr_kflags & NKR_NEEDRING); | ||||
continue; | continue; | ||||
Show All 22 Lines | |||||
static int | static int | ||||
netmap_mem2_rings_create(struct netmap_adapter *na) | netmap_mem2_rings_create(struct netmap_adapter *na) | ||||
{ | { | ||||
enum txrx t; | enum txrx t; | ||||
for_rx_tx(t) { | for_rx_tx(t) { | ||||
u_int i; | u_int i; | ||||
for (i = 0; i <= nma_get_nrings(na, t); i++) { | for (i = 0; i < netmap_all_rings(na, t); i++) { | ||||
struct netmap_kring *kring = NMR(na, t)[i]; | struct netmap_kring *kring = NMR(na, t)[i]; | ||||
struct netmap_ring *ring = kring->ring; | struct netmap_ring *ring = kring->ring; | ||||
u_int len, ndesc; | u_int len, ndesc; | ||||
if (ring || (!kring->users && !(kring->nr_kflags & NKR_NEEDRING))) { | if (ring || (!kring->users && !(kring->nr_kflags & NKR_NEEDRING))) { | ||||
/* uneeded, or already created by somebody else */ | /* uneeded, or already created by somebody else */ | ||||
if (netmap_verbose) | if (netmap_verbose) | ||||
D("NOT creating ring %s (ring %p, users %d neekring %d)", | D("NOT creating ring %s (ring %p, users %d neekring %d)", | ||||
Show All 21 Lines | for (i = 0; i < netmap_all_rings(na, t); i++) { | ||||
/* copy values from kring */ | /* copy values from kring */ | ||||
ring->head = kring->rhead; | ring->head = kring->rhead; | ||||
ring->cur = kring->rcur; | ring->cur = kring->rcur; | ||||
ring->tail = kring->rtail; | ring->tail = kring->rtail; | ||||
*(uint32_t *)(uintptr_t)&ring->nr_buf_size = | *(uint32_t *)(uintptr_t)&ring->nr_buf_size = | ||||
netmap_mem_bufsize(na->nm_mem); | netmap_mem_bufsize(na->nm_mem); | ||||
ND("%s h %d c %d t %d", kring->name, | ND("%s h %d c %d t %d", kring->name, | ||||
ring->head, ring->cur, ring->tail); | ring->head, ring->cur, ring->tail); | ||||
ND("initializing slots for %s_ring", nm_txrx2str(txrx)); | ND("initializing slots for %s_ring", nm_txrx2str(t)); | ||||
if (!(kring->nr_kflags & NKR_FAKERING)) { | if (!(kring->nr_kflags & NKR_FAKERING)) { | ||||
/* this is a real ring */ | /* this is a real ring */ | ||||
ND("allocating buffers for %s", kring->name); | ND("allocating buffers for %s", kring->name); | ||||
if (netmap_new_bufs(na->nm_mem, ring->slot, ndesc)) { | if (netmap_new_bufs(na->nm_mem, ring->slot, ndesc)) { | ||||
D("Cannot allocate buffers for %s_ring", nm_txrx2str(t)); | D("Cannot allocate buffers for %s_ring", nm_txrx2str(t)); | ||||
goto cleanup; | goto cleanup; | ||||
} | } | ||||
} else { | } else { | ||||
▲ Show 20 Lines • Show All 41 Lines • ▼ Show 20 Lines | netmap_mem2_if_new(struct netmap_adapter *na, struct netmap_priv_d *priv) | ||||
struct netmap_if *nifp; | struct netmap_if *nifp; | ||||
ssize_t base; /* handy for relative offsets between rings and nifp */ | ssize_t base; /* handy for relative offsets between rings and nifp */ | ||||
u_int i, len, n[NR_TXRX], ntot; | u_int i, len, n[NR_TXRX], ntot; | ||||
enum txrx t; | enum txrx t; | ||||
ntot = 0; | ntot = 0; | ||||
for_rx_tx(t) { | for_rx_tx(t) { | ||||
/* account for the (eventually fake) host rings */ | /* account for the (eventually fake) host rings */ | ||||
n[t] = nma_get_nrings(na, t) + 1; | n[t] = netmap_all_rings(na, t); | ||||
ntot += n[t]; | ntot += n[t]; | ||||
} | } | ||||
/* | /* | ||||
* the descriptor is followed inline by an array of offsets | * the descriptor is followed inline by an array of offsets | ||||
* to the tx and rx rings in the shared memory region. | * to the tx and rx rings in the shared memory region. | ||||
*/ | */ | ||||
len = sizeof(struct netmap_if) + (ntot * sizeof(ssize_t)); | len = sizeof(struct netmap_if) + (ntot * sizeof(ssize_t)); | ||||
▲ Show 20 Lines • Show All 657 Lines • ▼ Show 20 Lines | netmap_mem_pt_guest_rings_create(struct netmap_adapter *na) | ||||
if (ptif == NULL) { | if (ptif == NULL) { | ||||
D("Error: interface %p is not in passthrough", na->ifp); | D("Error: interface %p is not in passthrough", na->ifp); | ||||
goto out; | goto out; | ||||
} | } | ||||
/* point each kring to the corresponding backend ring */ | /* point each kring to the corresponding backend ring */ | ||||
nifp = (struct netmap_if *)((char *)ptnmd->nm_addr + ptif->nifp_offset); | nifp = (struct netmap_if *)((char *)ptnmd->nm_addr + ptif->nifp_offset); | ||||
for (i = 0; i <= na->num_tx_rings; i++) { | for (i = 0; i < netmap_all_rings(na, NR_TX); i++) { | ||||
struct netmap_kring *kring = na->tx_rings[i]; | struct netmap_kring *kring = na->tx_rings[i]; | ||||
if (kring->ring) | if (kring->ring) | ||||
continue; | continue; | ||||
kring->ring = (struct netmap_ring *) | kring->ring = (struct netmap_ring *) | ||||
((char *)nifp + nifp->ring_ofs[i]); | ((char *)nifp + nifp->ring_ofs[i]); | ||||
} | } | ||||
for (i = 0; i <= na->num_rx_rings; i++) { | for (i = 0; i < netmap_all_rings(na, NR_RX); i++) { | ||||
struct netmap_kring *kring = na->rx_rings[i]; | struct netmap_kring *kring = na->rx_rings[i]; | ||||
if (kring->ring) | if (kring->ring) | ||||
continue; | continue; | ||||
kring->ring = (struct netmap_ring *) | kring->ring = (struct netmap_ring *) | ||||
((char *)nifp + | ((char *)nifp + | ||||
nifp->ring_ofs[i + na->num_tx_rings + 1]); | nifp->ring_ofs[i + na->num_tx_rings + 1]); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 163 Lines • Show Last 20 Lines |