DPDK patches and discussions
 help / color / mirror / Atom feed
From: Stephen Hemminger <stephen@networkplumber.org>
To: dev@dpdk.org
Cc: Stephen Hemminger <stephen@networkplumber.org>,
	Reshma Pattan <reshma.pattan@intel.com>
Subject: [PATCH v6 8/8] test: update to latencystats tests
Date: Wed, 29 May 2024 15:54:45 -0700	[thread overview]
Message-ID: <20240529225732.442539-9-stephen@networkplumber.org> (raw)
In-Reply-To: <20240529225732.442539-1-stephen@networkplumber.org>

No need for loop and memset() here. Just use structure
initialization.  Remove unnecessary initializations.

Look at the number of samples, min, max and average
numbers to make sure they look correct.
Forward for longer to make sure multiple samples are taken.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 app/test/test_latencystats.c | 84 ++++++++++++++++++++++++------------
 1 file changed, 57 insertions(+), 27 deletions(-)

diff --git a/app/test/test_latencystats.c b/app/test/test_latencystats.c
index c309ab194f..676a99d385 100644
--- a/app/test/test_latencystats.c
+++ b/app/test/test_latencystats.c
@@ -14,18 +14,19 @@
 #include "sample_packet_forward.h"
 #include "test.h"
 
-#define NUM_STATS 4
+#define NUM_STATS 5
 #define LATENCY_NUM_PACKETS 10
 #define QUEUE_ID 0
 
 static uint16_t portid;
 static struct rte_ring *ring;
 
