* [dpdk-dev] [PATCH 0/2] xstats related patches @ 2019-11-01 20:12 Stephen Hemminger 2019-11-01 20:12 ` [dpdk-dev] [PATCH 1/2] app/testpmd: block xstats for hidden ports Stephen Hemminger ` (2 more replies) 0 siblings, 3 replies; 7+ messages in thread From: Stephen Hemminger @ 2019-11-01 20:12 UTC (permalink / raw) To: dev; +Cc: Stephen Hemminger This is an updated simplified version of previous failsafe xstats patch and a bug fix for testpmd. The failsafe xstats patch is almostly a complete redo. Stephen Hemminger (2): app/testpmd: block xstats for hidden ports failsafe: implement xstats app/test-pmd/config.c | 8 ++ drivers/net/failsafe/failsafe_ops.c | 152 ++++++++++++++++++++++++++++ 2 files changed, 160 insertions(+) -- 2.20.1 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [dpdk-dev] [PATCH 1/2] app/testpmd: block xstats for hidden ports 2019-11-01 20:12 [dpdk-dev] [PATCH 0/2] xstats related patches Stephen Hemminger @ 2019-11-01 20:12 ` Stephen Hemminger 2019-11-04 11:25 ` Iremonger, Bernard 2019-11-01 20:12 ` [dpdk-dev] [PATCH 2/2] failsafe: implement xstats Stephen Hemminger 2019-11-08 18:26 ` [dpdk-dev] [PATCH 0/2] xstats related patches Ferruh Yigit 2 siblings, 1 reply; 7+ messages in thread From: Stephen Hemminger @ 2019-11-01 20:12 UTC (permalink / raw) To: dev; +Cc: Stephen Hemminger All the other testpmd commands block access to devices that are owned. Looks like xstat got overlooked. Fixes: bfd5051b43b5 ("app/testpmd: new command to get extended statistics") Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> --- app/test-pmd/config.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c index efe2812a85ef..ad926d573b81 100644 --- a/app/test-pmd/config.c +++ b/app/test-pmd/config.c @@ -238,6 +238,10 @@ nic_xstats_display(portid_t port_id) int cnt_xstats, idx_xstat; struct rte_eth_xstat_name *xstats_names; + if (port_id_is_invalid(port_id, ENABLED_WARN)) { + print_valid_ports(); + return; + } printf("###### NIC extended statistics for port %-2d\n", port_id); if (!rte_eth_dev_is_valid_port(port_id)) { printf("Error: Invalid port number %i\n", port_id); @@ -295,6 +299,10 @@ nic_xstats_clear(portid_t port_id) { int ret; + if (port_id_is_invalid(port_id, ENABLED_WARN)) { + print_valid_ports(); + return; + } ret = rte_eth_xstats_reset(port_id); if (ret != 0) { printf("%s: Error: failed to reset xstats (port %u): %s", -- 2.20.1 ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [dpdk-dev] [PATCH 1/2] app/testpmd: block xstats for hidden ports 2019-11-01 20:12 ` [dpdk-dev] [PATCH 1/2] app/testpmd: block xstats for hidden ports Stephen Hemminger @ 2019-11-04 11:25 ` Iremonger, Bernard 0 siblings, 0 replies; 7+ messages in thread From: Iremonger, Bernard @ 2019-11-04 11:25 UTC (permalink / raw) To: Stephen Hemminger, dev > -----Original Message----- > From: dev <dev-bounces@dpdk.org> On Behalf Of Stephen Hemminger > Sent: Friday, November 1, 2019 8:13 PM > To: dev@dpdk.org > Cc: Stephen Hemminger <stephen@networkplumber.org> > Subject: [dpdk-dev] [PATCH 1/2] app/testpmd: block xstats for hidden ports > > All the other testpmd commands block access to devices that are owned. > Looks like xstat got overlooked. > > Fixes: bfd5051b43b5 ("app/testpmd: new command to get extended > statistics") > Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> ./devtools/check-git-log.sh -1 Is it candidate for Cc: stable@dpdk.org backport? Otherwise: Acked-by: Bernard Iremonger <bernard.iremonger@intel.com> ^ permalink raw reply [flat|nested] 7+ messages in thread
* [dpdk-dev] [PATCH 2/2] failsafe: implement xstats 2019-11-01 20:12 [dpdk-dev] [PATCH 0/2] xstats related patches Stephen Hemminger 2019-11-01 20:12 ` [dpdk-dev] [PATCH 1/2] app/testpmd: block xstats for hidden ports Stephen Hemminger @ 2019-11-01 20:12 ` Stephen Hemminger 2019-11-08 18:13 ` Ferruh Yigit 2019-11-08 18:26 ` [dpdk-dev] [PATCH 0/2] xstats related patches Ferruh Yigit 2 siblings, 1 reply; 7+ messages in thread From: Stephen Hemminger @ 2019-11-01 20:12 UTC (permalink / raw) To: dev; +Cc: Stephen Hemminger Add support for extended statistics in failsafe driver. Reports detailed statistics for each sub device. Example: testpmd> show port xstats 1 rx_good_packets: 0 tx_good_packets: 0 rx_good_bytes: 0 tx_good_bytes: 0 rx_missed_errors: 0 rx_errors: 0 tx_errors: 0 rx_mbuf_allocation_errors: 0 rx_q0packets: 0 rx_q0bytes: 0 rx_q0errors: 0 tx_q0packets: 0 tx_q0bytes: 0 rx_sub0_good_packets: 0 tx_sub0_good_packets: 0 ... rx_sub1_good_packets: 0 tx_sub1_good_packets: 0 rx_sub1_good_bytes: 0 Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> --- drivers/net/failsafe/failsafe_ops.c | 152 ++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) diff --git a/drivers/net/failsafe/failsafe_ops.c b/drivers/net/failsafe/failsafe_ops.c index 0afae6c71feb..a87e49b97d33 100644 --- a/drivers/net/failsafe/failsafe_ops.c +++ b/drivers/net/failsafe/failsafe_ops.c @@ -14,6 +14,7 @@ #include <rte_flow.h> #include <rte_cycles.h> #include <rte_ethdev.h> +#include <rte_string_fns.h> #include "failsafe_private.h" @@ -881,6 +882,154 @@ fs_stats_reset(struct rte_eth_dev *dev) return 0; } +static int +__fs_xstats_count(struct rte_eth_dev *dev) +{ + struct sub_device *sdev; + int count = 0; + uint8_t i; + int ret; + + FOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) { + ret = rte_eth_xstats_get_names(PORT_ID(sdev), NULL, 0); + if (ret < 0) + return ret; + count += ret; + } + + return count; +} + +static int +__fs_xstats_get_names(struct rte_eth_dev *dev, + struct rte_eth_xstat_name *xstats_names, + unsigned int limit) +{ + struct sub_device *sdev; + unsigned int count = 0; + uint8_t i; + + /* Caller only cares about count */ + if (!xstats_names) + return __fs_xstats_count(dev); + + FOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) { + struct rte_eth_xstat_name *sub_names = xstats_names + count; + int j, r; + + if (count >= limit) + break; + + r = rte_eth_xstats_get_names(PORT_ID(sdev), + sub_names, limit - count); + if (r < 0) + return r; + + /* add subN_ prefix to names */ + for (j = 0; j < r; j++) { + char *xname = sub_names[j].name; + char tmp[RTE_ETH_XSTATS_NAME_SIZE]; + + if ((xname[0] == 't' || xname[0] == 'r') && + xname[1] == 'x' && xname[2] == '_') + snprintf(tmp, sizeof(tmp), "%.3ssub%u_%s", + xname, i, xname + 3); + else + snprintf(tmp, sizeof(tmp), "sub%u_%s", + i, xname); + + strlcpy(xname, tmp, RTE_ETH_XSTATS_NAME_SIZE); + } + count += r; + } + return count; +} + +static int +fs_xstats_get_names(struct rte_eth_dev *dev, + struct rte_eth_xstat_name *xstats_names, + unsigned int limit) +{ + int ret; + + fs_lock(dev, 0); + ret = __fs_xstats_get_names(dev, xstats_names, limit); + fs_unlock(dev, 0); + return ret; +} + +static int +__fs_xstats_get(struct rte_eth_dev *dev, + struct rte_eth_xstat *xstats, + unsigned int n) +{ + unsigned int count = 0; + struct sub_device *sdev; + uint8_t i; + int j, ret; + + ret = __fs_xstats_count(dev); + /* + * if error + * or caller did not give enough space + * or just querying + */ + if (ret < 0 || ret > (int)n || xstats == NULL) + return ret; + + FOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) { + ret = rte_eth_xstats_get(PORT_ID(sdev), xstats, n); + if (ret < 0) + return ret; + + if (ret > (int)n) + return n + count; + + /* add offset to id's from sub-device */ + for (j = 0; j < ret; j++) + xstats[j].id += count; + + xstats += ret; + n -= ret; + count += ret; + } + + return count; +} + +static int +fs_xstats_get(struct rte_eth_dev *dev, + struct rte_eth_xstat *xstats, + unsigned int n) +{ + int ret; + + fs_lock(dev, 0); + ret = __fs_xstats_get(dev, xstats, n); + fs_unlock(dev, 0); + + return ret; +} + + +static int +fs_xstats_reset(struct rte_eth_dev *dev) +{ + struct sub_device *sdev; + uint8_t i; + int r = 0; + + fs_lock(dev, 0); + FOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) { + r = rte_eth_xstats_reset(PORT_ID(sdev)); + if (r < 0) + break; + } + fs_unlock(dev, 0); + + return r; +} + static void fs_dev_merge_desc_lim(struct rte_eth_desc_lim *to, const struct rte_eth_desc_lim *from) @@ -1331,6 +1480,9 @@ const struct eth_dev_ops failsafe_ops = { .link_update = fs_link_update, .stats_get = fs_stats_get, .stats_reset = fs_stats_reset, + .xstats_get = fs_xstats_get, + .xstats_get_names = fs_xstats_get_names, + .xstats_reset = fs_xstats_reset, .dev_infos_get = fs_dev_infos_get, .dev_supported_ptypes_get = fs_dev_supported_ptypes_get, .mtu_set = fs_mtu_set, -- 2.20.1 ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [dpdk-dev] [PATCH 2/2] failsafe: implement xstats 2019-11-01 20:12 ` [dpdk-dev] [PATCH 2/2] failsafe: implement xstats Stephen Hemminger @ 2019-11-08 18:13 ` Ferruh Yigit 0 siblings, 0 replies; 7+ messages in thread From: Ferruh Yigit @ 2019-11-08 18:13 UTC (permalink / raw) To: Stephen Hemminger, dev, Gaetan Rivet On 11/1/2019 8:12 PM, Stephen Hemminger wrote: > Add support for extended statistics in failsafe driver. > Reports detailed statistics for each sub device. > > Example: > > testpmd> show port xstats 1 > rx_good_packets: 0 > tx_good_packets: 0 > rx_good_bytes: 0 > tx_good_bytes: 0 > rx_missed_errors: 0 > rx_errors: 0 > tx_errors: 0 > rx_mbuf_allocation_errors: 0 > rx_q0packets: 0 > rx_q0bytes: 0 > rx_q0errors: 0 > tx_q0packets: 0 > tx_q0bytes: 0 > rx_sub0_good_packets: 0 > tx_sub0_good_packets: 0 > ... > rx_sub1_good_packets: 0 > tx_sub1_good_packets: 0 > rx_sub1_good_bytes: 0 > > Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com> Hi Stephen, Geatan, What do you think about adding Stephen as additional failsafe maintainer? ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [dpdk-dev] [PATCH 0/2] xstats related patches 2019-11-01 20:12 [dpdk-dev] [PATCH 0/2] xstats related patches Stephen Hemminger 2019-11-01 20:12 ` [dpdk-dev] [PATCH 1/2] app/testpmd: block xstats for hidden ports Stephen Hemminger 2019-11-01 20:12 ` [dpdk-dev] [PATCH 2/2] failsafe: implement xstats Stephen Hemminger @ 2019-11-08 18:26 ` Ferruh Yigit 2 siblings, 0 replies; 7+ messages in thread From: Ferruh Yigit @ 2019-11-08 18:26 UTC (permalink / raw) To: Stephen Hemminger, dev On 11/1/2019 8:12 PM, Stephen Hemminger wrote: > This is an updated simplified version of previous failsafe xstats > patch and a bug fix for testpmd. > > The failsafe xstats patch is almostly a complete redo. > > Stephen Hemminger (2): > app/testpmd: block xstats for hidden ports > failsafe: implement xstats Series applied to dpdk-next-net/master, thanks. ^ permalink raw reply [flat|nested] 7+ messages in thread
* [dpdk-dev] [PATCH 0/2] failsafe: add xstats @ 2019-06-26 22:21 Stephen Hemminger 2019-06-26 22:21 ` [dpdk-dev] [PATCH 2/2] failsafe: implement xstats Stephen Hemminger 0 siblings, 1 reply; 7+ messages in thread From: Stephen Hemminger @ 2019-06-26 22:21 UTC (permalink / raw) To: gaetan.rivet; +Cc: dev, Stephen Hemminger A useful feature of netvsc PMD is the ability to see how many packets were processed through the VF device. This patch set adds a similar (but more limited) capability to failsafe driver. Since failsafe doesn't have top level xstats, this set uses the generic xstats that exist already as a base then adds the sub-device xstats to that. Stephen Hemminger (2): ethdev: expose basic xstats for driver use failsafe: implement xstats drivers/net/failsafe/failsafe_ops.c | 144 +++++++++++++++++++++++ lib/librte_ethdev/rte_ethdev.c | 17 ++- lib/librte_ethdev/rte_ethdev_core.h | 14 +++ lib/librte_ethdev/rte_ethdev_version.map | 3 + 4 files changed, 169 insertions(+), 9 deletions(-) -- 2.20.1 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [dpdk-dev] [PATCH 2/2] failsafe: implement xstats 2019-06-26 22:21 [dpdk-dev] [PATCH 0/2] failsafe: add xstats Stephen Hemminger @ 2019-06-26 22:21 ` Stephen Hemminger 0 siblings, 0 replies; 7+ messages in thread From: Stephen Hemminger @ 2019-06-26 22:21 UTC (permalink / raw) To: gaetan.rivet; +Cc: dev, Stephen Hemminger From: Stephen Hemminger <sthemmin@microsoft.com> Add support for extended statistics in failsafe driver. Reports basic statistics for the failsafe driver, and detailed statistics for each sub device. Signed-off-by: Stephen Hemminger <sthemmin@microsoft.com> --- drivers/net/failsafe/failsafe_ops.c | 144 ++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) diff --git a/drivers/net/failsafe/failsafe_ops.c b/drivers/net/failsafe/failsafe_ops.c index 96e05d4dc4b1..9ab32457983d 100644 --- a/drivers/net/failsafe/failsafe_ops.c +++ b/drivers/net/failsafe/failsafe_ops.c @@ -789,6 +789,147 @@ fs_stats_reset(struct rte_eth_dev *dev) fs_unlock(dev, 0); } +static int +fs_xstats_count(struct rte_eth_dev *dev) +{ + struct sub_device *sdev; + int r, count; + uint8_t i; + + count = rte_eth_basic_stats_count(dev); + + fs_lock(dev, 0); + FOREACH_SUBDEV(sdev, i, dev) { + if (sdev->state < DEV_ACTIVE) + continue; + + r = rte_eth_xstats_get_names(PORT_ID(sdev), NULL, 0); + if (r < 0) { + fs_unlock(dev, 0); + return r; + } + + count += r; + } + fs_unlock(dev, 0); + + return count; +} + +static int +fs_xstats_get_names(struct rte_eth_dev *dev, + struct rte_eth_xstat_name *xstats_names, + unsigned int limit) +{ + struct sub_device *sdev; + unsigned int count; + uint8_t i; + char tmp[RTE_ETH_XSTATS_NAME_SIZE]; + int j,r; + + if (!xstats_names) + return fs_xstats_count(dev); + + r = rte_eth_basic_stats_get_names(dev, xstats_names); + if (r < 0) + return r; + + count = r; + + fs_lock(dev, 0); + FOREACH_SUBDEV(sdev, i, dev) { + struct rte_eth_xstat_name *sub_names = xstats_names + count; + + if (sdev->state < DEV_ACTIVE) + continue; + + if (count >= limit) + break; + + r = rte_eth_xstats_get_names(PORT_ID(sdev), sub_names, + count < limit ? limit - count: 0); + if (r < 0) { + fs_unlock(dev, 0); + return r; + } + + /* add sub_ prefix to names */ + for (j = 0; j < r; j++) { + snprintf(tmp, sizeof(tmp), "sub%u_%s", + i, sub_names[j].name); + memcpy(sub_names[j].name, tmp, + RTE_ETH_XSTATS_NAME_SIZE); + } + + count += r; + } + fs_unlock(dev, 0); + + return count; +} + +static int +fs_xstats_get(struct rte_eth_dev *dev, + struct rte_eth_xstat *xstats, + unsigned int n) +{ + unsigned int nstats, j, count, scount; + struct sub_device *sdev; + uint8_t i; + int ret; + + nstats = fs_xstats_count(dev); + if (n < nstats || xstats == NULL) + return nstats; + + ret = rte_eth_basic_stats_get(dev->data->port_id, xstats); + if (ret < 0) + return ret; + + count = ret; + for (j = 0; j < count; j++) + xstats[j].id = j; + + fs_lock(dev, 0); + FOREACH_SUBDEV(sdev, i, dev) { + if (sdev->state < DEV_ACTIVE) + continue; + + ret = rte_eth_xstats_get(PORT_ID(sdev), + xstats + count, + n > count ? n - count : 0); + if (ret < 0) { + fs_unlock(dev, 0); + return ret; + } + scount = ret; + + /* add offset to id's from sub-device */ + for (j = 0; j < scount; j++) + xstats[count + j].id += count; + + count += scount; + } + fs_unlock(dev, 0); + + return count; +} + +static void +fs_xstats_reset(struct rte_eth_dev *dev) +{ + struct sub_device *sdev; + uint8_t i; + + rte_eth_stats_reset(dev->data->port_id); + + fs_lock(dev, 0); + FOREACH_SUBDEV(sdev, i, dev) { + rte_eth_xstats_reset(PORT_ID(sdev)); + } + fs_unlock(dev, 0); +} + static void fs_dev_merge_desc_lim(struct rte_eth_desc_lim *to, const struct rte_eth_desc_lim *from) @@ -1233,6 +1374,9 @@ const struct eth_dev_ops failsafe_ops = { .link_update = fs_link_update, .stats_get = fs_stats_get, .stats_reset = fs_stats_reset, + .xstats_get = fs_xstats_get, + .xstats_get_names = fs_xstats_get_names, + .xstats_reset = fs_xstats_reset, .dev_infos_get = fs_dev_infos_get, .dev_supported_ptypes_get = fs_dev_supported_ptypes_get, .mtu_set = fs_mtu_set, -- 2.20.1 ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2019-11-08 18:26 UTC | newest] Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2019-11-01 20:12 [dpdk-dev] [PATCH 0/2] xstats related patches Stephen Hemminger 2019-11-01 20:12 ` [dpdk-dev] [PATCH 1/2] app/testpmd: block xstats for hidden ports Stephen Hemminger 2019-11-04 11:25 ` Iremonger, Bernard 2019-11-01 20:12 ` [dpdk-dev] [PATCH 2/2] failsafe: implement xstats Stephen Hemminger 2019-11-08 18:13 ` Ferruh Yigit 2019-11-08 18:26 ` [dpdk-dev] [PATCH 0/2] xstats related patches Ferruh Yigit -- strict thread matches above, loose matches on Subject: below -- 2019-06-26 22:21 [dpdk-dev] [PATCH 0/2] failsafe: add xstats Stephen Hemminger 2019-06-26 22:21 ` [dpdk-dev] [PATCH 2/2] failsafe: implement xstats Stephen Hemminger
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).