git: 4a77a9b64910 - main - routing: Use process fib instead of fib 0 when conducting tests.

Alexander V. Chernikov melifaro at FreeBSD.org
Sun Aug 15 22:24:01 UTC 2021


The branch main has been updated by melifaro:

URL: https://cgit.FreeBSD.org/src/commit/?id=4a77a9b6491093b9a8bb786a861ed74ddf156e8e

commit 4a77a9b6491093b9a8bb786a861ed74ddf156e8e
Author:     Alexander V. Chernikov <melifaro at FreeBSD.org>
AuthorDate: 2021-08-15 22:05:41 +0000
Commit:     Alexander V. Chernikov <melifaro at FreeBSD.org>
CommitDate: 2021-08-15 22:10:14 +0000

    routing: Use process fib instead of fib 0 when conducting tests.
    
    * Allow to do validation/performance tests by using process
     fib instead of default fib 0.
    * Print all validation errors instead of just the first one.
    
    MFC after:      1 week
---
 sys/tests/fib_lookup/fib_lookup.c | 63 ++++++++++++++++++++++++---------------
 1 file changed, 39 insertions(+), 24 deletions(-)

diff --git a/sys/tests/fib_lookup/fib_lookup.c b/sys/tests/fib_lookup/fib_lookup.c
index 927664166fdd..55d2f3d4a4df 100644
--- a/sys/tests/fib_lookup/fib_lookup.c
+++ b/sys/tests/fib_lookup/fib_lookup.c
@@ -159,7 +159,7 @@ SYSCTL_PROC(_net_route_test, OID_AUTO, add_inet6_addr,
     add_inet6_addr_sysctl_handler, "A", "Set");
 
 static uint64_t