-static struct rte_metric_name lat_stats_strings[] = {
+static struct rte_metric_name lat_stats_strings[NUM_STATS] = {
 	{"min_latency_ns"},
 	{"avg_latency_ns"},
 	{"max_latency_ns"},
 	{"jitter_ns"},
+	{"samples"},
 };
 
 /* Test case for latency init with metrics init */
@@ -70,13 +71,9 @@ static int test_latency_uninit(void)
 /* Test case to get names of latency stats */
 static int test_latencystats_get_names(void)
 {
-	int ret = 0, i = 0;
-	int size = 0;
-	struct rte_metric_name names[NUM_STATS];
-
-	size_t m_size = sizeof(struct rte_metric_name);
-	for (i = 0; i < NUM_STATS; i++)
-		memset(&names[i], 0, m_size);
+	int ret, i;
+	uint16_t size;
+	struct rte_metric_name names[NUM_STATS] = { };
 
 	/* Success Test: Valid names and size */
 	size = NUM_STATS;
@@ -106,13 +103,9 @@ static int test_latencystats_get_names(void)
 /* Test case to get latency stats values */
 static int test_latencystats_get(void)
 {
-	int ret = 0, i = 0;
-	int size = 0;
-	struct rte_metric_value values[NUM_STATS];
-
-	size_t v_size = sizeof(struct rte_metric_value);
-	for (i = 0; i < NUM_STATS; i++)
-		memset(&values[i], 0, v_size);
+	int ret;
+	uint16_t size;
+	struct rte_metric_value values[NUM_STATS] = { };
 
 	/* Success Test: Valid values and valid size */
 	size = NUM_STATS;
@@ -149,10 +142,14 @@ static void test_latency_ring_free(void)
 
 static int test_latency_packet_forward(void)
 {
+	unsigned int i;
 	int ret;
 	struct rte_mbuf *pbuf[LATENCY_NUM_PACKETS] = { };
 	struct rte_mempool *mp;
 	char poolname[] = "mbuf_pool";
+	uint64_t end_cycles;
+	struct rte_metric_value values[NUM_STATS] = { };
+	struct rte_metric_name names[NUM_STATS] = { };
 
 	ret = test_get_mbuf_from_pool(&mp, pbuf, poolname);
 	if (ret < 0) {
@@ -166,9 +163,41 @@ static int test_latency_packet_forward(void)
 		return TEST_FAILED;
 	}
 
-	ret = test_packet_forward(pbuf, portid, QUEUE_ID);
-	if (ret < 0)
-		printf("send pkts Failed\n");
+	ret = rte_latencystats_get_names(names, NUM_STATS);
+	TEST_ASSERT((ret == NUM_STATS), "Test Failed to get metrics names");
+
+	ret = rte_latencystats_get(values, NUM_STATS);
+	TEST_ASSERT(ret == NUM_STATS, "Test failed to get results before forwarding");
+	TEST_ASSERT(values[4].value == 0, "Samples not zero at start of test");
+
+	/*
+	 * Want test to run long enough to collect sufficient samples
+	 * but not so long that scheduler decides to reschedule it (1000 hz).
+	 */
+	end_cycles = rte_rdtsc() + rte_get_tsc_hz() / 2000;
+	do {
+		ret = test_packet_forward(pbuf, portid, QUEUE_ID);
+		if (ret < 0)
+			printf("send pkts Failed\n");
+	} while (rte_rdtsc() < end_cycles);
+
+	ret = rte_latencystats_get(values, NUM_STATS);
+	TEST_ASSERT(ret == NUM_STATS, "Test failed to get results after forwarding");
+
+	for (i = 0; i < NUM_STATS; i++) {
+		uint16_t k = values[i].key;
+
+		printf("%s = %"PRIu64"\n",
+		       names[k].name, values[i].value);
+	}
+
+	TEST_ASSERT(values[4].value > 0, "No samples taken");
+	TEST_ASSERT(values[0].value > 0, "Min latency should not be zero");
+	TEST_ASSERT(values[1].value > 0, "Avg latency should not be zero");
+	TEST_ASSERT(values[2].value > 0, "Max latency should not be zero");
+	TEST_ASSERT(values[0].value < values[1].value, "Min latency > Avg latency");
+	TEST_ASSERT(values[0].value < values[2].value, "Min latency > Max latency");
+	TEST_ASSERT(values[1].value < values[2].value, "Avg latency > Max latency");
 
 	rte_eth_dev_stop(portid);
 	test_put_mbuf_to_pool(mp, pbuf);
@@ -188,22 +217,23 @@ unit_test_suite latencystats_testsuite = {
 		 */
 		TEST_CASE_ST(NULL, NULL, test_latency_init),
 
-		/* Test Case 2: Do packet forwarding for metrics
-		 * calculation and check the latency metrics values
-		 * are updated
-		 */
-		TEST_CASE_ST(test_latency_packet_forward, NULL,
-				test_latency_update),
-		/* Test Case 3: To check whether latency stats names
+		/* Test Case 2: To check whether latency stats names
 		 * are retrieved
 		 */
 		TEST_CASE_ST(NULL, NULL, test_latencystats_get_names),
 
-		/* Test Case 4: To check whether latency stats
+		/* Test Case 3: To check whether latency stats
 		 * values are retrieved
 		 */
 		TEST_CASE_ST(NULL, NULL, test_latencystats_get),
 
+		/* Test Case 4: Do packet forwarding for metrics
+		 * calculation and check the latency metrics values
+		 * are updated
+		 */
+		TEST_CASE_ST(test_latency_packet_forward, NULL,
+				test_latency_update),
+
 		/* Test Case 5: To check uninit of latency test */
 		TEST_CASE_ST(NULL, NULL, test_latency_uninit),
 
-- 
2.43.0


      parent reply	other threads:[~2024-05-29 22:58 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-08 19:50 [RFC] latencystats: performance overhaul Stephen Hemminger
2024-04-08 21:26 ` [PATCH v2] " Stephen Hemminger
2024-04-19 17:28 ` [PATCH v4 0/6] latencystats: cleanup Stephen Hemminger
2024-04-19 17:28   ` [PATCH v4 1/6] latencystats: replace use of VLA Stephen Hemminger
2024-04-19 17:28   ` [PATCH v4 2/6] latencystats: handle fractional cycles per ns Stephen Hemminger
2024-04-19 17:28   ` [PATCH v4 3/6] latencystats: do not use floating point Stephen Hemminger
2024-04-19 18:49     ` Morten Brørup
2024-04-19 22:45       ` Stephen Hemminger
2024-04-20  7:31         ` Morten Brørup
2024-04-19 17:28   ` [PATCH v4 4/6] latencystats: fix log messages Stephen Hemminger
2024-04-19 17:28   ` [PATCH v4 5/6] latencystats: update include files Stephen Hemminger
2024-04-19 17:28   ` [PATCH v4 6/6] latencystats: fix for pedantic warnings Stephen Hemminger
2024-04-22 15:21 ` [PATCH v5 0/9] latencystats: improve algorithms and tests Stephen Hemminger
2024-04-22 15:21   ` [PATCH v5 1/9] latencystats: replace use of VLA Stephen Hemminger
2024-04-22 15:21   ` [PATCH v5 2/9] latencystats: handle fractional cycles per ns Stephen Hemminger
2024-04-22 15:21   ` [PATCH v5 3/9] latencystats: do not use floating point Stephen Hemminger
2024-04-22 15:21   ` [PATCH v5 4/9] latencystats: fix log messages Stephen Hemminger
2024-04-22 15:21   ` [PATCH v5 5/9] latencystats: update include files Stephen Hemminger
2024-04-22 15:21   ` [PATCH v5 6/9] latencystats: enforce that unused callback function is NULL Stephen Hemminger
2024-04-22 15:21   ` [PATCH v5 7/9] latencystats: add metric for number of samples Stephen Hemminger
2024-04-22 15:21   ` [PATCH v5 8/9] test: use initialization in latencystats test Stephen Hemminger
2024-04-22 15:21   ` [PATCH v5 9/9] test: add more latencystats tests Stephen Hemminger
2024-05-29 22:54 ` [PATCH v6 0/8] latencystats: improvements to algorithm and test Stephen Hemminger
2024-05-29 22:54   ` [PATCH v6 1/8] latencystats: replace use of VLA Stephen Hemminger
2024-05-29 22:54   ` [PATCH v6 2/8] latencystats: handle fractional cycles per ns Stephen Hemminger
2024-05-29 22:54   ` [PATCH v6 3/8] latencystats: do not use floating point Stephen Hemminger
2024-05-29 22:54   ` [PATCH v6 4/8] latencystats: fix log messages Stephen Hemminger
2024-05-29 22:54   ` [PATCH v6 5/8] latencystats: update include files Stephen Hemminger
2024-05-29 22:54   ` [PATCH v6 6/8] latencystats: enforce that unused callback function is NULL Stephen Hemminger
2024-05-29 22:54   ` [PATCH v6 7/8] latencystats: add metric for number of samples Stephen Hemminger
2024-05-29 22:54   ` Stephen Hemminger [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240529225732.442539-9-stephen@networkplumber.org \
    --to=stephen@networkplumber.org \
    --cc=dev@dpdk.org \
    --cc=reshma.pattan@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).