All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH net-next 0/4] ibmvnic: Improve ethtool functionality
@ 2017-08-02 21:42 John Allen
  2017-08-02 21:44 ` [PATCH net-next 1/4] ibmvnic: Implement per-queue statistics reporting John Allen
                   ` (4 more replies)
  0 siblings, 5 replies; 7+ messages in thread
From: John Allen @ 2017-08-02 21:42 UTC (permalink / raw)
  To: netdev; +Cc: Thomas Falcon, Nathan Fontenot

This patch series improves ibmvnic ethtool functionality by adding support
for ethtool -l and -g options, correcting existing statistics reporting,
and augmenting the existing statistics with counters for each tx and rx
queue.

John Allen (4):
  ibmvnic: Implement per-queue statistics reporting
  ibmvnic: Convert vnic server reported statistics to cpu endian
  ibmvnic: Implement .get_ringparam
  ibmvnic: Implement .get_channels

 drivers/net/ethernet/ibm/ibmvnic.c | 115 ++++++++++++++++++++++++++++++++++---
 drivers/net/ethernet/ibm/ibmvnic.h |  17 ++++++
 2 files changed, 125 insertions(+), 7 deletions(-)

-- 
2.12.3

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH net-next 1/4] ibmvnic: Implement per-queue statistics reporting
  2017-08-02 21:42 [PATCH net-next 0/4] ibmvnic: Improve ethtool functionality John Allen
@ 2017-08-02 21:44 ` John Allen
  2017-08-02 21:45 ` [PATCH net-next 2/4] ibmvnic: Convert vnic server reported statistics to cpu endian John Allen
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 7+ messages in thread
From: John Allen @ 2017-08-02 21:44 UTC (permalink / raw)
  To: netdev; +Cc: Thomas Falcon, Nathan Fontenot

Add counters to report number of packets, bytes, and dropped packets for
each transmit queue and number of packets, bytes, and interrupts for each
receive queue. Modify ethtool callbacks to report the new statistics.

Signed-off-by: John Allen <jallen@linux.vnet.ibm.com>
---
diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
index a3e694679635..a264c6992328 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.c
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
@@ -346,6 +346,31 @@ static void replenish_pools(struct ibmvnic_adapter *adapter)
 	}
 }

+static void release_stats_buffers(struct ibmvnic_adapter *adapter)
+{
+	kfree(adapter->tx_stats_buffers);
+	kfree(adapter->rx_stats_buffers);
+}
+
+static int init_stats_buffers(struct ibmvnic_adapter *adapter)
+{
+	adapter->tx_stats_buffers =
+				kcalloc(adapter->req_tx_queues,
+					sizeof(struct ibmvnic_tx_queue_stats),
+					GFP_KERNEL);
+	if (!adapter->tx_stats_buffers)
+		return -ENOMEM;
+
+	adapter->rx_stats_buffers =
+				kcalloc(adapter->req_rx_queues,
+					sizeof(struct ibmvnic_rx_queue_stats),
+					GFP_KERNEL);
+	if (!adapter->rx_stats_buffers)
+		return -ENOMEM;
+
+	return 0;
+}
+
 static void release_stats_token(struct ibmvnic_adapter *adapter)
 {
 	struct device *dev = &adapter->vdev->dev;
@@ -686,6 +711,7 @@ static void release_resources(struct ibmvnic_adapter *adapter)
 	release_rx_pools(adapter);

 	release_stats_token(adapter);
+	release_stats_buffers(adapter);
 	release_error_buffers(adapter);

 	if (adapter->napi) {
@@ -763,6 +789,10 @@ static int init_resources(struct ibmvnic_adapter *adapter)
 	if (rc)
 		return rc;

+	rc = init_stats_buffers(adapter);
+	if (rc)
+		return rc;
+
 	rc = init_stats_token(adapter);
 	if (rc)
 		return rc;
@@ -1245,6 +1275,9 @@ static int ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
 	netdev->stats.tx_packets += tx_packets;
 	adapter->tx_send_failed += tx_send_failed;
 	adapter->tx_map_failed += tx_map_failed;
+	adapter->tx_stats_buffers[queue_num].packets += tx_packets;
+	adapter->tx_stats_buffers[queue_num].bytes += tx_bytes;
+	adapter->tx_stats_buffers[queue_num].dropped_packets += tx_dropped;

 	return ret;
 }
@@ -1585,6 +1618,8 @@ static int ibmvnic_poll(struct napi_struct *napi, int budget)
 		napi_gro_receive(napi, skb); /* send it up */
 		netdev->stats.rx_packets++;
 		netdev->stats.rx_bytes += length;
+		adapter->rx_stats_buffers[scrq_num].packets++;
+		adapter->rx_stats_buffers[scrq_num].bytes += length;
 		frames_processed++;
 	}

