diff options
author | luigi <luigi@FreeBSD.org> | 2012-01-10 19:57:23 +0000 |
---|---|---|
committer | luigi <luigi@FreeBSD.org> | 2012-01-10 19:57:23 +0000 |
commit | 9b3b9221efe8d5a4487d8858053c95520d2ef546 (patch) | |
tree | 082372e9915b5238bc0f47c23a2ddcba92ce752b | |
parent | a2d41d9cca5dd4366eee8381829bc99a21fe3503 (diff) | |
download | FreeBSD-src-9b3b9221efe8d5a4487d8858053c95520d2ef546.zip FreeBSD-src-9b3b9221efe8d5a4487d8858053c95520d2ef546.tar.gz |
small code cleanup in preparation for future modifications in
the memory allocator used by netmap. No functional change,
two small bug fixes:
- in if_re.c add a missing bus_dmamap_sync()
- in netmap.c comment out a spurious free() in an error handling block
-rw-r--r-- | sys/dev/e1000/if_em.c | 32 | ||||
-rw-r--r-- | sys/dev/e1000/if_igb.c | 11 | ||||
-rw-r--r-- | sys/dev/e1000/if_lem.c | 18 | ||||
-rw-r--r-- | sys/dev/ixgbe/ixgbe.c | 12 | ||||
-rw-r--r-- | sys/dev/netmap/if_em_netmap.h | 16 | ||||
-rw-r--r-- | sys/dev/netmap/if_igb_netmap.h | 16 | ||||
-rw-r--r-- | sys/dev/netmap/if_lem_netmap.h | 16 | ||||
-rw-r--r-- | sys/dev/netmap/if_re_netmap.h | 29 | ||||
-rw-r--r-- | sys/dev/netmap/ixgbe_netmap.h | 18 | ||||
-rw-r--r-- | sys/dev/netmap/netmap.c | 48 | ||||
-rw-r--r-- | sys/dev/netmap/netmap_kern.h | 26 |
11 files changed, 131 insertions, 111 deletions
diff --git a/sys/dev/e1000/if_em.c b/sys/dev/e1000/if_em.c index 4d0ad8f..9f090ba 100644 --- a/sys/dev/e1000/if_em.c +++ b/sys/dev/e1000/if_em.c @@ -3297,16 +3297,15 @@ em_setup_transmit_ring(struct tx_ring *txr) #ifdef DEV_NETMAP if (slot) { int si = i + na->tx_rings[txr->me].nkr_hwofs; + uint64_t paddr; void *addr; if (si >= na->num_tx_desc) si -= na->num_tx_desc; - addr = NMB(slot + si); - txr->tx_base[i].buffer_addr = - htole64(vtophys(addr)); + addr = PNMB(slot + si, &paddr); + txr->tx_base[i].buffer_addr = htole64(paddr); /* reload the map for netmap mode */ - netmap_load_map(txr->txtag, - txbuf->map, addr, na->buff_size); + netmap_load_map(txr->txtag, txbuf->map, addr); } #endif /* DEV_NETMAP */ @@ -4104,9 +4103,6 @@ em_setup_receive_ring(struct rx_ring *rxr) sj += adapter->num_rx_desc; for (int j = 0; j != adapter->num_rx_desc; j++, sj++) { - void *addr; - int sz; - rxbuf = &rxr->rx_buffers[j]; /* no mbuf and regular mode -> skip this entry */ if (rxbuf->m_head == NULL && !slot) @@ -4115,12 +4111,20 @@ em_setup_receive_ring(struct rx_ring *rxr) if (sj >= adapter->num_rx_desc) sj -= adapter->num_rx_desc; /* see comment, set slot addr and map */ - addr = slot ? NMB(slot + sj) : rxbuf->m_head->m_data; - sz = slot ? na->buff_size : adapter->rx_mbuf_sz; - // XXX load or reload ? - netmap_load_map(rxr->rxtag, rxbuf->map, addr, sz); - /* Update descriptor */ - rxr->rx_base[j].buffer_addr = htole64(vtophys(addr)); + if (slot) { + uint64_t paddr; + void *addr = PNMB(slot + sj, &paddr); + netmap_load_map(rxr->rxtag, rxbuf->map, addr); + /* Update descriptor */ + rxr->rx_base[j].buffer_addr = htole64(paddr); + } else { + /* Get the memory mapping */ + bus_dmamap_load_mbuf_sg(rxr->rxtag, + rxbuf->map, rxbuf->m_head, seg, + &nsegs, BUS_DMA_NOWAIT); + /* Update descriptor */ + rxr->rx_base[j].buffer_addr = htole64(seg[0].ds_addr); + } bus_dmamap_sync(rxr->rxtag, rxbuf->map, BUS_DMASYNC_PREREAD); } } diff --git a/sys/dev/e1000/if_igb.c b/sys/dev/e1000/if_igb.c index d83130c..2c0caa4 100644 --- a/sys/dev/e1000/if_igb.c +++ b/sys/dev/e1000/if_igb.c @@ -3320,8 +3320,7 @@ igb_setup_transmit_ring(struct tx_ring *txr) if (si < 0) si += na->num_tx_desc; - netmap_load_map(txr->txtag, txbuf->map, - NMB(slot + si), na->buff_size); + netmap_load_map(txr->txtag, txbuf->map, NMB(slot + si)); } #endif /* DEV_NETMAP */ /* clear the watch index */ @@ -4062,15 +4061,15 @@ igb_setup_receive_ring(struct rx_ring *rxr) if (slot) { /* slot sj is mapped to the i-th NIC-ring entry */ int sj = j + na->rx_rings[rxr->me].nkr_hwofs; + uint64_t paddr; void *addr; if (sj < 0) sj += na->num_rx_desc; - addr = NMB(slot + sj); - netmap_load_map(rxr->ptag, - rxbuf->pmap, addr, na->buff_size); + addr = PNMB(slot + sj, &paddr); + netmap_load_map(rxr->ptag, rxbuf->pmap, addr); /* Update descriptor */ - rxr->rx_base[j].read.pkt_addr = htole64(vtophys(addr)); + rxr->rx_base[j].read.pkt_addr = htole64(paddr); continue; } #endif /* DEV_NETMAP */ diff --git a/sys/dev/e1000/if_lem.c b/sys/dev/e1000/if_lem.c index 216ec95..0774cb9 100644 --- a/sys/dev/e1000/if_lem.c +++ b/sys/dev/e1000/if_lem.c @@ -2670,16 +2670,15 @@ lem_setup_transmit_structures(struct adapter *adapter) if (slot) { /* slot si is mapped to the i-th NIC-ring entry */ int si = i + na->tx_rings[0].nkr_hwofs; + uint64_t paddr; void *addr; if (si > na->num_tx_desc) si -= na->num_tx_desc; - addr = NMB(slot + si); - adapter->tx_desc_base[si].buffer_addr = - htole64(vtophys(addr)); + addr = PNMB(slot + si, &paddr); + adapter->tx_desc_base[si].buffer_addr = htole64(paddr); /* reload the map for netmap mode */ - netmap_load_map(adapter->txtag, - tx_buffer->map, addr, na->buff_size); + netmap_load_map(adapter->txtag, tx_buffer->map, addr); } #endif /* DEV_NETMAP */ tx_buffer->next_eop = -1; @@ -3247,16 +3246,15 @@ lem_setup_receive_structures(struct adapter *adapter) if (slot) { /* slot si is mapped to the i-th NIC-ring entry */ int si = i + na->rx_rings[0].nkr_hwofs; + uint64_t paddr; void *addr; if (si > na->num_rx_desc) si -= na->num_rx_desc; - addr = NMB(slot + si); - netmap_load_map(adapter->rxtag, - rx_buffer->map, addr, na->buff_size); + addr = PNMB(slot + si, &paddr); + netmap_load_map(adapter->rxtag, rx_buffer->map, addr); /* Update descriptor */ - adapter->rx_desc_base[i].buffer_addr = - htole64(vtophys(addr)); + adapter->rx_desc_base[i].buffer_addr = htole64(paddr); continue; } #endif /* DEV_NETMAP */ diff --git a/sys/dev/ixgbe/ixgbe.c b/sys/dev/ixgbe/ixgbe.c index 8e4a7b4..ad6c4ae 100644 --- a/sys/dev/ixgbe/ixgbe.c +++ b/sys/dev/ixgbe/ixgbe.c @@ -2876,8 +2876,7 @@ ixgbe_setup_transmit_ring(struct tx_ring *txr) if (si >= na->num_tx_desc) si -= na->num_tx_desc; - netmap_load_map(txr->txtag, txbuf->map, - NMB(slot + si), na->buff_size); + netmap_load_map(txr->txtag, txbuf->map, NMB(slot + si)); } #endif /* DEV_NETMAP */ /* Clear the EOP index */ @@ -3810,16 +3809,15 @@ ixgbe_setup_receive_ring(struct rx_ring *rxr) */ if (slot) { int sj = j + na->rx_rings[rxr->me].nkr_hwofs; + uint64_t paddr; void *addr; if (sj >= na->num_rx_desc) sj -= na->num_rx_desc; - addr = NMB(slot + sj); - netmap_load_map(rxr->ptag, - rxbuf->pmap, addr, na->buff_size); + addr = PNMB(slot + sj, &paddr); + netmap_load_map(rxr->ptag, rxbuf->pmap, addr); /* Update descriptor */ - rxr->rx_base[j].read.pkt_addr = - htole64(vtophys(addr)); + rxr->rx_base[j].read.pkt_addr = htole64(paddr); continue; } #endif /* DEV_NETMAP */ diff --git a/sys/dev/netmap/if_em_netmap.h b/sys/dev/netmap/if_em_netmap.h index d75e924..959f52f 100644 --- a/sys/dev/netmap/if_em_netmap.h +++ b/sys/dev/netmap/if_em_netmap.h @@ -222,7 +222,8 @@ em_netmap_txsync(void *a, u_int ring_nr, int do_lock) int flags = ((slot->flags & NS_REPORT) || j == 0 || j == report_frequency) ? E1000_TXD_CMD_RS : 0; - void *addr = NMB(slot); + uint64_t paddr; + void *addr = PNMB(slot, &paddr); int len = slot->len; if (addr == netmap_buffer_base || len > NETMAP_BUF_SIZE) { if (do_lock) @@ -236,10 +237,9 @@ em_netmap_txsync(void *a, u_int ring_nr, int do_lock) htole32(adapter->txd_cmd | len | (E1000_TXD_CMD_EOP | flags) ); if (slot->flags & NS_BUF_CHANGED) { - curr->buffer_addr = htole64(vtophys(addr)); + curr->buffer_addr = htole64(paddr); /* buffer has changed, reload map */ - netmap_reload_map(txr->txtag, txbuf->map, - addr, na->buff_size); + netmap_reload_map(txr->txtag, txbuf->map, addr); slot->flags &= ~NS_BUF_CHANGED; } @@ -355,7 +355,8 @@ em_netmap_rxsync(void *a, u_int ring_nr, int do_lock) struct netmap_slot *slot = &ring->slot[j]; struct e1000_rx_desc *curr = &rxr->rx_base[l]; struct em_buffer *rxbuf = &rxr->rx_buffers[l]; - void *addr = NMB(slot); + uint64_t paddr; + void *addr = PNMB(slot, &paddr); if (addr == netmap_buffer_base) { /* bad buf */ if (do_lock) @@ -365,10 +366,9 @@ em_netmap_rxsync(void *a, u_int ring_nr, int do_lock) curr->status = 0; if (slot->flags & NS_BUF_CHANGED) { - curr->buffer_addr = htole64(vtophys(addr)); + curr->buffer_addr = htole64(paddr); /* buffer has changed, reload map */ - netmap_reload_map(rxr->rxtag, rxbuf->map, - addr, na->buff_size); + netmap_reload_map(rxr->rxtag, rxbuf->map, addr); slot->flags &= ~NS_BUF_CHANGED; } diff --git a/sys/dev/netmap/if_igb_netmap.h b/sys/dev/netmap/if_igb_netmap.h index 5e41742..0e4229b 100644 --- a/sys/dev/netmap/if_igb_netmap.h +++ b/sys/dev/netmap/if_igb_netmap.h @@ -181,7 +181,8 @@ igb_netmap_txsync(void *a, u_int ring_nr, int do_lock) struct igb_tx_buffer *txbuf = &txr->tx_buffers[l]; union e1000_adv_tx_desc *curr = (union e1000_adv_tx_desc *)&txr->tx_base[l]; - void *addr = NMB(slot); + uint64_t paddr; + void *addr = PNMB(slot, &paddr); int flags = ((slot->flags & NS_REPORT) || j == 0 || j == report_frequency) ? E1000_ADVTXD_DCMD_RS : 0; @@ -195,7 +196,7 @@ igb_netmap_txsync(void *a, u_int ring_nr, int do_lock) slot->flags &= ~NS_REPORT; // XXX do we need to set the address ? - curr->read.buffer_addr = htole64(vtophys(addr)); + curr->read.buffer_addr = htole64(paddr); curr->read.olinfo_status = htole32(olinfo_status | (len<< E1000_ADVTXD_PAYLEN_SHIFT)); @@ -206,8 +207,7 @@ igb_netmap_txsync(void *a, u_int ring_nr, int do_lock) E1000_ADVTXD_DCMD_EOP | flags); if (slot->flags & NS_BUF_CHANGED) { /* buffer has changed, reload map */ - netmap_reload_map(txr->txtag, txbuf->map, - addr, na->buff_size); + netmap_reload_map(txr->txtag, txbuf->map, addr); slot->flags &= ~NS_BUF_CHANGED; } @@ -317,7 +317,8 @@ igb_netmap_rxsync(void *a, u_int ring_nr, int do_lock) struct netmap_slot *slot = ring->slot + j; union e1000_adv_rx_desc *curr = &rxr->rx_base[l]; struct igb_rx_buf *rxbuf = rxr->rx_buffers + l; - void *addr = NMB(slot); + uint64_t paddr; + void *addr = PNMB(slot, &paddr); if (addr == netmap_buffer_base) { /* bad buf */ if (do_lock) @@ -326,10 +327,9 @@ igb_netmap_rxsync(void *a, u_int ring_nr, int do_lock) } curr->wb.upper.status_error = 0; - curr->read.pkt_addr = htole64(vtophys(addr)); + curr->read.pkt_addr = htole64(paddr); if (slot->flags & NS_BUF_CHANGED) { - netmap_reload_map(rxr->ptag, rxbuf->pmap, - addr, na->buff_size); + netmap_reload_map(rxr->ptag, rxbuf->pmap, addr); slot->flags &= ~NS_BUF_CHANGED; } diff --git a/sys/dev/netmap/if_lem_netmap.h b/sys/dev/netmap/if_lem_netmap.h index ae64cd6..b9438fb 100644 --- a/sys/dev/netmap/if_lem_netmap.h +++ b/sys/dev/netmap/if_lem_netmap.h @@ -186,7 +186,8 @@ lem_netmap_txsync(void *a, u_int ring_nr, int do_lock) struct netmap_slot *slot = &ring->slot[j]; struct e1000_tx_desc *curr = &adapter->tx_desc_base[l]; struct em_buffer *txbuf = &adapter->tx_buffer_area[l]; - void *addr = NMB(slot); + uint64_t paddr; + void *addr = PNMB(slot, &paddr); int flags = ((slot->flags & NS_REPORT) || j == 0 || j == report_frequency) ? E1000_TXD_CMD_RS : 0; @@ -204,10 +205,9 @@ lem_netmap_txsync(void *a, u_int ring_nr, int do_lock) htole32( adapter->txd_cmd | len | (E1000_TXD_CMD_EOP | flags) ); if (slot->flags & NS_BUF_CHANGED) { - curr->buffer_addr = htole64(vtophys(addr)); + curr->buffer_addr = htole64(paddr); /* buffer has changed, reload map */ - netmap_reload_map(adapter->txtag, txbuf->map, - addr, na->buff_size); + netmap_reload_map(adapter->txtag, txbuf->map, addr); slot->flags &= ~NS_BUF_CHANGED; } @@ -314,7 +314,8 @@ lem_netmap_rxsync(void *a, u_int ring_nr, int do_lock) struct netmap_slot *slot = &ring->slot[j]; struct e1000_rx_desc *curr = &adapter->rx_desc_base[l]; struct em_buffer *rxbuf = &adapter->rx_buffer_area[l]; - void *addr = NMB(slot); + uint64_t paddr; + void *addr = PNMB(slot, &paddr); if (addr == netmap_buffer_base) { /* bad buf */ if (do_lock) @@ -323,10 +324,9 @@ lem_netmap_rxsync(void *a, u_int ring_nr, int do_lock) } curr->status = 0; if (slot->flags & NS_BUF_CHANGED) { - curr->buffer_addr = htole64(vtophys(addr)); + curr->buffer_addr = htole64(paddr); /* buffer has changed, and reload map */ - netmap_reload_map(adapter->rxtag, rxbuf->map, - addr, na->buff_size); + netmap_reload_map(adapter->rxtag, rxbuf->map, addr); slot->flags &= ~NS_BUF_CHANGED; } diff --git a/sys/dev/netmap/if_re_netmap.h b/sys/dev/netmap/if_re_netmap.h index 105660c..2f4eed2 100644 --- a/sys/dev/netmap/if_re_netmap.h +++ b/sys/dev/netmap/if_re_netmap.h @@ -183,7 +183,8 @@ re_netmap_txsync(void *a, u_int ring_nr, int do_lock) struct rl_desc *desc = &sc->rl_ldata.rl_tx_list[l]; int cmd = slot->len | RL_TDESC_CMD_EOF | RL_TDESC_CMD_OWN | RL_TDESC_CMD_SOF ; - void *addr = NMB(slot); + uint64_t paddr; + void *addr = PNMB(slot, &paddr); int len = slot->len; if (addr == netmap_buffer_base || len > NETMAP_BUF_SIZE) { @@ -197,12 +198,11 @@ re_netmap_txsync(void *a, u_int ring_nr, int do_lock) cmd |= RL_TDESC_CMD_EOR; if (slot->flags & NS_BUF_CHANGED) { - uint64_t paddr = vtophys(addr); desc->rl_bufaddr_lo = htole32(RL_ADDR_LO(paddr)); desc->rl_bufaddr_hi = htole32(RL_ADDR_HI(paddr)); /* buffer has changed, unload and reload map */ netmap_reload_map(sc->rl_ldata.rl_tx_mtag, - txd[l].tx_dmamap, addr, na->buff_size); + txd[l].tx_dmamap, addr); slot->flags &= ~NS_BUF_CHANGED; } slot->flags &= ~NS_REPORT; @@ -304,7 +304,8 @@ re_netmap_rxsync(void *a, u_int ring_nr, int do_lock) struct netmap_slot *slot = ring->slot + j; struct rl_desc *desc = &sc->rl_ldata.rl_rx_list[l]; int cmd = na->buff_size | RL_RDESC_CMD_OWN; - void *addr = NMB(slot); + uint64_t paddr; + void *addr = PNMB(slot, &paddr); if (addr == netmap_buffer_base) { /* bad buf */ if (do_lock) @@ -318,11 +319,10 @@ re_netmap_rxsync(void *a, u_int ring_nr, int do_lock) desc->rl_cmdstat = htole32(cmd); slot->flags &= ~NS_REPORT; if (slot->flags & NS_BUF_CHANGED) { - uint64_t paddr = vtophys(addr); desc->rl_bufaddr_lo = htole32(RL_ADDR_LO(paddr)); desc->rl_bufaddr_hi = htole32(RL_ADDR_HI(paddr)); netmap_reload_map(sc->rl_ldata.rl_rx_mtag, - rxd[l].rx_dmamap, addr, na->buff_size); + rxd[l].rx_dmamap, addr); slot->flags &= ~NS_BUF_CHANGED; } bus_dmamap_sync(sc->rl_ldata.rl_rx_mtag, @@ -377,12 +377,11 @@ re_netmap_tx_init(struct rl_softc *sc) if (l >= n) l -= n; - addr = NMB(slot + l); - paddr = vtophys(addr); + addr = PNMB(slot + l, &paddr); desc[i].rl_bufaddr_lo = htole32(RL_ADDR_LO(paddr)); desc[i].rl_bufaddr_hi = htole32(RL_ADDR_HI(paddr)); netmap_load_map(sc->rl_ldata.rl_tx_mtag, - txd[i].tx_dmamap, addr, na->buff_size); + txd[i].tx_dmamap, addr); } } @@ -407,8 +406,12 @@ re_netmap_rx_init(struct rl_softc *sc) if (l >= n) l -= n; - addr = NMB(slot + l); - paddr = vtophys(addr); + addr = PNMB(slot + l, &paddr); + + netmap_reload_map(sc->rl_ldata.rl_rx_mtag, + sc->rl_ldata.rl_rx_desc[i].rx_dmamap, addr); + bus_dmamap_sync(sc->rl_ldata.rl_rx_mtag, + sc->rl_ldata.rl_rx_desc[i].rx_dmamap, BUS_DMASYNC_PREREAD); desc[i].rl_bufaddr_lo = htole32(RL_ADDR_LO(paddr)); desc[i].rl_bufaddr_hi = htole32(RL_ADDR_HI(paddr)); cmdstat = na->buff_size; @@ -422,9 +425,5 @@ re_netmap_rx_init(struct rl_softc *sc) if (i < n - 1 - kring->nr_hwavail) // XXX + 1 ? cmdstat |= RL_RDESC_CMD_OWN; desc[i].rl_cmdstat = htole32(cmdstat); - - netmap_reload_map(sc->rl_ldata.rl_rx_mtag, - sc->rl_ldata.rl_rx_desc[i].rx_dmamap, - addr, na->buff_size); } } diff --git a/sys/dev/netmap/ixgbe_netmap.h b/sys/dev/netmap/ixgbe_netmap.h index fdf15d8..f456044 100644 --- a/sys/dev/netmap/ixgbe_netmap.h +++ b/sys/dev/netmap/ixgbe_netmap.h @@ -253,7 +253,7 @@ ixgbe_netmap_txsync(void *a, u_int ring_nr, int do_lock) * Note that txbuf and curr are indexed by l. * * In this driver we collect the buffer address - * (using the NMB() macro) because we always + * (using the PNMB() macro) because we always * need to rewrite it into the NIC ring. * Many other drivers preserve the address, so * we only need to access it if NS_BUF_CHANGED @@ -262,7 +262,8 @@ ixgbe_netmap_txsync(void *a, u_int ring_nr, int do_lock) struct netmap_slot *slot = &ring->slot[j]; struct ixgbe_tx_buf *txbuf = &txr->tx_buffers[l]; union ixgbe_adv_tx_desc *curr = &txr->tx_base[l]; - void *addr = NMB(slot); + uint64_t paddr; + void *addr = PNMB(slot, &paddr); // XXX type for flags and len ? int flags = ((slot->flags & NS_REPORT) || j == 0 || j == report_frequency) ? @@ -290,7 +291,7 @@ ring_reset: * address in the NIC ring. Other drivers do not * need this. */ - curr->read.buffer_addr = htole64(vtophys(addr)); + curr->read.buffer_addr = htole64(paddr); curr->read.olinfo_status = 0; curr->read.cmd_type_len = htole32(txr->txd_cmd | len | @@ -303,8 +304,7 @@ ring_reset: */ if (slot->flags & NS_BUF_CHANGED) { /* buffer has changed, unload and reload map */ - netmap_reload_map(txr->txtag, txbuf->map, - addr, na->buff_size); + netmap_reload_map(txr->txtag, txbuf->map, addr); slot->flags &= ~NS_BUF_CHANGED; } @@ -479,16 +479,16 @@ ixgbe_netmap_rxsync(void *a, u_int ring_nr, int do_lock) struct netmap_slot *slot = &ring->slot[j]; union ixgbe_adv_rx_desc *curr = &rxr->rx_base[l]; struct ixgbe_rx_buf *rxbuf = &rxr->rx_buffers[l]; - void *addr = NMB(slot); + uint64_t paddr; + void *addr = PNMB(slot, &paddr); if (addr == netmap_buffer_base) /* bad buf */ goto ring_reset; curr->wb.upper.status_error = 0; - curr->read.pkt_addr = htole64(vtophys(addr)); + curr->read.pkt_addr = htole64(paddr); if (slot->flags & NS_BUF_CHANGED) { - netmap_reload_map(rxr->ptag, rxbuf->pmap, - addr, na->buff_size); + netmap_reload_map(rxr->ptag, rxbuf->pmap, addr); slot->flags &= ~NS_BUF_CHANGED; } diff --git a/sys/dev/netmap/netmap.c b/sys/dev/netmap/netmap.c index 5c960ac..92c6573 100644 --- a/sys/dev/netmap/netmap.c +++ b/sys/dev/netmap/netmap.c @@ -104,6 +104,13 @@ MALLOC_DEFINE(M_NETMAP, "netmap", "Network memory map"); static void * netmap_malloc(size_t size, const char *msg); static void netmap_free(void *addr, const char *msg); +#define netmap_if_malloc(len) netmap_malloc(len, "nifp") +#define netmap_if_free(v) netmap_free((v), "nifp") + +#define netmap_ring_malloc(len) netmap_malloc(len, "ring") +#define netmap_free_rings(na) \ + netmap_free((na)->tx_rings[0].ring, "shadow rings"); + /* * Allocator for a pool of packet buffers. For each buffer we have * one entry in the bitmap to signal the state. Allocation scans @@ -123,7 +130,7 @@ struct netmap_buf_pool { struct netmap_buf_pool nm_buf_pool; /* XXX move these two vars back into netmap_buf_pool */ u_int netmap_total_buffers; -char *netmap_buffer_base; +char *netmap_buffer_base; /* address of an invalid buffer */ /* user-controlled variables */ int netmap_verbose; @@ -233,6 +240,12 @@ struct netmap_priv_d { uint16_t np_txpoll; }; +/* Shorthand to compute a netmap interface offset. */ +#define netmap_if_offset(v) \ + ((char *) (v) - (char *) netmap_mem_d->nm_buffer) +/* .. and get a physical address given a memory offset */ +#define netmap_ofstophys(o) \ + (vtophys(netmap_mem_d->nm_buffer) + (o)) static struct cdev *netmap_dev; /* /dev/netmap character device. */ static struct netmap_mem_d *netmap_mem_d; /* Our memory allocator. */ @@ -397,10 +410,10 @@ netmap_dtor(void *data) ring->slot[j].buf_idx); } NMA_UNLOCK(); - netmap_free(na->tx_rings[0].ring, "shadow rings"); + netmap_free_rings(na); wakeup(na); } - netmap_free(nifp, "nifp"); + netmap_if_free(nifp); na->nm_lock(ifp->if_softc, NETMAP_CORE_UNLOCK, 0); @@ -432,7 +445,7 @@ netmap_if_new(const char *ifname, struct netmap_adapter *na) * to the tx and rx rings in the shared memory region. */ len = sizeof(struct netmap_if) + 2 * n * sizeof(ssize_t); - nifp = netmap_malloc(len, "nifp"); + nifp = netmap_if_malloc(len); if (nifp == NULL) return (NULL); @@ -455,13 +468,13 @@ netmap_if_new(const char *ifname, struct netmap_adapter *na) len = n * (2 * sizeof(struct netmap_ring) + (na->num_tx_desc + na->num_rx_desc) * sizeof(struct netmap_slot) ); - buff = netmap_malloc(len, "shadow rings"); + buff = netmap_ring_malloc(len); if (buff == NULL) { D("failed to allocate %d bytes for %s shadow ring", len, ifname); error: (na->refcount)--; - netmap_free(nifp, "nifp, rings failed"); + netmap_if_free(nifp); return (NULL); } /* do we have the bufers ? we are in need of num_tx_desc buffers for @@ -907,11 +920,12 @@ netmap_ioctl(__unused struct cdev *dev, u_long cmd, caddr_t data, /* * do something similar to netmap_dtor(). */ - netmap_free(na->tx_rings[0].ring, "rings, reg.failed"); - free(na->tx_rings, M_DEVBUF); + netmap_free_rings(na); + // XXX tx_rings is inline, must not be freed. + // free(na->tx_rings, M_DEVBUF); // XXX wrong ? na->tx_rings = na->rx_rings = NULL; na->refcount--; - netmap_free(nifp, "nifp, rings failed"); + netmap_if_free(nifp); nifp = NULL; } } @@ -1388,22 +1402,18 @@ ns_dmamap_cb(__unused void *arg, __unused bus_dma_segment_t * segs, * XXX buflen is probably not needed, buffers have constant size. */ void -netmap_reload_map(bus_dma_tag_t tag, bus_dmamap_t map, - void *buf, bus_size_t buflen) +netmap_reload_map(bus_dma_tag_t tag, bus_dmamap_t map, void *buf) { - bus_addr_t paddr; bus_dmamap_unload(tag, map); - bus_dmamap_load(tag, map, buf, buflen, ns_dmamap_cb, &paddr, - BUS_DMA_NOWAIT); + bus_dmamap_load(tag, map, buf, NETMAP_BUF_SIZE, ns_dmamap_cb, + NULL, BUS_DMA_NOWAIT); } void -netmap_load_map(bus_dma_tag_t tag, bus_dmamap_t map, - void *buf, bus_size_t buflen) +netmap_load_map(bus_dma_tag_t tag, bus_dmamap_t map, void *buf) { - bus_addr_t paddr; - bus_dmamap_load(tag, map, buf, buflen, ns_dmamap_cb, &paddr, - BUS_DMA_NOWAIT); + bus_dmamap_load(tag, map, buf, NETMAP_BUF_SIZE, ns_dmamap_cb, + NULL, BUS_DMA_NOWAIT); } /*------ netmap memory allocator -------*/ diff --git a/sys/dev/netmap/netmap_kern.h b/sys/dev/netmap/netmap_kern.h index 8fa95fa..d35e503 100644 --- a/sys/dev/netmap/netmap_kern.h +++ b/sys/dev/netmap/netmap_kern.h @@ -169,10 +169,8 @@ int netmap_start(struct ifnet *, struct mbuf *); enum txrx { NR_RX = 0, NR_TX = 1 }; struct netmap_slot *netmap_reset(struct netmap_adapter *na, enum txrx tx, int n, u_int new_cur); -void netmap_load_map(bus_dma_tag_t tag, bus_dmamap_t map, - void *buf, bus_size_t buflen); -void netmap_reload_map(bus_dma_tag_t tag, bus_dmamap_t map, - void *buf, bus_size_t buflen); +void netmap_load_map(bus_dma_tag_t tag, bus_dmamap_t map, void *buf); +void netmap_reload_map(bus_dma_tag_t tag, bus_dmamap_t map, void *buf); int netmap_ring_reinit(struct netmap_kring *); /* @@ -206,11 +204,11 @@ enum { /* verbose flags */ /* - * return the address of a buffer. + * NMB return the virtual address of a buffer (buffer 0 on bad index) + * PNMB also fills the physical address * XXX this is a special version with hardwired 2k bufs - * On error return netmap_buffer_base which is detected as a bad pointer. */ -static inline char * +static inline void * NMB(struct netmap_slot *slot) { uint32_t i = slot->buf_idx; @@ -222,4 +220,18 @@ NMB(struct netmap_slot *slot) #endif } +static inline void * +PNMB(struct netmap_slot *slot, uint64_t *pp) +{ + uint32_t i = slot->buf_idx; + void *ret = (i >= netmap_total_buffers) ? netmap_buffer_base : +#if NETMAP_BUF_SIZE == 2048 + netmap_buffer_base + (i << 11); +#else + netmap_buffer_base + (i *NETMAP_BUF_SIZE); +#endif + *pp = vtophys(ret); + return ret; +} + #endif /* _NET_NETMAP_KERN_H_ */ |