PERFORCE change 181556 for review
Alexandre Fiveg
afiveg at FreeBSD.org
Thu Jul 29 14:28:24 UTC 2010
http://p4web.freebsd.org/@@181556?ac=10
Change 181556 by afiveg at ringmap-2 on 2010/07/29 14:27:34
The RINGMAP hooks are removed from ixgbe_handle_que() ixgbe_msix_que() to the *_rxeof function. The same will be done for if_lem. The *_rxeof is the best place for interrupt ringmap-code because this function will called always independent of th interrupt-modell (legacy , msi, etc...)
Affected files ...
.. //depot/projects/soc2010/ringmap/current/contrib/libpcap/ringmap_pcap.c#25 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/ixgbe/ixgbe.c#10 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/ixgbe/ixgbe.h#9 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/ixgbe/ringmap_8259.h#8 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/ixgbe/ringmap_ixgbe.c#9 edit
.. //depot/projects/soc2010/ringmap/current/sys/net/ringmap.c#39 edit
.. //depot/projects/soc2010/ringmap/current/sys/net/ringmap.h#39 edit
.. //depot/projects/soc2010/ringmap/current/sys/net/ringmap_kernel.h#9 edit
.. //depot/projects/soc2010/ringmap/scripts/build_ringmap.sh#20 edit
.. //depot/projects/soc2010/ringmap/scripts/set_ringmap.sh#21 edit
.. //depot/projects/soc2010/ringmap/scripts/tailf_ringmap_msgs.sh#15 edit
.. //depot/projects/soc2010/ringmap/tests/ringmap/close.c#8 edit
.. //depot/projects/soc2010/ringmap/tests/ringmap/ioctl.c#8 edit
.. //depot/projects/soc2010/ringmap/tests/ringmap/main.c#10 edit
.. //depot/projects/soc2010/ringmap/tests/ringmap/mmap.c#10 edit
.. //depot/projects/soc2010/ringmap/tests/ringmap/open.c#10 edit
.. //depot/projects/soc2010/ringmap/tests/ringmap/tests.h#8 edit
Differences ...
==== //depot/projects/soc2010/ringmap/current/contrib/libpcap/ringmap_pcap.c#25 (text+ko) ====
@@ -248,7 +248,8 @@
}
again:
-
+
+
if ( RING_IS_EMPTY(ring) ) {
#if (__RINGMAP_DEB)
@@ -295,6 +296,7 @@
ring->pkt_counter++;
--ws;
+ PRINT_PKT_BYTES(datap, curr_slot);
(*callback)(user, &pkthdr, datap);
#if (__RINGMAP_DEB)
==== //depot/projects/soc2010/ringmap/current/sys/dev/ixgbe/ixgbe.c#10 (text+ko) ====
@@ -1322,12 +1322,6 @@
struct ifnet *ifp = adapter->ifp;
bool more;
-#ifdef RINGMAP
- struct capt_object *co = NULL;
-
- adapter->rm->funcs->delayed_isr(que);
-#endif
-
if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
more = ixgbe_rxeof(que, adapter->rx_process_limit);
@@ -1342,19 +1336,6 @@
#endif
IXGBE_TX_UNLOCK(txr);
-#ifdef RINGMAP
- IXGBE_RX_LOCK(que->rxr);
- adapter->rm->funcs->sync_head(que);
- IXGBE_RX_UNLOCK(que->rxr);
-
- /* TODO: don't wake up the all threads, only our thread! */
- SLIST_FOREACH(co, &adapter->rm->object_list, objects) {
- if (RING_NOT_EMPTY(co->ring)){
- wakeup(co->ring);
- }
- }
-#endif
-
if (more) {
taskqueue_enqueue(que->tq, &que->que_task);
return;
@@ -3447,9 +3428,8 @@
**********************************************************************/
#ifndef RINGMAP
static
-#else
+#endif
void
-#endif
ixgbe_refresh_mbufs(struct rx_ring *rxr, int limit)
{
struct adapter *adapter = rxr->adapter;
@@ -3460,11 +3440,11 @@
struct ixgbe_rx_buf *rxbuf;
#ifndef RINGMAP
struct mbuf *mh, *mp;
+ int i, nsegs, error, cleaned;
#else
- struct mbuf *mp;
+ int i, nsegs, cleaned;
#endif
- int i, nsegs, error, cleaned;
i = rxr->next_to_refresh;
cleaned = -1; /* Signify no completions */
@@ -3499,9 +3479,6 @@
if (rxbuf->m_pack == NULL) {
mp = m_getjcl(M_DONTWAIT, MT_DATA,
M_PKTHDR, adapter->rx_mbuf_sz);
-#else
- mp = rxbuf->m_pack;
-#endif
if (mp == NULL)
goto update;
mp->m_pkthdr.len = mp->m_len = adapter->rx_mbuf_sz;
@@ -3516,10 +3493,24 @@
goto update;
}
rxbuf->m_pack = mp;
+#endif
bus_dmamap_sync(rxr->ptag, rxbuf->pmap,
BUS_DMASYNC_PREREAD);
+#ifndef RINGMAP
rxr->rx_base[i].read.pkt_addr =
htole64(pseg[0].ds_addr);
+#else
+ bus_dmamap_load_mbuf_sg(rxr->ptag,
+ rxbuf->pmap, rxbuf->m_pack, pseg, &nsegs, BUS_DMA_NOWAIT);
+
+ rxr->rx_base[i].read.pkt_addr =
+ htole64(pseg[0].ds_addr);
+
+ printf("[%s] rxbuf->m_pack [%d] : 0x%X\n",
+ __func__, i, (unsigned int)rxbuf->m_pack);
+ printf("[%s] pckt phys addr [%d] : 0x%llX\n",
+ __func__, i, rxr->rx_base[i].read.pkt_addr);
+#endif
#ifndef RINGMAP
}
#endif
@@ -3533,9 +3524,9 @@
/* This is the work marker for refresh */
rxr->next_to_refresh = i;
}
+#ifndef RINGMAP
update:
-#ifndef RINGMAP
if (cleaned != -1) /* If we refreshed some, bump tail */
IXGBE_WRITE_REG(&adapter->hw,
IXGBE_RDT(rxr->me), cleaned);
@@ -3796,6 +3787,13 @@
rxbuf->pmap, BUS_DMASYNC_PREREAD);
/* Update descriptor */
rxr->rx_base[j].read.pkt_addr = htole64(pseg[0].ds_addr);
+
+//#ifdef RINGMAP
+//#if (__RINGMAP_DEB)
+// printf("[%s] pkt phys addr [%d] : 0x%llX\n",
+// __func__, j, htole64(pseg[0].ds_addr));
+//#endif
+//#endif
}
@@ -4174,6 +4172,11 @@
IXGBE_RX_LOCK(rxr);
+#ifdef RINGMAP
+ struct capt_object *co = NULL;
+ adapter->rm->funcs->delayed_isr(que);
+#endif
+
for (i = rxr->next_to_check; count != 0;) {
struct mbuf *sendmp, *mh, *mp;
u32 rsc, ptype;
@@ -4201,6 +4204,20 @@
mh = rbuf->m_head;
mp = rbuf->m_pack;
+#ifdef RINGMAP
+ bus_dmamap_sync(rxr->ptag, rbuf->pmap,
+ BUS_DMASYNC_POSTREAD);
+
+ bus_dmamap_unload(rxr->ptag, rbuf->pmap);
+
+#if (__RINGMAP_DEB)
+ printf("[%s] mp = 0x%X\n", __func__, (unsigned int)mp);
+ printf("[%s] mp->m_data = 0x%X\n", __func__, (unsigned int)mp->m_data);
+ printf("[%s] pckt phys addr [%d] : 0x%llX\n",
+ __func__, i, rxr->rx_base[i].read.pkt_addr);
+ PRINT_PKT_BYTES(mp->m_data, i);
+#endif
+#endif
plen = le16toh(cur->wb.upper.length);
ptype = le32toh(cur->wb.lower.lo_dword.data) &
IXGBE_RXDADV_PKTTYPE_MASK;
@@ -4339,7 +4356,7 @@
sendmp->m_pkthdr.ether_vtag = vtag;
sendmp->m_flags |= M_VLANTAG;
}
- }
+ }
/* Pass the head pointer on */
if (eop == 0) {
nbuf->fmp = sendmp;
@@ -4393,6 +4410,17 @@
}
}
+#ifdef RINGMAP
+ adapter->rm->funcs->sync_head(que);
+
+ /* TODO: Only our co not all */
+ SLIST_FOREACH(co, &adapter->rm->object_list, objects) {
+ if (RING_NOT_EMPTY(co->ring)){
+ wakeup(co->ring);
+ }
+ }
+#endif
+
/* Refresh any remaining buf structs */
if (processed != 0) {
ixgbe_refresh_mbufs(rxr, i);
==== //depot/projects/soc2010/ringmap/current/sys/dev/ixgbe/ixgbe.h#9 (text+ko) ====
==== //depot/projects/soc2010/ringmap/current/sys/dev/ixgbe/ringmap_8259.h#8 (text+ko) ====
==== //depot/projects/soc2010/ringmap/current/sys/dev/ixgbe/ringmap_ixgbe.c#9 (text+ko) ====
@@ -4,8 +4,10 @@
#include <sys/conf.h>
#include <sys/queue.h>
#include <sys/taskqueue.h>
+#include <sys/endian.h>
#include <machine/bus.h>
+#include <machine/atomic.h>
#include <net/if.h>
#include <net/if_var.h>
@@ -109,6 +111,7 @@
struct adapter *adapter = que->adapter;
struct capt_object *co = NULL;
+
RINGMAP_LOCK(adapter->rm);
co = get_capt_obj(que);
if (co != NULL) {
@@ -164,6 +167,7 @@
struct ixgbe_rx_buf *rxbuf;
struct ringmap *rm = adapter->rm;;
struct capt_object *co = NULL;
+ char c;
RINGMAP_INTR(start);
@@ -178,20 +182,34 @@
co = get_capt_obj(que);
if (co != NULL) {
+
co->ring->slot[slot_num].intr_num = co->ring->intr_num;
co->ring->slot[slot_num].ts = co->ring->last_ts;
co->ring->slot[slot_num].is_ok = 1;
rxbuf = &que->rxr->rx_buffers[slot_num];
- bus_dmamap_sync(que->rxr->htag, rxbuf->hmap,
- BUS_DMASYNC_POSTREAD);
+
#if (RINGMAP_INTR_DEB)
+ rxbuf->m_pack = (struct mbuf *)K_MBUF(co->ring, slot_num);
+ rxbuf->m_pack->m_data = (void *)K_PACKET(co->ring, slot_num);
+ que->rxr->rx_base[slot_num].read.pkt_addr =
+ htole64(vtophys(K_PACKET(co->ring, slot_num)));
+ printf("---------------------------------------------------- \n");
printf(RINGMAP_PREFIX"[%s] Slot = %d\n", __func__, slot_num);
PRINT_SLOT(co->ring, slot_num);
PRINT_RING_PTRS(co->ring);
+
+ printf("[%s] rxbuf->m_pack [%d] : 0x%X\n",
+ __func__, slot_num, (unsigned int)rxbuf->m_pack);
+ printf("[%s] pckt phys addr [%d] : 0x%llX\n",
+ __func__, slot_num,
+ que->rxr->rx_base[slot_num].read.pkt_addr);
+ printf("---------------------------------------------------- \n");
#endif
-
+ /* touch the packet buffer */
+ c = rxbuf->m_pack->m_data[30];
+ rxbuf->m_pack->m_data[30] = rxbuf->m_pack->m_data[30];
}
}
==== //depot/projects/soc2010/ringmap/current/sys/net/ringmap.c#39 (text+ko) ====
@@ -109,6 +109,10 @@
/* set the pointer to ringmap into the adapters structure */
rm->funcs->set_ringmap_to_adapter(dev, rm);
+#if (__RINGMAP_DEB)
+ printf("Page Size: %d \n", PAGE_SIZE);
+#endif
+
RINGMAP_FUNC_DEBUG(end);
return (0);
==== //depot/projects/soc2010/ringmap/current/sys/net/ringmap.h#39 (text+ko) ====
@@ -285,8 +285,8 @@
#define PRINT_PKT_BYTES(pktp, i) \
- printf("=+= [%s] SOME BYTES FROM PKT: %hhX %hhX %hhX %hhX %hhX\n", \
- __func__, pktp[0], pktp[1], pktp[16], pktp[32], pktp[59]);
+ printf("=+= [%s] SOME BYTES FROM PKT: %hhd %hhd %hhd %hhd %hhd %hhd %hhd\n", \
+ __func__, pktp[0], pktp[1], pktp[2], pktp[30], pktp[31], pktp[32], pktp[33]);
#define PRINT_PACKET_ADDR(ring, i) \
do { \
@@ -298,9 +298,9 @@
#define PRINT_MBUF_ADDR(ring, i) \
do { \
- printf("=+= mbuf.user=0x%X, mbuf.phys=0x%X, mbuf.kern=0x%X\n", \
+ printf("=+= mbuf.user=0x%X, mbuf.phys=0x%llX, mbuf.kern=0x%X\n", \
(unsigned int)ring->slot[i].mbuf.user, \
- (unsigned int)ring->slot[i].mbuf.phys, \
+ (long long unsigned int)ring->slot[i].mbuf.phys, \
(unsigned int)ring->slot[i].mbuf.kern); \
} while (0);
==== //depot/projects/soc2010/ringmap/current/sys/net/ringmap_kernel.h#9 (text+ko) ====
==== //depot/projects/soc2010/ringmap/scripts/build_ringmap.sh#20 (text+ko) ====
==== //depot/projects/soc2010/ringmap/scripts/set_ringmap.sh#21 (text+ko) ====
==== //depot/projects/soc2010/ringmap/scripts/tailf_ringmap_msgs.sh#15 (text+ko) ====
==== //depot/projects/soc2010/ringmap/tests/ringmap/close.c#8 (text+ko) ====
==== //depot/projects/soc2010/ringmap/tests/ringmap/ioctl.c#8 (text+ko) ====
==== //depot/projects/soc2010/ringmap/tests/ringmap/main.c#10 (text+ko) ====
==== //depot/projects/soc2010/ringmap/tests/ringmap/mmap.c#10 (text+ko) ====
==== //depot/projects/soc2010/ringmap/tests/ringmap/open.c#10 (text+ko) ====
==== //depot/projects/soc2010/ringmap/tests/ringmap/tests.h#8 (text+ko) ====
More information about the p4-projects
mailing list