-run_test_inet_one_pass()
+run_test_inet_one_pass(uint32_t fibnum)
 {
 	/* Assume epoch */
 	int sz = V_inet_list_size;
@@ -169,7 +169,7 @@ run_test_inet_one_pass()
 
 	for (int pass = 0; pass < tries; pass++) {
 		for (int i = 0; i < sz; i++) {
-			fib4_lookup(RT_DEFAULT_FIB, a[i], 0, NHR_NONE, 0);
+			fib4_lookup(fibnum, a[i], 0, NHR_NONE, 0);
 			count++;
 		}
 	}
@@ -199,11 +199,12 @@ run_test_inet(SYSCTL_HANDLER_ARGS)
 	struct timespec ts_pre, ts_post;
 	int64_t pass_diff, total_diff = 0;
 	uint64_t pass_packets, total_packets = 0;
+	uint32_t fibnum = curthread->td_proc->p_fibnum;
 
 	for (int pass = 0; pass < count / CHUNK_SIZE; pass++) {
 		NET_EPOCH_ENTER(et);
 		nanouptime(&ts_pre);
-		pass_packets = run_test_inet_one_pass();
+		pass_packets = run_test_inet_one_pass(fibnum);
 		nanouptime(&ts_post);
 		NET_EPOCH_EXIT(et);
 
@@ -223,7 +224,7 @@ SYSCTL_PROC(_net_route_test, OID_AUTO, run_inet,
     0, 0, run_test_inet, "I", "Execute fib4_lookup test");
 
 static uint64_t
-run_test_inet6_one_pass()
+run_test_inet6_one_pass(uint32_t fibnum)
 {
 	/* Assume epoch */
 	int sz = V_inet6_list_size;
@@ -233,7 +234,7 @@ run_test_inet6_one_pass()
 
 	for (int pass = 0; pass < tries; pass++) {
 		for (int i = 0; i < sz; i++) {
-			fib6_lookup(RT_DEFAULT_FIB, &a[i], 0, NHR_NONE, 0);
+			fib6_lookup(fibnum, &a[i], 0, NHR_NONE, 0);
 			count++;
 		}
 	}
@@ -263,11 +264,12 @@ run_test_inet6(SYSCTL_HANDLER_ARGS)
 	struct timespec ts_pre, ts_post;
 	int64_t pass_diff, total_diff = 0;
 	uint64_t pass_packets, total_packets = 0;
+	uint32_t fibnum = curthread->td_proc->p_fibnum;
 
 	for (int pass = 0; pass < count / CHUNK_SIZE; pass++) {
 		NET_EPOCH_ENTER(et);
 		nanouptime(&ts_pre);
-		pass_packets = run_test_inet6_one_pass();
+		pass_packets = run_test_inet6_one_pass(fibnum);
 		nanouptime(&ts_post);
 		NET_EPOCH_EXIT(et);
 
@@ -325,7 +327,7 @@ cmp_dst(uint32_t fibnum, struct in_addr a)
 
 /* Random lookups: correctness verification */
 static uint64_t
-run_test_inet_one_pass_random()
+run_test_inet_one_pass_random(uint32_t fibnum)
 {
 	/* Assume epoch */
 	struct in_addr a[64];
@@ -335,7 +337,7 @@ run_test_inet_one_pass_random()
 	for (int pass = 0; pass < CHUNK_SIZE / sz; pass++) {
 		arc4random_buf(a, sizeof(a));
 		for (int i = 0; i < sz; i++) {
-			if (!cmp_dst(RT_DEFAULT_FIB, a[i]))
+			if (!cmp_dst(fibnum, a[i]))
 				return (0);
 			count++;
 		}
@@ -362,11 +364,12 @@ run_test_inet_random(SYSCTL_HANDLER_ARGS)
 	struct timespec ts_pre, ts_post;
 	int64_t pass_diff, total_diff = 1;
 	uint64_t pass_packets, total_packets = 0;
+	uint32_t fibnum = curthread->td_proc->p_fibnum;
 
 	for (int pass = 0; pass < count / CHUNK_SIZE; pass++) {
 		NET_EPOCH_ENTER(et);
 		nanouptime(&ts_pre);
-		pass_packets = run_test_inet_one_pass_random();
+		pass_packets = run_test_inet_one_pass_random(fibnum);
 		nanouptime(&ts_post);
 		NET_EPOCH_EXIT(et);
 
@@ -396,8 +399,9 @@ SYSCTL_PROC(_net_route_test, OID_AUTO, run_inet_random,
 struct inet_array {
 	uint32_t alloc_items;
 	uint32_t num_items;
-	struct in_addr *arr;
+	uint32_t rnh_prefixes;
 	int error;
+	struct in_addr *arr;
 };
 
 /*
@@ -412,9 +416,11 @@ add_prefix(struct rtentry *rt, void *_data)
 	int plen;
 	uint32_t scopeid, haddr;
 
+	pa->rnh_prefixes++;
+
 	if (pa->num_items + 5 >= pa->alloc_items) {
 		if (pa->error == 0)
-			pa->error = EINVAL;
+			pa->error = ENOSPC;
 		return (0);
 	}
 
@@ -442,13 +448,18 @@ prepare_list(uint32_t fibnum, struct inet_array *pa)
 
 	rh = rt_tables_get_rnh(fibnum, AF_INET);
 
-	uint32_t num_prefixes = (rh->rnh_prefixes + 10) * 5;
+	uint32_t num_prefixes = rh->rnh_prefixes;
 	bzero(pa, sizeof(struct inet_array));
-	pa->alloc_items = num_prefixes;
-	pa->arr = mallocarray(num_prefixes, sizeof(struct in_addr),
+	pa->alloc_items = (num_prefixes + 10) * 5;
+	pa->arr = mallocarray(pa->alloc_items, sizeof(struct in_addr),
 	    M_TEMP, M_ZERO | M_WAITOK);
 
-	rib_walk(RT_DEFAULT_FIB, AF_INET, false, add_prefix, pa);
+	rib_walk(fibnum, AF_INET, false, add_prefix, pa);
+
+	if (pa->error != 0) {
+		printf("prefixes: old: %u, current: %u, walked: %u, allocated: %u\n",
+		    num_prefixes, rh->rnh_prefixes, pa->rnh_prefixes, pa->alloc_items);
+	}
 
 	return (pa->error == 0);
 }
@@ -467,20 +478,21 @@ run_test_inet_scan(SYSCTL_HANDLER_ARGS)
 		return (0);
 
 	struct inet_array pa = {};
+	uint32_t fibnum = curthread->td_proc->p_fibnum;
 
-	if (!prepare_list(RT_DEFAULT_FIB, &pa))
+	if (!prepare_list(fibnum, &pa))
 		return (pa.error);
 
 	struct timespec ts_pre, ts_post;
 	int64_t total_diff = 1;
 	uint64_t total_packets = 0;
+	int failure_count = 0;
 
 	NET_EPOCH_ENTER(et);
 	nanouptime(&ts_pre);
 	for (int i = 0; i < pa.num_items; i++) {
-		if (!cmp_dst(RT_DEFAULT_FIB, pa.arr[i])) {
-			error = EINVAL;
-			break;
+		if (!cmp_dst(fibnum, pa.arr[i])) {
+			failure_count++;
 		}
 		total_packets++;
 	}
@@ -491,8 +503,10 @@ run_test_inet_scan(SYSCTL_HANDLER_ARGS)
 		free(pa.arr, M_TEMP);
 
 	/* Signal error to userland */
-	if (error != 0)
-		return (error);
+	if (failure_count > 0) {
+		printf("[RT ERROR] total failures: %d\n", failure_count);
+		return (EINVAL);
+	}
 
 	total_diff = (ts_post.tv_sec - ts_pre.tv_sec) * 1000000000 +
 	    (ts_post.tv_nsec - ts_pre.tv_nsec);
@@ -540,7 +554,7 @@ rnd_lps(SYSCTL_HANDLER_ARGS)
 	struct timespec ts_pre, ts_post;
 	struct nhop_object *nh_fib;
 	uint64_t total_diff, lps;
-	uint32_t *keys;
+	uint32_t *keys, fibnum;
 	uint32_t t, p;
 	uintptr_t acc = 0;
 	int i, pos, count = 0;
@@ -552,6 +566,7 @@ rnd_lps(SYSCTL_HANDLER_ARGS)
 		return (error);
 	if (count <= 0)
 		return (0);
+	fibnum = curthread->td_proc->p_fibnum;
 
 	keys = malloc(sizeof(*keys) * count, M_TEMP, M_NOWAIT);
 	if (keys == NULL)
@@ -564,7 +579,7 @@ rnd_lps(SYSCTL_HANDLER_ARGS)
 		wa.lim = count;
 		printf("Reducing keys to announced address space...\n");
 		do {
-			rib_walk(RT_DEFAULT_FIB, AF_INET, false, reduce_keys,
+			rib_walk(fibnum, AF_INET, false, reduce_keys,
 			    &wa);
 		} while (wa.pos < wa.lim);
 		printf("Reshuffling keys...\n");
@@ -593,7 +608,7 @@ rnd_lps(SYSCTL_HANDLER_ARGS)
 	nanouptime(&ts_pre);
 	for (i = 0, pos = 0; i < count; i++) {
 		key.s_addr = keys[pos++] ^ ((acc >> 10) & 0xff);
-		nh_fib = fib4_lookup(RT_DEFAULT_FIB, key, 0, NHR_NONE, 0);
+		nh_fib = fib4_lookup(fibnum, key, 0, NHR_NONE, 0);
 		if (seq) {
 			if (nh_fib != NULL) {
 				acc += (uintptr_t) nh_fib + 123;


More information about the dev-commits-src-all mailing list