All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/3] ethdev: extract xstat basic stat count calculation
@ 2017-10-20  0:03 Ferruh Yigit
  2017-10-20  0:03 ` [PATCH 2/3] ethdev: fix xstats get by id APIS Ferruh Yigit
                   ` (2 more replies)
  0 siblings, 3 replies; 14+ messages in thread
From: Ferruh Yigit @ 2017-10-20  0:03 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev, Ferruh Yigit

Extract into static inline function so that can be used by other
functions.

Signed-off-by: Ferruh Yigit <ferruh.yigit@intel.com>
---
 lib/librte_ether/rte_ethdev.c | 24 +++++++++++++++++++-----
 1 file changed, 19 insertions(+), 5 deletions(-)

diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index 0b1e92894..798855e15 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -1550,6 +1550,22 @@ rte_eth_stats_reset(uint16_t port_id)
 	return 0;
 }
 
+static inline int
+get_xstats_basic_count(struct rte_eth_dev *dev)
+{
+	uint16_t nb_rxqs, nb_txqs;
+	int count;
+
+	nb_rxqs = RTE_MIN(dev->data->nb_rx_queues, RTE_ETHDEV_QUEUE_STAT_CNTRS);
+	nb_txqs = RTE_MIN(dev->data->nb_tx_queues, RTE_ETHDEV_QUEUE_STAT_CNTRS);
+
+	count = RTE_NB_STATS;
+	count += nb_rxqs * RTE_NB_RXQ_STATS;
+	count += nb_txqs * RTE_NB_TXQ_STATS;
+
+	return count;
+}
+
 static int
 get_xstats_count(uint16_t port_id)
 {
@@ -1571,11 +1587,9 @@ get_xstats_count(uint16_t port_id)
 	} else
 		count = 0;
 
-	count += RTE_NB_STATS;
-	count += RTE_MIN(dev->data->nb_rx_queues, RTE_ETHDEV_QUEUE_STAT_CNTRS) *
-		 RTE_NB_RXQ_STATS;
-	count += RTE_MIN(dev->data->nb_tx_queues, RTE_ETHDEV_QUEUE_STAT_CNTRS) *
-		 RTE_NB_TXQ_STATS;
+
+	count += get_xstats_basic_count(dev);
+
 	return count;
 }
 
-- 
2.13.6

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

* [PATCH 2/3] ethdev: fix xstats get by id APIS
  2017-10-20  0:03 [PATCH 1/3] ethdev: extract xstat basic stat count calculation Ferruh Yigit
@ 2017-10-20  0:03 ` Ferruh Yigit
  2017-10-20 12:33   ` Ivan Malov
  2017-10-23 22:20   ` Thomas Monjalon
  2017-10-20  0:03 ` [PATCH 3/3] ethdev: fix negative return values in xstats Ferruh Yigit
  2017-10-23 23:12 ` [PATCH 1/3] ethdev: extract xstat basic stat count calculation Ferruh Yigit
  2 siblings, 2 replies; 14+ messages in thread
From: Ferruh Yigit @ 2017-10-20  0:03 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev, Ferruh Yigit, Ivan Malov, Harry Van Haaren, Lee Daly

ethdev xstat get by id APIs:
rte_eth_xstats_get_names_by_id()
rte_eth_xstats_get_by_id()

Works on ids calculated as "basic stats + device specific stats"

When an application asking for id less than "basic stats count", it is
indeed asking basic stats nothing specific to device stats.

The dev_ops PMDs implements xstats_get_names_by_id and xstats_get_by_id
works on device specific ids.

This patch adds a check if all stats requested by ids can be provided
via device and if so converts ids to device specific ones.

This conversion wasn't required before commit 8c49d5f1c219, because
_by_id dev_ops were always used to get whole stats instead of specific
ids.

Fixes: 8c49d5f1c219 ("ethdev: rework xstats retrieve by id")

Signed-off-by: Ferruh Yigit <ferruh.yigit@intel.com>
---
Cc: Ivan Malov <Ivan.Malov@oktetlabs.ru>
Cc: Harry Van Haaren <harry.van.haaren@intel.com>
Cc: Lee Daly <lee.daly@intel.com>
---
 lib/librte_ether/rte_ethdev.c | 42 ++++++++++++++++++++++++++++++++++++------
 1 file changed, 36 insertions(+), 6 deletions(-)

diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index 798855e15..4ed2f6d5f 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -1644,6 +1644,7 @@ rte_eth_xstats_get_names_by_id(uint16_t port_id,
 	uint64_t *ids)
 {
 	struct rte_eth_xstat_name *xstats_names_copy;
+	unsigned int all_ids_from_pmd = 1;
 	unsigned int expected_entries;
 	struct rte_eth_dev *dev;
 	unsigned int i;
@@ -1663,9 +1664,23 @@ rte_eth_xstats_get_names_by_id(uint16_t port_id,
 	if (ids && !xstats_names)
 		return -EINVAL;
 
-	if (dev->dev_ops->xstats_get_names_by_id != NULL)
-		return (*dev->dev_ops->xstats_get_names_by_id)(
-				dev, xstats_names, ids, size);
+	if (ids && dev->dev_ops->xstats_get_names_by_id != NULL && size > 0) {
+		unsigned int basic_count = get_xstats_basic_count(dev);
+		uint64_t ids_copy[size];
+
+		for (i = 0; i < size; i++) {
+			if (ids[i] < basic_count) {
+				all_ids_from_pmd = 0;
+				break;
+			}
+
+			ids_copy[i] = ids[i] - basic_count;
+		}
+
+		if (all_ids_from_pmd)
+			return (*dev->dev_ops->xstats_get_names_by_id)(dev,
+					xstats_names, ids_copy, size);
+	}
 
 	/* Retrieve all stats */
 	if (!ids) {
@@ -1772,6 +1787,7 @@ int
 rte_eth_xstats_get_by_id(uint16_t port_id, const uint64_t *ids,
 			 uint64_t *values, unsigned int size)
 {
+	unsigned int all_ids_from_pmd = 1;
 	unsigned int num_xstats_filled;
 	uint16_t expected_entries;
 	struct rte_eth_dev *dev;
@@ -1793,9 +1809,23 @@ rte_eth_xstats_get_by_id(uint16_t port_id, const uint64_t *ids,
 	if (ids && !values)
 		return -EINVAL;
 
-	if (dev->dev_ops->xstats_get_by_id != NULL)
-		return (*dev->dev_ops->xstats_get_by_id)(dev, ids, values,
-			size);
+	if (ids && dev->dev_ops->xstats_get_by_id != NULL && size) {
+		unsigned int basic_count = get_xstats_basic_count(dev);
+		uint64_t ids_copy[size];
+
+		for (i = 0; i < size; i++) {
+			if (ids[i] < basic_count) {
+				all_ids_from_pmd = 0;
+				break;
+			}
+
+			ids_copy[i] = ids[i] - basic_count;
+		}
+
+		if (all_ids_from_pmd)
+			return (*dev->dev_ops->xstats_get_by_id)(dev, ids_copy,
+					values, size);
+	}
 
 	/* Fill the xstats structure */
 	num_xstats_filled = rte_eth_xstats_get(port_id, xstats,
-- 
2.13.6

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

* [PATCH 3/3] ethdev: fix negative return values in xstats
  2017-10-20  0:03 [PATCH 1/3] ethdev: extract xstat basic stat count calculation Ferruh Yigit
  2017-10-20  0:03 ` [PATCH 2/3] ethdev: fix xstats get by id APIS Ferruh Yigit
