- add netmap-libpcap
- add netmap (FreeBSD header files need to be updated with this) - move prototype perl scripts to prototype/ folder - create basic structure for sipcap app (no code yet)
This commit is contained in:
145
netmap/LINUX/wip-patches/diff--mellanox--30300--30800
Normal file
145
netmap/LINUX/wip-patches/diff--mellanox--30300--30800
Normal file
@ -0,0 +1,145 @@
|
||||
diff -urp --exclude '*.o' --exclude '*.cmd' --exclude '*mod.c' drivers/net/ethernet/mellanox/mlx4/en_netdev.c ./mellanox/mlx4/en_netdev.c
|
||||
--- drivers/net/ethernet/mellanox/mlx4/en_netdev.c 2012-09-11 20:50:55.982624673 -0700
|
||||
+++ ./mellanox/mlx4/en_netdev.c 2012-09-27 00:05:22.703523430 -0700
|
||||
@@ -48,6 +48,39 @@
|
||||
#include "mlx4_en.h"
|
||||
#include "en_port.h"
|
||||
|
||||
+#if defined(CONFIG_NETMAP) || defined(CONFIG_NETMAP_MODULE)
|
||||
+/*
|
||||
+ * This driver is split in multiple small files.
|
||||
+ * The main device descriptor has type struct mlx4_en_priv *priv;
|
||||
+ * and we attach to the device in mlx4_en_init_netdev()
|
||||
+ * (do port numbers start from 1 ?)
|
||||
+ *
|
||||
+ * The reconfig routine is in mlx4_en_start_port() (also here)
|
||||
+ * which is called on a mlx4_en_restart() (watchdog), open and set-mtu.
|
||||
+ *
|
||||
+ * priv->num_frags ??
|
||||
+ * DS_SIZE ??
|
||||
+ * apparently each rx desc is followed by frag.descriptors
|
||||
+ * and the rx desc is rounded up to a power of 2.
|
||||
+ *
|
||||
+ * Receive code is in en_rx.c
|
||||
+ * priv->rx_ring_num number of rx rings
|
||||
+ * rxr = prov->rx_ring[ring_ind] rx ring descriptor
|
||||
+ * rxr->size number of slots
|
||||
+ * rxr->prod producer
|
||||
+ * probably written into a mmio reg at *rxr->wqres.db.db
|
||||
+ * trimmed to 16 bits.
|
||||
+ *
|
||||
+ * Rx init routine:
|
||||
+ * mlx4_en_activate_rx_rings()
|
||||
+ * mlx4_en_init_rx_desc()
|
||||
+ * Transmit code is in en_tx.c
|
||||
+ */
|
||||
+
|
||||
+#define NETMAP_MLX4_MAIN
|
||||
+#include <mlx4_netmap_linux.h> /* extern stuff */
|
||||
+#endif /* CONFIG_NETMAP */
|
||||
+
|
||||
int mlx4_en_setup_tc(struct net_device *dev, u8 up)
|
||||
{
|
||||
if (up != MLX4_EN_NUM_UP)
|
||||
@@ -1042,6 +1075,9 @@ int mlx4_en_start_port(struct net_device
|
||||
/* Set initial ownership of all Tx TXBBs to SW (1) */
|
||||
for (j = 0; j < tx_ring->buf_size; j += STAMP_STRIDE)
|
||||
*((u32 *) (tx_ring->buf + j)) = 0xffffffff;
|
||||
+#ifdef DEV_NETMAP
|
||||
+ mlx4_netmap_tx_config(priv, i);
|
||||
+#endif /* DEV_NETMAP */
|
||||
++tx_index;
|
||||
}
|
||||
|
||||
@@ -1639,6 +1675,9 @@ int mlx4_en_init_netdev(struct mlx4_en_d
|
||||
en_warn(priv, "Using %d RX rings\n", prof->rx_ring_num);
|
||||
|
||||
queue_delayed_work(mdev->workqueue, &priv->stats_task, STATS_DELAY);
|
||||
+#ifdef DEV_NETMAP
|
||||
+ mlx4_netmap_attach(priv);
|
||||
+#endif /* DEV_NETMAP */
|
||||
return 0;
|
||||
|
||||
out:
|
||||
--- drivers/net/ethernet/mellanox/mlx4/en_rx.c 2012-09-11 20:50:55.982624673 -0700
|
||||
+++ ./mellanox/mlx4/en_rx.c 2012-09-27 00:13:16.099550954 -0700
|
||||
@@ -41,6 +41,9 @@
|
||||
|
||||
#include "mlx4_en.h"
|
||||
|
||||
+#if defined(CONFIG_NETMAP) || defined(CONFIG_NETMAP_MODULE)
|
||||
+#include <mlx4_netmap_linux.h>
|
||||
+#endif /* !DEV_NETMAP */
|
||||
|
||||
static int mlx4_en_alloc_frag(struct mlx4_en_priv *priv,
|
||||
struct mlx4_en_rx_desc *rx_desc,
|
||||
@@ -365,9 +368,16 @@ int mlx4_en_activate_rx_rings(struct mlx
|
||||
ring = &priv->rx_ring[ring_ind];
|
||||
|
||||
ring->size_mask = ring->actual_size - 1;
|
||||
+#ifdef DEV_NETMAP
|
||||
+ if (priv->dev->if_capenable & IFCAP_NETMAP) {
|
||||
+ int saved_cons = ring->cons;
|
||||
+ mlx4_en_free_rx_buf(priv, ring);
|
||||
+ ring->cons = saved_cons;
|
||||
+ mlx4_netmap_rx_config(priv, ring_ind);
|
||||
+ }
|
||||
+#endif /* DEV_NETMAP */
|
||||
mlx4_en_update_rx_prod_db(ring);
|
||||
}
|
||||
-
|
||||
return 0;
|
||||
|
||||
err_buffers:
|
||||
@@ -402,6 +412,11 @@ void mlx4_en_destroy_rx_ring(struct mlx4
|
||||
void mlx4_en_deactivate_rx_ring(struct mlx4_en_priv *priv,
|
||||
struct mlx4_en_rx_ring *ring)
|
||||
{
|
||||
+#ifdef DEV_NETMAP
|
||||
+ if (priv->dev->if_capenable & IFCAP_NETMAP)
|
||||
+ ND("netmap mode, rx buf already freed");
|
||||
+ else
|
||||
+#endif /* DEV_NETMAP */
|
||||
mlx4_en_free_rx_buf(priv, ring);
|
||||
if (ring->stride <= TXBB_SIZE)
|
||||
ring->buf -= TXBB_SIZE;
|
||||
@@ -718,6 +739,11 @@ int mlx4_en_poll_rx_cq(struct napi_struc
|
||||
struct mlx4_en_priv *priv = netdev_priv(dev);
|
||||
int done;
|
||||
|
||||
+#ifdef DEV_NETMAP
|
||||
+ if (netmap_rx_irq(cq->dev, cq->ring, &done)) {
|
||||
+ ND("rx_irq %d for netmap, budget %d done %d", cq->ring, budget, done);
|
||||
+ } else
|
||||
+#endif /* DEV_NETMAP */
|
||||
done = mlx4_en_process_rx_cq(dev, cq, budget);
|
||||
|
||||
/* If we used up all the quota - we're probably not done yet... */
|
||||
--- drivers/net/ethernet/mellanox/mlx4/en_tx.c 2012-09-11 20:50:55.982624673 -0700
|
||||
+++ ./mellanox/mlx4/en_tx.c 2012-09-27 00:05:22.713523348 -0700
|
||||
@@ -55,6 +55,10 @@ MODULE_PARM_DESC(inline_thold, "threshol
|
||||
|
||||
static u32 hashrnd __read_mostly;
|
||||
|
||||
+#if defined(CONFIG_NETMAP) || defined(CONFIG_NETMAP_MODULE)
|
||||
+#include <mlx4_netmap_linux.h> /* extern stuff */
|
||||
+#endif /* CONFIG_NETMAP */
|
||||
+
|
||||
int mlx4_en_create_tx_ring(struct mlx4_en_priv *priv,
|
||||
struct mlx4_en_tx_ring *ring, u32 size,
|
||||
u16 stride)
|
||||
@@ -396,6 +400,13 @@ void mlx4_en_tx_irq(struct mlx4_cq *mcq)
|
||||
|
||||
if (!spin_trylock(&ring->comp_lock))
|
||||
return;
|
||||
+#ifdef DEV_NETMAP
|
||||
+ /* XXX should be integrated with appropriate lock_wrapper manner? */
|
||||
+ if (netmap_tx_irq(cq->dev, cq->ring)) {
|
||||
+ ND(5, "wakeup queue %d", cq->ring);
|
||||
+ spin_unlock(&ring->comp_lock);
|
||||
+ return;
|
||||
+ }
|
||||
+#endif /* DEV_NETMAP */
|
||||
mlx4_en_process_tx_cq(cq->dev, cq);
|
||||
mod_timer(&cq->timer, jiffies + 1);
|
||||
spin_unlock(&ring->comp_lock);
|
163
netmap/LINUX/wip-patches/diff--mlx4--20630--30200
Normal file
163
netmap/LINUX/wip-patches/diff--mlx4--20630--30200
Normal file
@ -0,0 +1,163 @@
|
||||
diff -urp --exclude '*.o' --exclude '*.cmd' --exclude '*mod.c' drivers/net/ethernet/mellanox/mlx4/en_netdev.c ./mellanox/mlx4/en_netdev.c
|
||||
--- drivers/net/ethernet/mellanox/mlx4/en_netdev.c 2012-09-11 20:50:55.982624673 -0700
|
||||
+++ ./mlx4/en_netdev.c 2012-09-27 00:05:22.703523430 -0700
|
||||
@@ -48,6 +48,39 @@
|
||||
#include "mlx4_en.h"
|
||||
#include "en_port.h"
|
||||
|
||||
+#if defined(CONFIG_NETMAP) || defined(CONFIG_NETMAP_MODULE)
|
||||
+/*
|
||||
+ * This driver is split in multiple small files.
|
||||
+ * The main device descriptor has type struct mlx4_en_priv *priv;
|
||||
+ * and we attach to the device in mlx4_en_init_netdev()
|
||||
+ * (do port numbers start from 1 ?)
|
||||
+ *
|
||||
+ * The reconfig routine is in mlx4_en_start_port() (also here)
|
||||
+ * which is called on a mlx4_en_restart() (watchdog), open and set-mtu.
|
||||
+ *
|
||||
+ * priv->num_frags ??
|
||||
+ * DS_SIZE ??
|
||||
+ * apparently each rx desc is followed by frag.descriptors
|
||||
+ * and the rx desc is rounded up to a power of 2.
|
||||
+ *
|
||||
+ * Receive code is in en_rx.c
|
||||
+ * priv->rx_ring_num number of rx rings
|
||||
+ * rxr = prov->rx_ring[ring_ind] rx ring descriptor
|
||||
+ * rxr->size number of slots
|
||||
+ * rxr->prod producer
|
||||
+ * probably written into a mmio reg at *rxr->wqres.db.db
|
||||
+ * trimmed to 16 bits.
|
||||
+ *
|
||||
+ * Rx init routine:
|
||||
+ * mlx4_en_activate_rx_rings()
|
||||
+ * mlx4_en_init_rx_desc()
|
||||
+ * Transmit code is in en_tx.c
|
||||
+ */
|
||||
+
|
||||
+#define NETMAP_MLX4_MAIN
|
||||
+#include <mlx4_netmap_linux.h> /* extern stuff */
|
||||
+#endif /* CONFIG_NETMAP */
|
||||
+
|
||||
int mlx4_en_setup_tc(struct net_device *dev, u8 up)
|
||||
{
|
||||
if (up != MLX4_EN_NUM_UP)
|
||||
@@ -1042,6 +1075,9 @@ int mlx4_en_start_port(struct net_device
|
||||
/* Set initial ownership of all Tx TXBBs to SW (1) */
|
||||
for (j = 0; j < tx_ring->buf_size; j += STAMP_STRIDE)
|
||||
*((u32 *) (tx_ring->buf + j)) = 0xffffffff;
|
||||
+#ifdef DEV_NETMAP
|
||||
+ mlx4_netmap_tx_config(priv, i);
|
||||
+#endif /* DEV_NETMAP */
|
||||
++tx_index;
|
||||
}
|
||||
|
||||
@@ -1639,6 +1675,9 @@ int mlx4_en_init_netdev(struct mlx4_en_d
|
||||
en_warn(priv, "Using %d RX rings\n", prof->rx_ring_num);
|
||||
|
||||
queue_delayed_work(mdev->workqueue, &priv->stats_task, STATS_DELAY);
|
||||
+#ifdef DEV_NETMAP
|
||||
+ mlx4_netmap_attach(priv);
|
||||
+#endif /* DEV_NETMAP */
|
||||
return 0;
|
||||
|
||||
out:
|
||||
--- drivers/net/ethernet/mellanox/mlx4/en_rx.c 2012-09-11 20:50:55.982624673 -0700
|
||||
+++ ./mlx4/en_rx.c 2012-09-27 00:13:16.099550954 -0700
|
||||
@@ -41,6 +41,9 @@
|
||||
|
||||
#include "mlx4_en.h"
|
||||
|
||||
+#if defined(CONFIG_NETMAP) || defined(CONFIG_NETMAP_MODULE)
|
||||
+#include <mlx4_netmap_linux.h>
|
||||
+#endif /* !DEV_NETMAP */
|
||||
|
||||
static int mlx4_en_alloc_frag(struct mlx4_en_priv *priv,
|
||||
struct mlx4_en_rx_desc *rx_desc,
|
||||
@@ -365,9 +368,16 @@ int mlx4_en_activate_rx_rings(struct mlx
|
||||
ring = &priv->rx_ring[ring_ind];
|
||||
|
||||
ring->size_mask = ring->actual_size - 1;
|
||||
+#ifdef DEV_NETMAP
|
||||
+ if (priv->dev->if_capenable & IFCAP_NETMAP) {
|
||||
+ int saved_cons = ring->cons;
|
||||
+ mlx4_en_free_rx_buf(priv, ring);
|
||||
+ ring->cons = saved_cons;
|
||||
+ mlx4_netmap_rx_config(priv, ring_ind);
|
||||
+ }
|
||||
+#endif /* DEV_NETMAP */
|
||||
mlx4_en_update_rx_prod_db(ring);
|
||||
}
|
||||
-
|
||||
return 0;
|
||||
|
||||
err_buffers:
|
||||
@@ -402,6 +412,11 @@ void mlx4_en_destroy_rx_ring(struct mlx4
|
||||
void mlx4_en_deactivate_rx_ring(struct mlx4_en_priv *priv,
|
||||
struct mlx4_en_rx_ring *ring)
|
||||
{
|
||||
+#ifdef DEV_NETMAP
|
||||
+ if (priv->dev->if_capenable & IFCAP_NETMAP)
|
||||
+ ND("netmap mode, rx buf already freed");
|
||||
+ else
|
||||
+#endif /* DEV_NETMAP */
|
||||
mlx4_en_free_rx_buf(priv, ring);
|
||||
if (ring->stride <= TXBB_SIZE)
|
||||
ring->buf -= TXBB_SIZE;
|
||||
@@ -692,6 +707,12 @@ out:
|
||||
wmb(); /* ensure HW sees CQ consumer before we post new buffers */
|
||||
ring->cons = mcq->cons_index;
|
||||
ring->prod += polled; /* Polled descriptors were realocated in place */
|
||||
+
|
||||
+ ND(5, "set_ci %d 0x%p val %d prod_db 0x%p val %d",
|
||||
+ cq->ring,
|
||||
+ mcq->set_ci_db, mcq->cons_index & 0xffffff,
|
||||
+ ring->wqres.db.db, ring->prod & 0xffff);
|
||||
+
|
||||
mlx4_en_update_rx_prod_db(ring);
|
||||
ring->csum_ok += csum_ok;
|
||||
ring->csum_none += csum_none;
|
||||
@@ -718,6 +739,13 @@ int mlx4_en_poll_rx_cq(struct napi_struc
|
||||
struct mlx4_en_priv *priv = netdev_priv(dev);
|
||||
int done;
|
||||
|
||||
+#ifdef DEV_NETMAP
|
||||
+ static int cnt = 0;
|
||||
+ ND(5,"XXXXXX-------XXXXXXXXXXX-------- poll-rx-cq %d count %d", (int)cq->ring, cnt++);
|
||||
+ if (netmap_rx_irq(cq->dev, cq->ring, &done)) {
|
||||
+ ND("rx_irq %d for netmap, budget %d done %d", cq->ring, budget, done);
|
||||
+ } else
|
||||
+#endif /* DEV_NETMAP */
|
||||
done = mlx4_en_process_rx_cq(dev, cq, budget);
|
||||
|
||||
/* If we used up all the quota - we're probably not done yet... */
|
||||
--- drivers/net/ethernet/mellanox/mlx4/en_tx.c 2012-09-11 20:50:55.982624673 -0700
|
||||
+++ ./mlx4/en_tx.c 2012-09-27 00:05:22.713523348 -0700
|
||||
@@ -55,6 +55,10 @@ MODULE_PARM_DESC(inline_thold, "threshol
|
||||
|
||||
static u32 hashrnd __read_mostly;
|
||||
|
||||
+#if defined(CONFIG_NETMAP) || defined(CONFIG_NETMAP_MODULE)
|
||||
+#include <mlx4_netmap_linux.h> /* extern stuff */
|
||||
+#endif /* CONFIG_NETMAP */
|
||||
+
|
||||
int mlx4_en_create_tx_ring(struct mlx4_en_priv *priv,
|
||||
struct mlx4_en_tx_ring *ring, u32 size,
|
||||
u16 stride)
|
||||
@@ -396,6 +400,17 @@ void mlx4_en_tx_irq(struct mlx4_cq *mcq)
|
||||
|
||||
if (!spin_trylock(&ring->comp_lock))
|
||||
return;
|
||||
+#ifdef DEV_NETMAP // XXX unlock and return should be in the 'if' branch
|
||||
+ static int cnt = 0;
|
||||
+ ND(5,"XXXXXX-------XXXXXXXXXXX-------- tx-irq %d count %d", (int)cq->ring, cnt++);
|
||||
+ if (netmap_tx_irq(cq->dev, cq->ring)) {
|
||||
+ ND(5, "wakeup queue %d", cq->ring);
|
||||
+ } else {
|
||||
+ RD(5, "XXXXXXXXX tx_irq %d unexpected, ignoring", cq->ring);
|
||||
+ }
|
||||
+ spin_unlock(&ring->comp_lock);
|
||||
+ return;
|
||||
+#endif /* DEV_NETMAP */
|
||||
mlx4_en_process_tx_cq(cq->dev, cq);
|
||||
mod_timer(&cq->timer, jiffies + 1);
|
||||
spin_unlock(&ring->comp_lock);
|
Reference in New Issue
Block a user