[ofa-general] [PATCH 9/10] IB/ipoib: Support modifying IPOIB CQ moderation params

Eli Cohen eli at dev.mellanox.co.il
Mon Mar 17 08:28:09 PDT 2008


>From cdece401306cc86c5eb581b4ebc1c4efe05e1b48 Mon Sep 17 00:00:00 2001
From: Eli Cohen <eli at mellanox.co.il>
Date: Mon, 17 Mar 2008 16:01:33 +0200
Subject: [PATCH] IB/ipoib: Support modifying IPOIB CQ moderation params

This can be used to tune at run time the paramters controlling
the event (interrupt) generation rate and thus reduce the overhead
incurred by handling interrupts resulting in better throughput.
Since IPOIB uses a single CQ for both rx and tx, rx is chosen to
dictate configuration for both rx and tx.

Signed-off-by: Eli Cohen <eli at mellanox.co.il>
---
 drivers/infiniband/ulp/ipoib/ipoib.h       |    6 ++++
 drivers/infiniband/ulp/ipoib/ipoib_etool.c |   46 ++++++++++++++++++++++++++++
 2 files changed, 52 insertions(+), 0 deletions(-)

diff --git a/drivers/infiniband/ulp/ipoib/ipoib.h b/drivers/infiniband/ulp/ipoib/ipoib.h
index 3524d65..43feffc 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib.h
+++ b/drivers/infiniband/ulp/ipoib/ipoib.h
@@ -242,6 +242,11 @@ struct ipoib_cm_dev_priv {
 	int			num_frags;
 };
 
+struct ipoib_ethtool_st {
+	u16     coalesce_usecs;
+	u16     max_coalesced_frames;
+};
+
 /*
  * Device private locking: tx_lock protects members used in TX fast
  * path (and we use LLTX so upper layers don't do extra locking).
@@ -320,6 +325,7 @@ struct ipoib_dev_priv {
 	struct dentry *path_dentry;
 #endif
 	int	hca_caps;
+	struct ipoib_ethtool_st etool;
 };
 
 struct ipoib_ah {
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_etool.c b/drivers/infiniband/ulp/ipoib/ipoib_etool.c
index 913aea0..a3ac4cf 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_etool.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_etool.c
@@ -44,9 +44,55 @@ static void ipoib_get_drvinfo(struct net_device *netdev,
 	strncpy(drvinfo->driver, "ipoib", sizeof(drvinfo->driver) - 1);
 }
 
+static int ipoib_get_coalesce(struct net_device *dev,
+			      struct ethtool_coalesce *coal)
+{
+	struct ipoib_dev_priv *priv = netdev_priv(dev);
+
+	coal->rx_coalesce_usecs = priv->etool.coalesce_usecs;
+	coal->tx_coalesce_usecs = priv->etool.coalesce_usecs;
+	coal->rx_max_coalesced_frames = priv->etool.max_coalesced_frames;
+	coal->tx_max_coalesced_frames = priv->etool.max_coalesced_frames;
+
+	return 0;
+}
+
+static int ipoib_set_coalesce(struct net_device *dev,
+                             struct ethtool_coalesce *coal)
+{
+	struct ipoib_dev_priv *priv = netdev_priv(dev);
+	int ret;
+
+	/*
+	 * since ipoib uses a single CQ for both rx and tx,
+	 * we assume that rx params dictate the configuration.
+	 * These values are saved in the private data and returned
+	 * when ipoib_get_coalesce is called
+	 */
+	if (coal->rx_coalesce_usecs > 0xffff            ||
+	    coal->rx_max_coalesced_frames > 0xffff)
+		return -EINVAL;
+
+	ret = ib_modify_cq(priv->cq, coal->rx_max_coalesced_frames,
+			   coal->rx_coalesce_usecs);
+	if (ret) {
+		ipoib_dbg(priv, "failed modifying CQ\n");
+		return ret;
+	}
+
+	coal->tx_coalesce_usecs = coal->rx_coalesce_usecs;
+	priv->etool.coalesce_usecs = coal->rx_coalesce_usecs;
+	coal->tx_max_coalesced_frames = coal->rx_max_coalesced_frames;
+	priv->etool.max_coalesced_frames = coal->rx_max_coalesced_frames;
+
+	return 0;
+}
+
 static const struct ethtool_ops ipoib_ethtool_ops = {
 	.get_drvinfo            = ipoib_get_drvinfo,
 	.get_tso		= ethtool_op_get_tso,
+	.get_coalesce           = ipoib_get_coalesce,
+	.set_coalesce           = ipoib_set_coalesce,
 };
 
 void ipoib_set_ethtool_ops(struct net_device *dev)
-- 
1.5.4.4






More information about the general mailing list