@ 2017-10-20  0:03 ` Ferruh Yigit
  2017-10-23 22:26   ` Thomas Monjalon
  2017-10-23 23:12 ` [PATCH 1/3] ethdev: extract xstat basic stat count calculation Ferruh Yigit
  2 siblings, 1 reply; 14+ messages in thread
From: Ferruh Yigit @ 2017-10-20  0:03 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev, Ferruh Yigit, Lee Daly

Some function calls in xstat functions can return negative values
to indicate the error, check return values for those cases.

Coverity issue: 195028, 195026
Fixes: 8c49d5f1c219 ("ethdev: rework xstats retrieve by id")

Signed-off-by: Ferruh Yigit <ferruh.yigit@intel.com>
---
Cc: Lee Daly <lee.daly@intel.com>
---
 lib/librte_ether/rte_ethdev.c | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index 4ed2f6d5f..dc669362a 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -1648,11 +1648,16 @@ rte_eth_xstats_get_names_by_id(uint16_t port_id,
 	unsigned int expected_entries;
 	struct rte_eth_dev *dev;
 	unsigned int i;
+	int ret;
 
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
-	expected_entries = get_xstats_count(port_id);
 	dev = &rte_eth_devices[port_id];
 
+	ret = get_xstats_count(port_id);
+	if (ret < 0)
+		return ret;
+	expected_entries = (unsigned int)ret;
+
 	/* Return max number of stats if no ids given */
 	if (!ids) {
 		if (!xstats_names)
@@ -1792,6 +1797,7 @@ rte_eth_xstats_get_by_id(uint16_t port_id, const uint64_t *ids,
 	uint16_t expected_entries;
 	struct rte_eth_dev *dev;
 	unsigned int i;
+	int ret;
 
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	expected_entries = get_xstats_count(port_id);
@@ -1828,8 +1834,10 @@ rte_eth_xstats_get_by_id(uint16_t port_id, const uint64_t *ids,
 	}
 
 	/* Fill the xstats structure */
-	num_xstats_filled = rte_eth_xstats_get(port_id, xstats,
-		expected_entries);
+	ret = rte_eth_xstats_get(port_id, xstats, expected_entries);
+	if (ret < 0)
+		return ret;
+	num_xstats_filled = (unsigned int)ret;
 
 	/* Return all stats */
 	if (!ids) {
-- 
2.13.6

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

* Re: [PATCH 2/3] ethdev: fix xstats get by id APIS
  2017-10-20  0:03 ` [PATCH 2/3] ethdev: fix xstats get by id APIS Ferruh Yigit
@ 2017-10-20 12:33   ` Ivan Malov
  2017-10-23 22:20   ` Thomas Monjalon
  1 sibling, 0 replies; 14+ messages in thread
