PERFORCE change 181115 for review
Alexandre Fiveg
afiveg at FreeBSD.org
Sat Jul 17 19:10:46 UTC 2010
http://p4web.freebsd.org/@@181115?ac=10
Change 181115 by afiveg at ringmap-2 on 2010/07/17 19:10:20
ringmap_attach() _detach() ported to ixgbe and work properly. Next, working with interrupts.
Affected files ...
.. //depot/projects/soc2010/ringmap/current/sys/dev/ixgbe/ixgbe.c#4 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/ixgbe/ixgbe.h#3 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/ixgbe/ringmap_8259.h#2 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/ixgbe/ringmap_ixgbe.c#3 edit
.. //depot/projects/soc2010/ringmap/current/sys/net/ringmap.c#33 edit
.. //depot/projects/soc2010/ringmap/current/sys/net/ringmap.h#33 edit
Differences ...
==== //depot/projects/soc2010/ringmap/current/sys/dev/ixgbe/ixgbe.c#4 (text+ko) ====
@@ -38,6 +38,10 @@
#include "ixgbe.h"
+#ifdef RINGMAP
+#include <net/ringmap.h>
+#endif
+
/*********************************************************************
* Set this to one to display debug statistics
*********************************************************************/
@@ -153,7 +157,11 @@
static void ixgbe_print_hw_stats(struct adapter *);
static void ixgbe_print_debug_info(struct adapter *);
static void ixgbe_update_link_status(struct adapter *);
+
+#ifndef RINGMAP
static void ixgbe_refresh_mbufs(struct rx_ring *, int);
+#endif
+
static int ixgbe_xmit(struct tx_ring *, struct mbuf **);
static int ixgbe_sysctl_stats(SYSCTL_HANDLER_ARGS);
static int ixgbe_sysctl_debug(SYSCTL_HANDLER_ARGS);
@@ -198,6 +206,15 @@
static void ixgbe_reinit_fdir(void *, int);
#endif
+
+#ifdef RINGMAP
+extern int ringmap_attach (device_t, struct ringmap_functions *);
+extern int ringmap_detach (device_t);
+
+extern struct ringmap_functions ringmap_f;
+#endif
+
+
/*********************************************************************
* FreeBSD Device Interface Entry Points
*********************************************************************/
@@ -212,7 +229,11 @@
};
static driver_t ixgbe_driver = {
+#ifndef RINGMAP
"ix", ixgbe_methods, sizeof(struct adapter),
+#else
+ "ringmap", ixgbe_methods, sizeof(struct adapter),
+#endif
};
#ifndef RINGMAP
@@ -220,10 +241,15 @@
#endif
devclass_t ixgbe_devclass;
+#ifndef RINGMAP
DRIVER_MODULE(ixgbe, pci, ixgbe_driver, ixgbe_devclass, 0, 0);
-
MODULE_DEPEND(ixgbe, pci, 1, 1, 1);
MODULE_DEPEND(ixgbe, ether, 1, 1, 1);
+#else
+DRIVER_MODULE(ringmap, pci, ixgbe_driver, ixgbe_devclass, 0, 0);
+MODULE_DEPEND(ringmap, pci, 1, 1, 1);
+MODULE_DEPEND(ringmap, ether, 1, 1, 1);
+#endif
/*
** TUNEABLE PARAMETERS:
@@ -330,9 +356,6 @@
static int fdir_pballoc = 1;
#endif
-#ifdef RINGMAP
-#include <net/ringmap.h>
-#endif
/*********************************************************************
* Device identification routine
@@ -632,6 +655,11 @@
ctrl_ext |= IXGBE_CTRL_EXT_DRV_LOAD;
IXGBE_WRITE_REG(hw, IXGBE_CTRL_EXT, ctrl_ext);
+
+#ifdef RINGMAP
+ ringmap_attach(dev, &ringmap_f);
+#endif
+
INIT_DEBUGOUT("ixgbe_attach: end");
return (0);
err_late:
@@ -662,6 +690,10 @@
INIT_DEBUGOUT("ixgbe_detach: begin");
+#ifdef RINGMAP
+ ringmap_detach (dev);
+#endif
+
/* Make sure VLANS are not using driver */
if (adapter->ifp->if_vlantrunk != NULL) {
device_printf(dev,"Vlan in use, detach first\n");
@@ -1285,8 +1317,13 @@
struct ifnet *ifp = adapter->ifp;
bool more;
+#ifdef RINGMAP
+ struct capt_object *co = NULL;
+#endif
+
if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
more = ixgbe_rxeof(que, adapter->rx_process_limit);
+
IXGBE_TX_LOCK(txr);
ixgbe_txeof(txr);
#if __FreeBSD_version >= 800000
@@ -1297,6 +1334,19 @@
ixgbe_start_locked(txr, ifp);
#endif
IXGBE_TX_UNLOCK(txr);
+
+#ifdef RINGMAP
+ adapter->rm->funcs->sync_head(adapter->dev);
+
+ /* Wakeup threads with not empty rings */
+ 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;
@@ -1377,8 +1427,13 @@
bool more_tx, more_rx;
u32 newitr = 0;
+#ifdef RINGMAP
+ struct capt_object *co = NULL;
+ adapter->rm->funcs->delayed_isr(adapter);
+#endif
++que->irqs;
+
more_rx = ixgbe_rxeof(que, adapter->rx_process_limit);
IXGBE_TX_LOCK(txr);
@@ -1387,6 +1442,18 @@
more_rx = ixgbe_rxeof(que, adapter->rx_process_limit);
+#ifdef RINGMAP
+ adapter->rm->funcs->sync_head(adapter->dev);
+
+ /* Wakeup threads with not empty rings */
+ SLIST_FOREACH(co, &adapter->rm->object_list, objects) {
+ if (RING_NOT_EMPTY(co->ring)){
+ wakeup(co->ring);
+ }
+ }
+#endif
+
+
/* Do AIM now? */
if (ixgbe_enable_aim == FALSE)
@@ -2048,7 +2115,6 @@
device_t dev = adapter->dev;
struct ix_queue *que = adapter->queues;
int error, rid = 0;
-
/* MSI RID at 1 */
if (adapter->msix == 1)
rid = 1;
@@ -2114,6 +2180,9 @@
struct ix_queue *que = adapter->queues;
int error, rid, vector = 0;
+/*TODO: remove it ASAP */
+ RINGMAP_FUNC_DEBUG(start);
+
for (int i = 0; i < adapter->num_queues; i++, vector++, que++) {
rid = vector + 1;
que->res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
@@ -3367,6 +3436,7 @@
* be recalled to try again.
*
**********************************************************************/
+#ifndef RINGMAP
static void
ixgbe_refresh_mbufs(struct rx_ring *rxr, int limit)
{
@@ -3440,6 +3510,7 @@
IXGBE_RDT(rxr->me), cleaned);
return;
}
+#endif /* !RINGMAP */
/*********************************************************************
*
@@ -4258,6 +4329,10 @@
if (++i == adapter->num_rx_desc)
i = 0;
+
+#ifndef RINGMAP
+/* RINGMAP: Do not send packet to the IP-stack. Andd do not refresh */
+
/* Now send to the stack or do LRO */
if (sendmp != NULL)
ixgbe_rx_input(rxr, ifp, sendmp, ptype);
@@ -4267,13 +4342,20 @@
ixgbe_refresh_mbufs(rxr, i);
processed = 0;
}
+#else
+ if (adapter->rm != NULL)
+ adapter->rm->funcs->delayed_isr_per_packet(adapter->dev,
+ R_MODULO(i-1));
+#endif
}
+#ifndef RINGMAP
/* Refresh any remaining buf structs */
if (processed != 0) {
ixgbe_refresh_mbufs(rxr, i);
processed = 0;
}
+#endif
rxr->next_to_check = i;
==== //depot/projects/soc2010/ringmap/current/sys/dev/ixgbe/ixgbe.h#3 (text+ko) ====
@@ -119,8 +119,15 @@
* against the system mbuf pool limit, you can tune nmbclusters
* to adjust for this.
*/
+
+#ifndef RINGMAP
#define DEFAULT_RXD 1024
#define PERFORM_RXD 2048
+#else
+#define DEFAULT_RXD SLOTS_NUMBER
+#define PERFORM_RXD SLOTS_NUMBER
+#endif
+
#define MAX_RXD 4096
#define MIN_RXD 64
==== //depot/projects/soc2010/ringmap/current/sys/dev/ixgbe/ringmap_8259.h#2 (text+ko) ====
==== //depot/projects/soc2010/ringmap/current/sys/dev/ixgbe/ringmap_ixgbe.c#3 (text+ko) ====
@@ -55,6 +55,25 @@
};
+/*
+ * Set pointer to ringmap in the adapter structure.
+ */
+int
+rm_8259_set_ringmap_to_adapter(device_t dev, struct ringmap *rm)
+{
+ struct adapter *adapter;
+
+ adapter = (struct adapter *)device_get_softc(dev);
+ adapter->rm = rm;
+
+#if (__RINGMAP_DEB)
+ printf(RINGMAP_PREFIX"Number of queeus on adapter: %d\n",
+ adapter->num_queues);
+#endif
+ return (0);
+}
+
+
/*
* This function synchronize the tail and head hardware registers
* with head and tail software varibles, that are visible from
@@ -78,10 +97,8 @@
struct adapter *adapter;
adapter = (struct adapter *)device_get_softc(dev);
- RINGMAP_FUNC_DEBUG(start);
- RINGMAP_FUNC_DEBUG(end);
}
@@ -90,7 +107,6 @@
{
struct adapter *adapter;
- RINGMAP_FUNC_DEBUG(start);
adapter = (struct adapter *)device_get_softc(dev);
@@ -98,7 +114,6 @@
RINGMAP_UNLOCK(adapter->rm);
- RINGMAP_FUNC_DEBUG(end);
}
@@ -123,15 +138,15 @@
struct adapter *adapter = (struct adapter *)context;
struct timeval last_ts;
- RINGMAP_INTR(start);
RINGMAP_LOCK(adapter->rm);
- getmicrotime(&last_ts);
- rm_8259_sync_tail(adapter->dev);
-
+ if ( adapter->rm->open_cnt > 0 ) {
+ adapter->rm->interrupts_counter++;
+ getmicrotime(&last_ts);
+ rm_8259_sync_tail(adapter->dev);
+ }
RINGMAP_UNLOCK(adapter->rm);
- RINGMAP_INTR(end);
}
@@ -221,19 +236,6 @@
}
-/*
- * Set pointer to ringmap in the adapter structure.
- */
-int
-rm_8259_set_ringmap_to_adapter(device_t dev, struct ringmap *rm)
-{
- struct adapter *adapter;
-
- adapter = (struct adapter *)device_get_softc(dev);
- adapter->rm = rm;
-
- return (0);
-}
/*
==== //depot/projects/soc2010/ringmap/current/sys/net/ringmap.c#33 (text+ko) ====
==== //depot/projects/soc2010/ringmap/current/sys/net/ringmap.h#33 (text+ko) ====
More information about the p4-projects
mailing list