@@ -1706,6 +1741,7 @@ static void ibmvnic_get_ringparam(struct net_device *netdev,

 static void ibmvnic_get_strings(struct net_device *dev, u32 stringset, u8 *data)
 {
+	struct ibmvnic_adapter *adapter = netdev_priv(dev);
 	int i;

 	if (stringset != ETH_SS_STATS)
@@ -1713,13 +1749,39 @@ static void ibmvnic_get_strings(struct net_device *dev, u32 stringset, u8 *data)

 	for (i = 0; i < ARRAY_SIZE(ibmvnic_stats); i++, data += ETH_GSTRING_LEN)
 		memcpy(data, ibmvnic_stats[i].name, ETH_GSTRING_LEN);
+
+	for (i = 0; i < adapter->req_tx_queues; i++) {
+		snprintf(data, ETH_GSTRING_LEN, "tx%d_packets", i);
+		data += ETH_GSTRING_LEN;
+
+		snprintf(data, ETH_GSTRING_LEN, "tx%d_bytes", i);
+		data += ETH_GSTRING_LEN;
+
+		snprintf(data, ETH_GSTRING_LEN, "tx%d_dropped_packets", i);
+		data += ETH_GSTRING_LEN;
+	}
+
+	for (i = 0; i < adapter->req_rx_queues; i++) {
+		snprintf(data, ETH_GSTRING_LEN, "rx%d_packets", i);
+		data += ETH_GSTRING_LEN;
+
+		snprintf(data, ETH_GSTRING_LEN, "rx%d_bytes", i);
+		data += ETH_GSTRING_LEN;
+
+		snprintf(data, ETH_GSTRING_LEN, "rx%d_interrupts", i);
+		data += ETH_GSTRING_LEN;
+	}
 }

 static int ibmvnic_get_sset_count(struct net_device *dev, int sset)
 {
+	struct ibmvnic_adapter *adapter = netdev_priv(dev);
+
 	switch (sset) {
 	case ETH_SS_STATS:
-		return ARRAY_SIZE(ibmvnic_stats);
+		return ARRAY_SIZE(ibmvnic_stats) +
+		       adapter->req_tx_queues * NUM_TX_STATS +
+		       adapter->req_rx_queues * NUM_RX_STATS;
 	default:
 		return -EOPNOTSUPP;
 	}
@@ -1730,7 +1792,7 @@ static void ibmvnic_get_ethtool_stats(struct net_device *dev,
 {
 	struct ibmvnic_adapter *adapter = netdev_priv(dev);
 	union ibmvnic_crq crq;
-	int i;
+	int i, j;

 	memset(&crq, 0, sizeof(crq));
 	crq.request_statistics.first = IBMVNIC_CRQ_CMD;
@@ -1746,6 +1808,24 @@ static void ibmvnic_get_ethtool_stats(struct net_device *dev,

 	for (i = 0; i < ARRAY_SIZE(ibmvnic_stats); i++)
 		data[i] = IBMVNIC_GET_STAT(adapter, ibmvnic_stats[i].offset);
+
+	for (j = 0; j < adapter->req_tx_queues; j++) {
+		data[i] = adapter->tx_stats_buffers[j].packets;
+		i++;
+		data[i] = adapter->tx_stats_buffers[j].bytes;
+		i++;
+		data[i] = adapter->tx_stats_buffers[j].dropped_packets;
+		i++;
+	}
+
+	for (j = 0; j < adapter->req_rx_queues; j++) {
+		data[i] = adapter->rx_stats_buffers[j].packets;
+		i++;
+		data[i] = adapter->rx_stats_buffers[j].bytes;
+		i++;
+		data[i] = adapter->rx_stats_buffers[j].interrupts;
+		i++;
+	}
 }

 static const struct ethtool_ops ibmvnic_ethtool_ops = {
@@ -2050,6 +2130,8 @@ static irqreturn_t ibmvnic_interrupt_rx(int irq, void *instance)
 	struct ibmvnic_sub_crq_queue *scrq = instance;
 	struct ibmvnic_adapter *adapter = scrq->adapter;

+	adapter->rx_stats_buffers[scrq->scrq_num].interrupts++;
+
 	if (napi_schedule_prep(&adapter->napi[scrq->scrq_num])) {
 		disable_scrq_irq(adapter, scrq);
 		__napi_schedule(&adapter->napi[scrq->scrq_num]);
diff --git a/drivers/net/ethernet/ibm/ibmvnic.h b/drivers/net/ethernet/ibm/ibmvnic.h
index 8eff6e15f4bb..d02257ccc377 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.h
+++ b/drivers/net/ethernet/ibm/ibmvnic.h
@@ -166,6 +166,20 @@ struct ibmvnic_statistics {
 	u8 reserved[72];
 } __packed __aligned(8);

+#define NUM_TX_STATS 3
+struct ibmvnic_tx_queue_stats {
+	u64 packets;
+	u64 bytes;
+	u64 dropped_packets;
+};
+
+#define NUM_RX_STATS 3
+struct ibmvnic_rx_queue_stats {
+	u64 packets;
+	u64 bytes;
+	u64 interrupts;
+};
+
 struct ibmvnic_acl_buffer {
 	__be32 len;
 	__be32 version;
@@ -956,6 +970,9 @@ struct ibmvnic_adapter {
 	int tx_send_failed;
 	int tx_map_failed;

+	struct ibmvnic_tx_queue_stats *tx_stats_buffers;
+	struct ibmvnic_rx_queue_stats *rx_stats_buffers;
+
 	int phys_link_state;
 	int logical_link_state;

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH net-next 2/4] ibmvnic: Convert vnic server reported statistics to cpu endian
  2017-08-02 21:42 [PATCH net-next 0/4] ibmvnic: Improve ethtool functionality John Allen
  2017-08-02 21:44 ` [PATCH net-next 1/4] ibmvnic: Implement per-queue statistics reporting John Allen
@ 2017-08-02 21:45 ` John Allen
  2017-08-02 21:46 ` [PATCH net-next 3/4] ibmvnic: Implement .get_ringparam John Allen
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 7+ messages in thread
From: John Allen @ 2017-08-02 21:45 UTC (permalink / raw)
  To: netdev; +Cc: Thomas Falcon, Nathan Fontenot

The vnic server reports the statistics buffer in big endian format and must
be converted to cpu endian in order to be displayed correctly on little
endian lpars.

Signed-off-by: John Allen <jallen@linux.vnet.ibm.com>
---
diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
index a264c6992328..285ea23bac6a 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.c
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
@@ -1807,7 +1807,8 @@ static void ibmvnic_get_ethtool_stats(struct net_device *dev,
 	wait_for_completion(&adapter->stats_done);

 	for (i = 0; i < ARRAY_SIZE(ibmvnic_stats); i++)
-		data[i] = IBMVNIC_GET_STAT(adapter, ibmvnic_stats[i].offset);
+		data[i] = be64_to_cpu(IBMVNIC_GET_STAT(adapter,
+						ibmvnic_stats[i].offset));

 	for (j = 0; j < adapter->req_tx_queues; j++) {
 		data[i] = adapter->tx_stats_buffers[j].packets;

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH net-next 3/4] ibmvnic: Implement .get_ringparam
  2017-08-02 21:42 [PATCH net-next 0/4] ibmvnic: Improve ethtool functionality John Allen
  2017-08-02 21:44 ` [PATCH net-next 1/4] ibmvnic: Implement per-queue statistics reporting John Allen
  2017-08-02 21:45 ` [PATCH net-next 2/4] ibmvnic: Convert vnic server reported statistics to cpu endian John Allen
@ 2017-08-02 21:46 ` John Allen
  2017-08-02 21:47 ` [PATCH net-next 4/4] ibmvnic: Implement .get_channels John Allen
  2017-08-03 16:33 ` [PATCH net-next 0/4] ibmvnic: Improve ethtool functionality David Miller
  4 siblings, 0 replies; 7+ messages in thread
From: John Allen @ 2017-08-02 21:46 UTC (permalink / raw)
  To: netdev; +Cc: Thomas Falcon, Nathan Fontenot

Implement .get_ringparam (ethtool -g) functionality

Signed-off-by: John Allen <jallen@linux.vnet.ibm.com>
---
diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
index 285ea23bac6a..1cc5db94e40f 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.c
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
@@ -1729,12 +1729,14 @@ static u32 ibmvnic_get_link(struct net_device *netdev)
 static void ibmvnic_get_ringparam(struct net_device *netdev,
 				  struct ethtool_ringparam *ring)
 {
-	ring->rx_max_pending = 0;
-	ring->tx_max_pending = 0;
+	struct ibmvnic_adapter *adapter = netdev_priv(netdev);
+
+	ring->rx_max_pending = adapter->max_rx_add_entries_per_subcrq;
+	ring->tx_max_pending = adapter->max_tx_entries_per_subcrq;
 	ring->rx_mini_max_pending = 0;
 	ring->rx_jumbo_max_pending = 0;
-	ring->rx_pending = 0;
-	ring->tx_pending = 0;
+	ring->rx_pending = adapter->req_rx_add_entries_per_subcrq;
+	ring->tx_pending = adapter->req_tx_entries_per_subcrq;
 	ring->rx_mini_pending = 0;
 	ring->rx_jumbo_pending = 0;
 }

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH net-next 4/4] ibmvnic: Implement .get_channels
  2017-08-02 21:42 [PATCH net-next 0/4] ibmvnic: Improve ethtool functionality John Allen
                   ` (2 preceding siblings ...)
  2017-08-02 21:46 ` [PATCH net-next 3/4] ibmvnic: Implement .get_ringparam John Allen
@ 2017-08-02 21:47 ` John Allen
  2017-08-03  3:07   ` Stephen Hemminger
  2017-08-03 16:33 ` [PATCH net-next 0/4] ibmvnic: Improve ethtool functionality David Miller
  4 siblings, 1 reply; 7+ messages in thread
From: John Allen @ 2017-08-02 21:47 UTC (permalink / raw)
  To: netdev; +Cc: Thomas Falcon, Nathan Fontenot

Implement .get_channels (ethtool -l) functionality

Signed-off-by: John Allen <jallen@linux.vnet.ibm.com>
---
diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
index 1cc5db94e40f..130aee7b5c32 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.c
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
@@ -1741,6 +1741,21 @@ static void ibmvnic_get_ringparam(struct net_device *netdev,
 	ring->rx_jumbo_pending = 0;
 }

+static void ibmvnic_get_channels(struct net_device *netdev,
+				 struct ethtool_channels *channels)
+{
+	struct ibmvnic_adapter *adapter = netdev_priv(netdev);
+
+	channels->max_rx = adapter->max_rx_queues;
+	channels->max_tx = adapter->max_tx_queues;
+	channels->max_other = 0;
+	channels->max_combined = 0;
+	channels->rx_count = adapter->req_rx_queues;
+	channels->tx_count = adapter->req_tx_queues;
+	channels->other_count = 0;
+	channels->combined_count = 0;
+}
+
 static void ibmvnic_get_strings(struct net_device *dev, u32 stringset, u8 *data)
 {
 	struct ibmvnic_adapter *adapter = netdev_priv(dev);
@@ -1837,6 +1852,7 @@ static const struct ethtool_ops ibmvnic_ethtool_ops = {
 	.set_msglevel		= ibmvnic_set_msglevel,
 	.get_link		= ibmvnic_get_link,
 	.get_ringparam		= ibmvnic_get_ringparam,
+	.get_channels		= ibmvnic_get_channels,
 	.get_strings            = ibmvnic_get_strings,
 	.get_sset_count         = ibmvnic_get_sset_count,
 	.get_ethtool_stats	= ibmvnic_get_ethtool_stats,

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH net-next 4/4] ibmvnic: Implement .get_channels
  2017-08-02 21:47 ` [PATCH net-next 4/4] ibmvnic: Implement .get_channels John Allen
@ 2017-08-03  3:07   ` Stephen Hemminger
  0 siblings, 0 replies; 7+ messages in thread
From: Stephen Hemminger @ 2017-08-03  3:07 UTC (permalink / raw)
  To: John Allen; +Cc: netdev, Thomas Falcon, Nathan Fontenot

On Wed, 2 Aug 2017 16:47:17 -0500
John Allen <jallen@linux.vnet.ibm.com> wrote:

> +static void ibmvnic_get_channels(struct net_device *netdev,
> +				 struct ethtool_channels *channels)
> +{
> +	struct ibmvnic_adapter *adapter = netdev_priv(netdev);
> +
> +	channels->max_rx = adapter->max_rx_queues;
> +	channels->max_tx = adapter->max_tx_queues;
> +	channels->max_other = 0;
> +	channels->max_combined = 0;
> +	channels->rx_count = adapter->req_rx_queues;
> +	channels->tx_count = adapter->req_tx_queues;
> +	channels->other_count = 0;
> +	channels->combined_count = 0;
> +}

Minor nit, since the structure is already initialized to zero by caller,
you don't need to fill in the values that are zero.

static noinline_for_stack int ethtool_get_channels(struct net_device *dev,
						   void __user *useraddr)
{
	struct ethtool_channels channels = { .cmd = ETHTOOL_GCHANNELS };  << all unspecifed fields are zero'd

	if (!dev->ethtool_ops->get_channels)
		return -EOPNOTSUPP;

	dev->ethtool_ops->get_channels(dev, &channels);

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH net-next 0/4] ibmvnic: Improve ethtool functionality
  2017-08-02 21:42 [PATCH net-next 0/4] ibmvnic: Improve ethtool functionality John Allen
                   ` (3 preceding siblings ...)
  2017-08-02 21:47 ` [PATCH net-next 4/4] ibmvnic: Implement .get_channels John Allen
@ 2017-08-03 16:33 ` David Miller
  4 siblings, 0 replies; 7+ messages in thread
From: David Miller @ 2017-08-03 16:33 UTC (permalink / raw)
  To: jallen; +Cc: netdev, tlfalcon, nfont

From: John Allen <jallen@linux.vnet.ibm.com>
Date: Wed, 2 Aug 2017 16:42:49 -0500

> This patch series improves ibmvnic ethtool functionality by adding support
> for ethtool -l and -g options, correcting existing statistics reporting,
> and augmenting the existing statistics with counters for each tx and rx
> queue.

Series applied, thanks.

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2017-08-03 16:33 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-08-02 21:42 [PATCH net-next 0/4] ibmvnic: Improve ethtool functionality John Allen
2017-08-02 21:44 ` [PATCH net-next 1/4] ibmvnic: Implement per-queue statistics reporting John Allen
2017-08-02 21:45 ` [PATCH net-next 2/4] ibmvnic: Convert vnic server reported statistics to cpu endian John Allen
2017-08-02 21:46 ` [PATCH net-next 3/4] ibmvnic: Implement .get_ringparam John Allen
2017-08-02 21:47 ` [PATCH net-next 4/4] ibmvnic: Implement .get_channels John Allen
2017-08-03  3:07   ` Stephen Hemminger
2017-08-03 16:33 ` [PATCH net-next 0/4] ibmvnic: Improve ethtool functionality David Miller

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.