From: Ivan Malov @ 2017-10-20 12:33 UTC (permalink / raw)
  To: Ferruh Yigit, dev; +Cc: Thomas Monjalon, Harry Van Haaren, Lee Daly

On Fri, Oct 20, 2017 at 01:03:50AM +0100, Ferruh Yigit wrote:
> ethdev xstat get by id APIs:
> rte_eth_xstats_get_names_by_id()
> rte_eth_xstats_get_by_id()
> 
> Works on ids calculated as "basic stats + device specific stats"
> 
> When an application asking for id less than "basic stats count", it is
> indeed asking basic stats nothing specific to device stats.
> 
> The dev_ops PMDs implements xstats_get_names_by_id and xstats_get_by_id
> works on device specific ids.
> 
> This patch adds a check if all stats requested by ids can be provided
> via device and if so converts ids to device specific ones.
> 
> This conversion wasn't required before commit 8c49d5f1c219, because
> _by_id dev_ops were always used to get whole stats instead of specific
> ids.
> 
> Fixes: 8c49d5f1c219 ("ethdev: rework xstats retrieve by id")
> 
> Signed-off-by: Ferruh Yigit <ferruh.yigit@intel.com>
> ---
> Cc: Ivan Malov <Ivan.Malov@oktetlabs.ru>
> Cc: Harry Van Haaren <harry.van.haaren@intel.com>
> Cc: Lee Daly <lee.daly@intel.com>

The patch looks reasonable.
It solves the problem for me provided that the parts 1/3 and 3/3 are also applied.

Reviewed-by: Ivan Malov <ivan.malov@oktetlabs.ru>
Tested-by: Ivan Malov <ivan.malov@oktetlabs.ru>

-- 
Best regards,
Ivan

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

* Re: [PATCH 2/3] ethdev: fix xstats get by id APIS
  2017-10-20  0:03 ` [PATCH 2/3] ethdev: fix xstats get by id APIS Ferruh Yigit
  2017-10-20 12:33   ` Ivan Malov
@ 2017-10-23 22:20   ` Thomas Monjalon
  1 sibling, 0 replies; 14+ messages in thread
From: Thomas Monjalon @ 2017-10-23 22:20 UTC (permalink / raw)
  To: Ferruh Yigit; +Cc: dev, Ivan Malov, Harry Van Haaren, Lee Daly

20/10/2017 02:03, Ferruh Yigit:
> ethdev xstat get by id APIs:
> rte_eth_xstats_get_names_by_id()
> rte_eth_xstats_get_by_id()
> 
> Works on ids calculated as "basic stats + device specific stats"
> 
> When an application asking for id less than "basic stats count", it is
> indeed asking basic stats nothing specific to device stats.
> 
> The dev_ops PMDs implements xstats_get_names_by_id and xstats_get_by_id
> works on device specific ids.
> 
> This patch adds a check if all stats requested by ids can be provided
> via device and if so converts ids to device specific ones.
> 
> This conversion wasn't required before commit 8c49d5f1c219, because
> _by_id dev_ops were always used to get whole stats instead of specific
> ids.
> 
> Fixes: 8c49d5f1c219 ("ethdev: rework xstats retrieve by id")

It would be easier to understand if starting with a statement of bug.


> --- a/lib/librte_ether/rte_ethdev.c
> +++ b/lib/librte_ether/rte_ethdev.c
> @@ -1644,6 +1644,7 @@ rte_eth_xstats_get_names_by_id(uint16_t port_id,
>  	uint64_t *ids)
>  {
>  	struct rte_eth_xstat_name *xstats_names_copy;
> +	unsigned int all_ids_from_pmd = 1;

This variable would be better renamed as "no_basic_stat_requested".

> +			ids_copy[i] = ids[i] - basic_count;

This line may deserve a comment.

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

* Re: [PATCH 3/3] ethdev: fix negative return values in xstats
  2017-10-20  0:03 ` [PATCH 3/3] ethdev: fix negative return values in xstats Ferruh Yigit
@ 2017-10-23 22:26   ` Thomas Monjalon
  0 siblings, 0 replies; 14+ messages in thread
From: Thomas Monjalon @ 2017-10-23 22:26 UTC (permalink / raw)
  To: Ferruh Yigit; +Cc: dev, Lee Daly

Suggested title:
	check more errors in xstats retrieval

20/10/2017 02:03, Ferruh Yigit:
> Some function calls in xstat functions can return negative values
> to indicate the error, check return values for those cases.
> 
> Coverity issue: 195028, 195026
> Fixes: 8c49d5f1c219 ("ethdev: rework xstats retrieve by id")
> 
> Signed-off-by: Ferruh Yigit <ferruh.yigit@intel.com>

Acked-by: Thomas Monjalon <thomas@monjalon.net>

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

* [PATCH 1/3] ethdev: extract xstat basic stat count calculation
  2017-10-20  0:03 [PATCH 1/3] ethdev: extract xstat basic stat count calculation Ferruh Yigit
  2017-10-20  0:03 ` [PATCH 2/3] ethdev: fix xstats get by id APIS Ferruh Yigit
  2017-10-20  0:03 ` [PATCH 3/3] ethdev: fix negative return values in xstats Ferruh Yigit
@ 2017-10-23 23:12 ` Ferruh Yigit
  2017-10-23 23:12   ` [PATCH 2/3] ethdev: fix xstats get by id APIS Ferruh Yigit
                     ` (2 more replies)
  2 siblings, 3 replies; 14+ messages in thread
From: Ferruh Yigit @ 2017-10-23 23:12 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev, Ferruh Yigit

Extract into static inline function so that can be used by other
functions.

Signed-off-by: Ferruh Yigit <ferruh.yigit@intel.com>
---
 lib/librte_ether/rte_ethdev.c | 24 +++++++++++++++++++-----
 1 file changed, 19 insertions(+), 5 deletions(-)

diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index 0b1e92894..798855e15 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -1550,6 +1550,22 @@ rte_eth_stats_reset(uint16_t port_id)
 	return 0;
 }
 
+static inline int
+get_xstats_basic_count(struct rte_eth_dev *dev)
+{
+	uint16_t nb_rxqs, nb_txqs;
+	int count;
+
+	nb_rxqs = RTE_MIN(dev->data->nb_rx_queues, RTE_ETHDEV_QUEUE_STAT_CNTRS);
+	nb_txqs = RTE_MIN(dev->data->nb_tx_queues, RTE_ETHDEV_QUEUE_STAT_CNTRS);
+
+	count = RTE_NB_STATS;
+	count += nb_rxqs * RTE_NB_RXQ_STATS;
+	count += nb_txqs * RTE_NB_TXQ_STATS;
+
+	return count;
+}
+
 static int
 get_xstats_count(uint16_t port_id)
 {
@@ -1571,11 +1587,9 @@ get_xstats_count(uint16_t port_id)
 	} else
 		count = 0;
 
-	count += RTE_NB_STATS;
-	count += RTE_MIN(dev->data->nb_rx_queues, RTE_ETHDEV_QUEUE_STAT_CNTRS) *
-		 RTE_NB_RXQ_STATS;
-	count += RTE_MIN(dev->data->nb_tx_queues, RTE_ETHDEV_QUEUE_STAT_CNTRS) *
-		 RTE_NB_TXQ_STATS;
+
+	count += get_xstats_basic_count(dev);
+
 	return count;
 }
 
-- 
2.13.6

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

* [PATCH 2/3] ethdev: fix xstats get by id APIS
  2017-10-23 23:12 ` [PATCH 1/3] ethdev: extract xstat basic stat count calculation Ferruh Yigit
@ 2017-10-23 23:12   ` Ferruh Yigit
  2017-10-23 23:12   ` [PATCH 3/3] ethdev: check more errors in xstats retrieval Ferruh Yigit
  2017-10-23 23:15   ` [PATCH v2 1/3] ethdev: extract xstat basic stat count calculation Ferruh Yigit
  2 siblings, 0 replies; 14+ messages in thread
From: Ferruh Yigit @ 2017-10-23 23:12 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev, Ferruh Yigit, Ivan Malov, Harry Van Haaren, Lee Daly

xstats _by_id() APIs are broken because ids known by user sent directly
to the PMDs.

ethdev xstat get by id APIs:
rte_eth_xstats_get_names_by_id() and rte_eth_xstats_get_by_id()
work on ids calculated as "basic stats + extended stats"

When an application asking for id less than "basic stats count", it is
indeed asking basic stats not extended stats.

The dev_ops PMDs implements work on extended stats ids.

This patch adds a check if all requested stats are xstats and if so
converts ids to xstats ids before passing them to PMDs.

This conversion wasn't required before commit 8c49d5f1c219, because
_by_id dev_ops were always used to get whole stats via NULL ids.

Fixes: 8c49d5f1c219 ("ethdev: rework xstats retrieve by id")

Signed-off-by: Ferruh Yigit <ferruh.yigit@intel.com>
Reviewed-by: Ivan Malov <ivan.malov@oktetlabs.ru>
Tested-by: Ivan Malov <ivan.malov@oktetlabs.ru>
---
Cc: Ivan Malov <Ivan.Malov@oktetlabs.ru>
Cc: Harry Van Haaren <harry.van.haaren@intel.com>
Cc: Lee Daly <lee.daly@intel.com>

v2:
* variable renamed, all_ids_from_pmd -> no_basic_stat_requested
* xstats id conversion commented.
---
 lib/librte_ether/rte_ethdev.c | 50 +++++++++++++++++++++++++++++++++++++------
 1 file changed, 44 insertions(+), 6 deletions(-)

diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index 798855e15..15ed2df10 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -1644,6 +1644,7 @@ rte_eth_xstats_get_names_by_id(uint16_t port_id,
 	uint64_t *ids)
 {
 	struct rte_eth_xstat_name *xstats_names_copy;
+	unsigned int no_basic_stat_requested = 1;
 	unsigned int expected_entries;
 	struct rte_eth_dev *dev;
 	unsigned int i;
@@ -1663,9 +1664,27 @@ rte_eth_xstats_get_names_by_id(uint16_t port_id,
 	if (ids && !xstats_names)
 		return -EINVAL;
 
-	if (dev->dev_ops->xstats_get_names_by_id != NULL)
-		return (*dev->dev_ops->xstats_get_names_by_id)(
-				dev, xstats_names, ids, size);
+	if (ids && dev->dev_ops->xstats_get_names_by_id != NULL && size > 0) {
+		unsigned int basic_count = get_xstats_basic_count(dev);
+		uint64_t ids_copy[size];
+
+		for (i = 0; i < size; i++) {
+			if (ids[i] < basic_count) {
+				no_basic_stat_requested = 0;
+				break;
+			}
+
+			/*
+			 * Convert ids to xstats ids that PMD knows.
+			 * ids known by user are basic + extended stats.
+			 */
+			ids_copy[i] = ids[i] - basic_count;
+		}
+
+		if (no_basic_stat_requested)
+			return (*dev->dev_ops->xstats_get_names_by_id)(dev,
+					xstats_names, ids_copy, size);
+	}
 
 	/* Retrieve all stats */
 	if (!ids) {
@@ -1772,6 +1791,7 @@ int
 rte_eth_xstats_get_by_id(uint16_t port_id, const uint64_t *ids,
 			 uint64_t *values, unsigned int size)
 {
+	unsigned int no_basic_stat_requested = 1;
 	unsigned int num_xstats_filled;
 	uint16_t expected_entries;
 	struct rte_eth_dev *dev;
@@ -1793,9 +1813,27 @@ rte_eth_xstats_get_by_id(uint16_t port_id, const uint64_t *ids,
 	if (ids && !values)
 		return -EINVAL;
 
-	if (dev->dev_ops->xstats_get_by_id != NULL)
-		return (*dev->dev_ops->xstats_get_by_id)(dev, ids, values,
-			size);
+	if (ids && dev->dev_ops->xstats_get_by_id != NULL && size) {
+		unsigned int basic_count = get_xstats_basic_count(dev);
+		uint64_t ids_copy[size];
+
+		for (i = 0; i < size; i++) {
+			if (ids[i] < basic_count) {
+				no_basic_stat_requested = 0;
+				break;
+			}
+
+			/*
+			 * Convert ids to xstats ids that PMD knows.
+			 * ids known by user are basic + extended stats.
+			 */
+			ids_copy[i] = ids[i] - basic_count;
+		}
+
+		if (no_basic_stat_requested)
+			return (*dev->dev_ops->xstats_get_by_id)(dev, ids_copy,
+					values, size);
+	}
 
 	/* Fill the xstats structure */
 	num_xstats_filled = rte_eth_xstats_get(port_id, xstats,
-- 
2.13.6

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

* [PATCH 3/3] ethdev: check more errors in xstats retrieval
  2017-10-23 23:12 ` [PATCH 1/3] ethdev: extract xstat basic stat count calculation Ferruh Yigit
  2017-10-23 23:12   ` [PATCH 2/3] ethdev: fix xstats get by id APIS Ferruh Yigit
@ 2017-10-23 23:12   ` Ferruh Yigit
  2017-10-23 23:15   ` [PATCH v2 1/3] ethdev: extract xstat basic stat count calculation Ferruh Yigit
  2 siblings, 0 replies; 14+ messages in thread
From: Ferruh Yigit @ 2017-10-23 23:12 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev, Ferruh Yigit, Lee Daly

Some function calls in xstat functions can return negative values
to indicate the error, check return values for those cases.

Coverity issue: 195028, 195026
Fixes: 8c49d5f1c219 ("ethdev: rework xstats retrieve by id")

Signed-off-by: Ferruh Yigit <ferruh.yigit@intel.com>
Acked-by: Thomas Monjalon <thomas@monjalon.net>
---
Cc: Lee Daly <lee.daly@intel.com>
---
 lib/librte_ether/rte_ethdev.c | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index 15ed2df10..0b13a58db 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -1648,11 +1648,16 @@ rte_eth_xstats_get_names_by_id(uint16_t port_id,
 	unsigned int expected_entries;
 	struct rte_eth_dev *dev;
 	unsigned int i;
+	int ret;
 
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
-	expected_entries = get_xstats_count(port_id);
 	dev = &rte_eth_devices[port_id];
 
+	ret = get_xstats_count(port_id);
+	if (ret < 0)
+		return ret;
+	expected_entries = (unsigned int)ret;
+
 	/* Return max number of stats if no ids given */
 	if (!ids) {
 		if (!xstats_names)
@@ -1796,6 +1801,7 @@ rte_eth_xstats_get_by_id(uint16_t port_id, const uint64_t *ids,
 	uint16_t expected_entries;
 	struct rte_eth_dev *dev;
 	unsigned int i;
+	int ret;
 
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	expected_entries = get_xstats_count(port_id);
@@ -1836,8 +1842,10 @@ rte_eth_xstats_get_by_id(uint16_t port_id, const uint64_t *ids,
 	}
 
 	/* Fill the xstats structure */
-	num_xstats_filled = rte_eth_xstats_get(port_id, xstats,
-		expected_entries);
+	ret = rte_eth_xstats_get(port_id, xstats, expected_entries);
+	if (ret < 0)
+		return ret;
+	num_xstats_filled = (unsigned int)ret;
 
 	/* Return all stats */
 	if (!ids) {
-- 
2.13.6

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

* [PATCH v2 1/3] ethdev: extract xstat basic stat count calculation
  2017-10-23 23:12 ` [PATCH 1/3] ethdev: extract xstat basic stat count calculation Ferruh Yigit
  2017-10-23 23:12   ` [PATCH 2/3] ethdev: fix xstats get by id APIS Ferruh Yigit
  2017-10-23 23:12   ` [PATCH 3/3] ethdev: check more errors in xstats retrieval Ferruh Yigit
@ 2017-10-23 23:15   ` Ferruh Yigit
  2017-10-23 23:15     ` [PATCH v2 2/3] ethdev: fix xstats get by id APIS Ferruh Yigit
                       ` (2 more replies)
  2 siblings, 3 replies; 14+ messages in thread
From: Ferruh Yigit @ 2017-10-23 23:15 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev, Ferruh Yigit

Extract into static inline function so that can be used by other
functions.

Signed-off-by: Ferruh Yigit <ferruh.yigit@intel.com>
---
 lib/librte_ether/rte_ethdev.c | 24 +++++++++++++++++++-----
 1 file changed, 19 insertions(+), 5 deletions(-)

diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index 0b1e92894..798855e15 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -1550,6 +1550,22 @@ rte_eth_stats_reset(uint16_t port_id)
 	return 0;
 }
 
+static inline int
+get_xstats_basic_count(struct rte_eth_dev *dev)
+{
+	uint16_t nb_rxqs, nb_txqs;
+	int count;
+
+	nb_rxqs = RTE_MIN(dev->data->nb_rx_queues, RTE_ETHDEV_QUEUE_STAT_CNTRS);
+	nb_txqs = RTE_MIN(dev->data->nb_tx_queues, RTE_ETHDEV_QUEUE_STAT_CNTRS);
+
+	count = RTE_NB_STATS;
+	count += nb_rxqs * RTE_NB_RXQ_STATS;
+	count += nb_txqs * RTE_NB_TXQ_STATS;
+
+	return count;
+}
+
 static int
 get_xstats_count(uint16_t port_id)
 {
@@ -1571,11 +1587,9 @@ get_xstats_count(uint16_t port_id)
 	} else
 		count = 0;
 
-	count += RTE_NB_STATS;
-	count += RTE_MIN(dev->data->nb_rx_queues, RTE_ETHDEV_QUEUE_STAT_CNTRS) *
-		 RTE_NB_RXQ_STATS;
-	count += RTE_MIN(dev->data->nb_tx_queues, RTE_ETHDEV_QUEUE_STAT_CNTRS) *
-		 RTE_NB_TXQ_STATS;
+
+	count += get_xstats_basic_count(dev);
+
 	return count;
 }
 
-- 
2.13.6

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

* [PATCH v2 2/3] ethdev: fix xstats get by id APIS
  2017-10-23 23:15   ` [PATCH v2 1/3] ethdev: extract xstat basic stat count calculation Ferruh Yigit
@ 2017-10-23 23:15     ` Ferruh Yigit
  2017-10-23 23:33       ` Thomas Monjalon
  2017-10-23 23:15     ` [PATCH v2 3/3] ethdev: check more errors in xstats retrieval Ferruh Yigit
  2017-10-24  0:31     ` [PATCH v2 1/3] ethdev: extract xstat basic stat count calculation Ferruh Yigit
  2 siblings, 1 reply; 14+ messages in thread
From: Ferruh Yigit @ 2017-10-23 23:15 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev, Ferruh Yigit, Ivan Malov, Harry Van Haaren, Lee Daly

xstats _by_id() APIs are broken because ids known by user sent directly
to the PMDs.

ethdev xstat get by id APIs:
rte_eth_xstats_get_names_by_id() and rte_eth_xstats_get_by_id()
work on ids calculated as "basic stats + extended stats"

When an application asking for id less than "basic stats count", it is
indeed asking basic stats not extended stats.

The dev_ops PMDs implements work on extended stats ids.

This patch adds a check if all requested stats are xstats and if so
converts ids to xstats ids before passing them to PMDs.

This conversion wasn't required before commit 8c49d5f1c219, because
_by_id dev_ops were always used to get whole stats via NULL ids.

Fixes: 8c49d5f1c219 ("ethdev: rework xstats retrieve by id")

Signed-off-by: Ferruh Yigit <ferruh.yigit@intel.com>
Reviewed-by: Ivan Malov <ivan.malov@oktetlabs.ru>
Tested-by: Ivan Malov <ivan.malov@oktetlabs.ru>
---
Cc: Ivan Malov <Ivan.Malov@oktetlabs.ru>
Cc: Harry Van Haaren <harry.van.haaren@intel.com>
Cc: Lee Daly <lee.daly@intel.com>

v2:
* variable renamed, all_ids_from_pmd -> no_basic_stat_requested
* xstats id conversion commented.
---
 lib/librte_ether/rte_ethdev.c | 50 +++++++++++++++++++++++++++++++++++++------
 1 file changed, 44 insertions(+), 6 deletions(-)

diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index 798855e15..15ed2df10 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -1644,6 +1644,7 @@ rte_eth_xstats_get_names_by_id(uint16_t port_id,
 	uint64_t *ids)
 {
 	struct rte_eth_xstat_name *xstats_names_copy;
+	unsigned int no_basic_stat_requested = 1;
 	unsigned int expected_entries;
 	struct rte_eth_dev *dev;
 	unsigned int i;
@@ -1663,9 +1664,27 @@ rte_eth_xstats_get_names_by_id(uint16_t port_id,
 	if (ids && !xstats_names)
 		return -EINVAL;
 
-	if (dev->dev_ops->xstats_get_names_by_id != NULL)
-		return (*dev->dev_ops->xstats_get_names_by_id)(
-				dev, xstats_names, ids, size);
+	if (ids && dev->dev_ops->xstats_get_names_by_id != NULL && size > 0) {
+		unsigned int basic_count = get_xstats_basic_count(dev);
+		uint64_t ids_copy[size];
+
+		for (i = 0; i < size; i++) {
+			if (ids[i] < basic_count) {
+				no_basic_stat_requested = 0;
+				break;
+			}
+
+			/*
+			 * Convert ids to xstats ids that PMD knows.
+			 * ids known by user are basic + extended stats.
+			 */
+			ids_copy[i] = ids[i] - basic_count;
+		}
+
+		if (no_basic_stat_requested)
+			return (*dev->dev_ops->xstats_get_names_by_id)(dev,
+					xstats_names, ids_copy, size);
+	}
 
 	/* Retrieve all stats */
 	if (!ids) {
@@ -1772,6 +1791,7 @@ int
 rte_eth_xstats_get_by_id(uint16_t port_id, const uint64_t *ids,
 			 uint64_t *values, unsigned int size)
 {
+	unsigned int no_basic_stat_requested = 1;
 	unsigned int num_xstats_filled;
 	uint16_t expected_entries;
 	struct rte_eth_dev *dev;
@@ -1793,9 +1813,27 @@ rte_eth_xstats_get_by_id(uint16_t port_id, const uint64_t *ids,
 	if (ids && !values)
 		return -EINVAL;
 
-	if (dev->dev_ops->xstats_get_by_id != NULL)
-		return (*dev->dev_ops->xstats_get_by_id)(dev, ids, values,
-			size);
+	if (ids && dev->dev_ops->xstats_get_by_id != NULL && size) {
+		unsigned int basic_count = get_xstats_basic_count(dev);
+		uint64_t ids_copy[size];
+
+		for (i = 0; i < size; i++) {
+			if (ids[i] < basic_count) {
+				no_basic_stat_requested = 0;
+				break;
+			}
+
+			/*
+			 * Convert ids to xstats ids that PMD knows.
+			 * ids known by user are basic + extended stats.
+			 */
+			ids_copy[i] = ids[i] - basic_count;
+		}
+
+		if (no_basic_stat_requested)
+			return (*dev->dev_ops->xstats_get_by_id)(dev, ids_copy,
+					values, size);
+	}
 
 	/* Fill the xstats structure */
 	num_xstats_filled = rte_eth_xstats_get(port_id, xstats,
-- 
2.13.6

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

* [PATCH v2 3/3] ethdev: check more errors in xstats retrieval
  2017-10-23 23:15   ` [PATCH v2 1/3] ethdev: extract xstat basic stat count calculation Ferruh Yigit
  2017-10-23 23:15     ` [PATCH v2 2/3] ethdev: fix xstats get by id APIS Ferruh Yigit
@ 2017-10-23 23:15     ` Ferruh Yigit
  2017-10-24  0:31     ` [PATCH v2 1/3] ethdev: extract xstat basic stat count calculation Ferruh Yigit
  2 siblings, 0 replies; 14+ messages in thread
From: Ferruh Yigit @ 2017-10-23 23:15 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev, Ferruh Yigit, Lee Daly

Some function calls in xstat functions can return negative values
to indicate the error, check return values for those cases.

Coverity issue: 195028, 195026
Fixes: 8c49d5f1c219 ("ethdev: rework xstats retrieve by id")

Signed-off-by: Ferruh Yigit <ferruh.yigit@intel.com>
Acked-by: Thomas Monjalon <thomas@monjalon.net>
---
Cc: Lee Daly <lee.daly@intel.com>
---
 lib/librte_ether/rte_ethdev.c | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index 15ed2df10..0b13a58db 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -1648,11 +1648,16 @@ rte_eth_xstats_get_names_by_id(uint16_t port_id,
 	unsigned int expected_entries;
 	struct rte_eth_dev *dev;
 	unsigned int i;
+	int ret;
 
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
-	expected_entries = get_xstats_count(port_id);
 	dev = &rte_eth_devices[port_id];
 
+	ret = get_xstats_count(port_id);
+	if (ret < 0)
+		return ret;
+	expected_entries = (unsigned int)ret;
+
 	/* Return max number of stats if no ids given */
 	if (!ids) {
 		if (!xstats_names)
@@ -1796,6 +1801,7 @@ rte_eth_xstats_get_by_id(uint16_t port_id, const uint64_t *ids,
 	uint16_t expected_entries;
 	struct rte_eth_dev *dev;
 	unsigned int i;
+	int ret;
 
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 	expected_entries = get_xstats_count(port_id);
@@ -1836,8 +1842,10 @@ rte_eth_xstats_get_by_id(uint16_t port_id, const uint64_t *ids,
 	}
 
 	/* Fill the xstats structure */
-	num_xstats_filled = rte_eth_xstats_get(port_id, xstats,
-		expected_entries);
+	ret = rte_eth_xstats_get(port_id, xstats, expected_entries);
+	if (ret < 0)
+		return ret;
+	num_xstats_filled = (unsigned int)ret;
 
 	/* Return all stats */
 	if (!ids) {
-- 
2.13.6

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

* Re: [PATCH v2 2/3] ethdev: fix xstats get by id APIS
  2017-10-23 23:15     ` [PATCH v2 2/3] ethdev: fix xstats get by id APIS Ferruh Yigit
@ 2017-10-23 23:33       ` Thomas Monjalon
  0 siblings, 0 replies; 14+ messages in thread
From: Thomas Monjalon @ 2017-10-23 23:33 UTC (permalink / raw)
  To: Ferruh Yigit; +Cc: dev, Ivan Malov, Harry Van Haaren, Lee Daly

24/10/2017 01:15, Ferruh Yigit:
> xstats _by_id() APIs are broken because ids known by user sent directly
> to the PMDs.
> 
> ethdev xstat get by id APIs:
> rte_eth_xstats_get_names_by_id() and rte_eth_xstats_get_by_id()
> work on ids calculated as "basic stats + extended stats"
> 
> When an application asking for id less than "basic stats count", it is
> indeed asking basic stats not extended stats.
> 
> The dev_ops PMDs implements work on extended stats ids.
> 
> This patch adds a check if all requested stats are xstats and if so
> converts ids to xstats ids before passing them to PMDs.
> 
> This conversion wasn't required before commit 8c49d5f1c219, because
> _by_id dev_ops were always used to get whole stats via NULL ids.
> 
> Fixes: 8c49d5f1c219 ("ethdev: rework xstats retrieve by id")
> 
> Signed-off-by: Ferruh Yigit <ferruh.yigit@intel.com>
> Reviewed-by: Ivan Malov <ivan.malov@oktetlabs.ru>
> Tested-by: Ivan Malov <ivan.malov@oktetlabs.ru>
> ---
> Cc: Ivan Malov <Ivan.Malov@oktetlabs.ru>
> Cc: Harry Van Haaren <harry.van.haaren@intel.com>
> Cc: Lee Daly <lee.daly@intel.com>
> 
> v2:
> * variable renamed, all_ids_from_pmd -> no_basic_stat_requested
> * xstats id conversion commented.

A lot more clear :)
Thanks

Acked-by: Thomas Monjalon <thomas@monjalon.net>

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

* Re: [PATCH v2 1/3] ethdev: extract xstat basic stat count calculation
  2017-10-23 23:15   ` [PATCH v2 1/3] ethdev: extract xstat basic stat count calculation Ferruh Yigit
  2017-10-23 23:15     ` [PATCH v2 2/3] ethdev: fix xstats get by id APIS Ferruh Yigit
  2017-10-23 23:15     ` [PATCH v2 3/3] ethdev: check more errors in xstats retrieval Ferruh Yigit
@ 2017-10-24  0:31     ` Ferruh Yigit
  2 siblings, 0 replies; 14+ messages in thread
From: Ferruh Yigit @ 2017-10-24  0:31 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

On 10/23/2017 4:15 PM, Ferruh Yigit wrote:
> Extract into static inline function so that can be used by other
> functions.
> 
> Signed-off-by: Ferruh Yigit <ferruh.yigit@intel.com>

Series applied to dpdk-next-net/master, thanks.

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

end of thread, other threads:[~2017-10-24  0:31 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-10-20  0:03 [PATCH 1/3] ethdev: extract xstat basic stat count calculation Ferruh Yigit
2017-10-20  0:03 ` [PATCH 2/3] ethdev: fix xstats get by id APIS Ferruh Yigit
2017-10-20 12:33   ` Ivan Malov
2017-10-23 22:20   ` Thomas Monjalon
2017-10-20  0:03 ` [PATCH 3/3] ethdev: fix negative return values in xstats Ferruh Yigit
2017-10-23 22:26   ` Thomas Monjalon
2017-10-23 23:12 ` [PATCH 1/3] ethdev: extract xstat basic stat count calculation Ferruh Yigit
2017-10-23 23:12   ` [PATCH 2/3] ethdev: fix xstats get by id APIS Ferruh Yigit
2017-10-23 23:12   ` [PATCH 3/3] ethdev: check more errors in xstats retrieval Ferruh Yigit
2017-10-23 23:15   ` [PATCH v2 1/3] ethdev: extract xstat basic stat count calculation Ferruh Yigit
2017-10-23 23:15     ` [PATCH v2 2/3] ethdev: fix xstats get by id APIS Ferruh Yigit
2017-10-23 23:33       ` Thomas Monjalon
2017-10-23 23:15     ` [PATCH v2 3/3] ethdev: check more errors in xstats retrieval Ferruh Yigit
2017-10-24  0:31     ` [PATCH v2 1/3] ethdev: extract xstat basic stat count calculation Ferruh Yigit

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.