xref: /dpdk/app/test/test_hash_readwrite_lf_perf.c (revision f81cdd729bdfd362ab834d4b3efe78f5ec06b56a)
12cc1d7b4SHonnappa Nagarahalli /* SPDX-License-Identifier: BSD-3-Clause
22cc1d7b4SHonnappa Nagarahalli  * Copyright(c) 2018 Arm Limited
32cc1d7b4SHonnappa Nagarahalli  */
42cc1d7b4SHonnappa Nagarahalli 
52cc1d7b4SHonnappa Nagarahalli #include <inttypes.h>
62cc1d7b4SHonnappa Nagarahalli #include <locale.h>
72cc1d7b4SHonnappa Nagarahalli 
82cc1d7b4SHonnappa Nagarahalli #include <rte_cycles.h>
92cc1d7b4SHonnappa Nagarahalli #include <rte_hash.h>
102cc1d7b4SHonnappa Nagarahalli #include <rte_hash_crc.h>
112cc1d7b4SHonnappa Nagarahalli #include <rte_jhash.h>
122cc1d7b4SHonnappa Nagarahalli #include <rte_launch.h>
132cc1d7b4SHonnappa Nagarahalli #include <rte_malloc.h>
142cc1d7b4SHonnappa Nagarahalli #include <rte_random.h>
152cc1d7b4SHonnappa Nagarahalli #include <rte_spinlock.h>
162cc1d7b4SHonnappa Nagarahalli 
172cc1d7b4SHonnappa Nagarahalli #include "test.h"
182cc1d7b4SHonnappa Nagarahalli 
192cc1d7b4SHonnappa Nagarahalli #ifndef RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY_LF
202cc1d7b4SHonnappa Nagarahalli #define RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY_LF 0
212cc1d7b4SHonnappa Nagarahalli #endif
222cc1d7b4SHonnappa Nagarahalli 
232cc1d7b4SHonnappa Nagarahalli #define BULK_LOOKUP_SIZE 32
242cc1d7b4SHonnappa Nagarahalli 
252cc1d7b4SHonnappa Nagarahalli #define RUN_WITH_HTM_DISABLED 0
262cc1d7b4SHonnappa Nagarahalli 
272cc1d7b4SHonnappa Nagarahalli #if (RUN_WITH_HTM_DISABLED)
282cc1d7b4SHonnappa Nagarahalli 
292cc1d7b4SHonnappa Nagarahalli #define TOTAL_ENTRY (5*1024)
302cc1d7b4SHonnappa Nagarahalli #define TOTAL_INSERT (5*1024)
312cc1d7b4SHonnappa Nagarahalli 
322cc1d7b4SHonnappa Nagarahalli #else
332cc1d7b4SHonnappa Nagarahalli 
342cc1d7b4SHonnappa Nagarahalli #define TOTAL_ENTRY (4*1024*1024)
352cc1d7b4SHonnappa Nagarahalli #define TOTAL_INSERT (4*1024*1024)
362cc1d7b4SHonnappa Nagarahalli 
372cc1d7b4SHonnappa Nagarahalli #endif
382cc1d7b4SHonnappa Nagarahalli 
392cc1d7b4SHonnappa Nagarahalli #define READ_FAIL 1
402cc1d7b4SHonnappa Nagarahalli #define READ_PASS_NO_KEY_SHIFTS 2
412cc1d7b4SHonnappa Nagarahalli #define READ_PASS_SHIFT_PATH 4
422cc1d7b4SHonnappa Nagarahalli #define READ_PASS_NON_SHIFT_PATH 8
432cc1d7b4SHonnappa Nagarahalli #define BULK_LOOKUP 16
442cc1d7b4SHonnappa Nagarahalli #define READ_PASS_KEY_SHIFTS_EXTBKT 32
452cc1d7b4SHonnappa Nagarahalli 
462cc1d7b4SHonnappa Nagarahalli #define WRITE_NO_KEY_SHIFT 0
472cc1d7b4SHonnappa Nagarahalli #define WRITE_KEY_SHIFT 1
482cc1d7b4SHonnappa Nagarahalli #define WRITE_EXT_BKT 2
492cc1d7b4SHonnappa Nagarahalli 
502cc1d7b4SHonnappa Nagarahalli #define NUM_TEST 3
519c7d8eedSDharmik Thakkar 
529c7d8eedSDharmik Thakkar #define QSBR_REPORTING_INTERVAL 1024
539c7d8eedSDharmik Thakkar 
542cc1d7b4SHonnappa Nagarahalli static unsigned int rwc_core_cnt[NUM_TEST] = {1, 2, 4};
552cc1d7b4SHonnappa Nagarahalli 
562cc1d7b4SHonnappa Nagarahalli struct rwc_perf {
572cc1d7b4SHonnappa Nagarahalli 	uint32_t w_no_ks_r_hit[2][NUM_TEST];
582cc1d7b4SHonnappa Nagarahalli 	uint32_t w_no_ks_r_miss[2][NUM_TEST];
592cc1d7b4SHonnappa Nagarahalli 	uint32_t w_ks_r_hit_nsp[2][NUM_TEST];
602cc1d7b4SHonnappa Nagarahalli 	uint32_t w_ks_r_hit_sp[2][NUM_TEST];
612cc1d7b4SHonnappa Nagarahalli 	uint32_t w_ks_r_miss[2][NUM_TEST];
628343fd74SHeinrich Schuchardt 	uint32_t multi_rw[NUM_TEST][2][NUM_TEST];
632cc1d7b4SHonnappa Nagarahalli 	uint32_t w_ks_r_hit_extbkt[2][NUM_TEST];
649c7d8eedSDharmik Thakkar 	uint32_t writer_add_del[NUM_TEST];
652cc1d7b4SHonnappa Nagarahalli };
662cc1d7b4SHonnappa Nagarahalli 
672cc1d7b4SHonnappa Nagarahalli static struct rwc_perf rwc_lf_results, rwc_non_lf_results;
682cc1d7b4SHonnappa Nagarahalli 
692cc1d7b4SHonnappa Nagarahalli static struct {
702cc1d7b4SHonnappa Nagarahalli 	uint32_t *keys;
712cc1d7b4SHonnappa Nagarahalli 	uint32_t *keys_no_ks;
722cc1d7b4SHonnappa Nagarahalli 	uint32_t *keys_ks;
732cc1d7b4SHonnappa Nagarahalli 	uint32_t *keys_absent;
742cc1d7b4SHonnappa Nagarahalli 	uint32_t *keys_shift_path;
752cc1d7b4SHonnappa Nagarahalli 	uint32_t *keys_non_shift_path;
762cc1d7b4SHonnappa Nagarahalli 	uint32_t *keys_ext_bkt;
772cc1d7b4SHonnappa Nagarahalli 	uint32_t *keys_ks_extbkt;
782cc1d7b4SHonnappa Nagarahalli 	uint32_t count_keys_no_ks;
792cc1d7b4SHonnappa Nagarahalli 	uint32_t count_keys_ks;
802cc1d7b4SHonnappa Nagarahalli 	uint32_t count_keys_absent;
812cc1d7b4SHonnappa Nagarahalli 	uint32_t count_keys_shift_path;
822cc1d7b4SHonnappa Nagarahalli 	uint32_t count_keys_non_shift_path;
832cc1d7b4SHonnappa Nagarahalli 	uint32_t count_keys_extbkt;
842cc1d7b4SHonnappa Nagarahalli 	uint32_t count_keys_ks_extbkt;
852cc1d7b4SHonnappa Nagarahalli 	uint32_t single_insert;
862cc1d7b4SHonnappa Nagarahalli 	struct rte_hash *h;
872cc1d7b4SHonnappa Nagarahalli } tbl_rwc_test_param;
882cc1d7b4SHonnappa Nagarahalli 
89b6a7e685STyler Retzlaff static RTE_ATOMIC(uint64_t) gread_cycles;
90b6a7e685STyler Retzlaff static RTE_ATOMIC(uint64_t) greads;
91b6a7e685STyler Retzlaff static RTE_ATOMIC(uint64_t) gwrite_cycles;
92b6a7e685STyler Retzlaff static RTE_ATOMIC(uint64_t) gwrites;
932cc1d7b4SHonnappa Nagarahalli 
942cc1d7b4SHonnappa Nagarahalli static volatile uint8_t writer_done;
952cc1d7b4SHonnappa Nagarahalli 
962cc1d7b4SHonnappa Nagarahalli static uint16_t enabled_core_ids[RTE_MAX_LCORE];
972cc1d7b4SHonnappa Nagarahalli 
982cc1d7b4SHonnappa Nagarahalli static uint8_t *scanned_bkts;
992cc1d7b4SHonnappa Nagarahalli 
1002cc1d7b4SHonnappa Nagarahalli static inline uint16_t
1012cc1d7b4SHonnappa Nagarahalli get_short_sig(const hash_sig_t hash)
1022cc1d7b4SHonnappa Nagarahalli {
1032cc1d7b4SHonnappa Nagarahalli 	return hash >> 16;
1042cc1d7b4SHonnappa Nagarahalli }
1052cc1d7b4SHonnappa Nagarahalli 
1062cc1d7b4SHonnappa Nagarahalli static inline uint32_t
107f2fc83b4SThomas Monjalon get_prim_bucket_index(__rte_unused const struct rte_hash *h,
1082cc1d7b4SHonnappa Nagarahalli 		      const hash_sig_t hash)
1092cc1d7b4SHonnappa Nagarahalli {
1102cc1d7b4SHonnappa Nagarahalli 	uint32_t num_buckets;
1112cc1d7b4SHonnappa Nagarahalli 	uint32_t bucket_bitmask;
1122cc1d7b4SHonnappa Nagarahalli 	num_buckets  = rte_align32pow2(TOTAL_ENTRY) / 8;
1132cc1d7b4SHonnappa Nagarahalli 	bucket_bitmask = num_buckets - 1;
1142cc1d7b4SHonnappa Nagarahalli 	return hash & bucket_bitmask;
1152cc1d7b4SHonnappa Nagarahalli }
1162cc1d7b4SHonnappa Nagarahalli 
1172cc1d7b4SHonnappa Nagarahalli static inline uint32_t
118f2fc83b4SThomas Monjalon get_alt_bucket_index(__rte_unused const struct rte_hash *h,
1192cc1d7b4SHonnappa Nagarahalli 			uint32_t cur_bkt_idx, uint16_t sig)
1202cc1d7b4SHonnappa Nagarahalli {
1212cc1d7b4SHonnappa Nagarahalli 	uint32_t num_buckets;
1222cc1d7b4SHonnappa Nagarahalli 	uint32_t bucket_bitmask;
1232cc1d7b4SHonnappa Nagarahalli 	num_buckets  = rte_align32pow2(TOTAL_ENTRY) / 8;
1242cc1d7b4SHonnappa Nagarahalli 	bucket_bitmask = num_buckets - 1;
1252cc1d7b4SHonnappa Nagarahalli 	return (cur_bkt_idx ^ sig) & bucket_bitmask;
1262cc1d7b4SHonnappa Nagarahalli }
1272cc1d7b4SHonnappa Nagarahalli 
1282cc1d7b4SHonnappa Nagarahalli 
1292cc1d7b4SHonnappa Nagarahalli static inline int
1302cc1d7b4SHonnappa Nagarahalli get_enabled_cores_list(void)
1312cc1d7b4SHonnappa Nagarahalli {
1322cc1d7b4SHonnappa Nagarahalli 	uint32_t i = 0;
1332cc1d7b4SHonnappa Nagarahalli 	uint16_t core_id;
1342cc1d7b4SHonnappa Nagarahalli 	uint32_t max_cores = rte_lcore_count();
1352cc1d7b4SHonnappa Nagarahalli 	RTE_LCORE_FOREACH(core_id) {
1362cc1d7b4SHonnappa Nagarahalli 		enabled_core_ids[i] = core_id;
1372cc1d7b4SHonnappa Nagarahalli 		i++;
1382cc1d7b4SHonnappa Nagarahalli 	}
1392cc1d7b4SHonnappa Nagarahalli 
1402cc1d7b4SHonnappa Nagarahalli 	if (i != max_cores) {
1412cc1d7b4SHonnappa Nagarahalli 		printf("Number of enabled cores in list is different from "
1422cc1d7b4SHonnappa Nagarahalli 			"number given by rte_lcore_count()\n");
1432cc1d7b4SHonnappa Nagarahalli 		return -1;
1442cc1d7b4SHonnappa Nagarahalli 	}
1452cc1d7b4SHonnappa Nagarahalli 	return 0;
1462cc1d7b4SHonnappa Nagarahalli }
1472cc1d7b4SHonnappa Nagarahalli 
1482cc1d7b4SHonnappa Nagarahalli static int
1492cc1d7b4SHonnappa Nagarahalli init_params(int rwc_lf, int use_jhash, int htm, int ext_bkt)
1502cc1d7b4SHonnappa Nagarahalli {
1512cc1d7b4SHonnappa Nagarahalli 	struct rte_hash *handle;
1522cc1d7b4SHonnappa Nagarahalli 
1532cc1d7b4SHonnappa Nagarahalli 	struct rte_hash_parameters hash_params = {
1542cc1d7b4SHonnappa Nagarahalli 		.entries = TOTAL_ENTRY,
1552cc1d7b4SHonnappa Nagarahalli 		.key_len = sizeof(uint32_t),
1562cc1d7b4SHonnappa Nagarahalli 		.hash_func_init_val = 0,
1572cc1d7b4SHonnappa Nagarahalli 		.socket_id = rte_socket_id(),
1582cc1d7b4SHonnappa Nagarahalli 	};
1592cc1d7b4SHonnappa Nagarahalli 
1602cc1d7b4SHonnappa Nagarahalli 	if (use_jhash)
1612cc1d7b4SHonnappa Nagarahalli 		hash_params.hash_func = rte_jhash;
1622cc1d7b4SHonnappa Nagarahalli 	else
1632cc1d7b4SHonnappa Nagarahalli 		hash_params.hash_func = rte_hash_crc;
1642cc1d7b4SHonnappa Nagarahalli 
1652cc1d7b4SHonnappa Nagarahalli 	if (rwc_lf)
1662cc1d7b4SHonnappa Nagarahalli 		hash_params.extra_flag =
1672cc1d7b4SHonnappa Nagarahalli 			RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY_LF |
1682cc1d7b4SHonnappa Nagarahalli 			RTE_HASH_EXTRA_FLAGS_MULTI_WRITER_ADD;
1692cc1d7b4SHonnappa Nagarahalli 	else if (htm)
1702cc1d7b4SHonnappa Nagarahalli 		hash_params.extra_flag =
1712cc1d7b4SHonnappa Nagarahalli 			RTE_HASH_EXTRA_FLAGS_TRANS_MEM_SUPPORT |
1722cc1d7b4SHonnappa Nagarahalli 			RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY |
1732cc1d7b4SHonnappa Nagarahalli 			RTE_HASH_EXTRA_FLAGS_MULTI_WRITER_ADD;
1742cc1d7b4SHonnappa Nagarahalli 	else
1752cc1d7b4SHonnappa Nagarahalli 		hash_params.extra_flag =
1762cc1d7b4SHonnappa Nagarahalli 			RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY |
1772cc1d7b4SHonnappa Nagarahalli 			RTE_HASH_EXTRA_FLAGS_MULTI_WRITER_ADD;
1782cc1d7b4SHonnappa Nagarahalli 
1792cc1d7b4SHonnappa Nagarahalli 	if (ext_bkt)
1802cc1d7b4SHonnappa Nagarahalli 		hash_params.extra_flag |= RTE_HASH_EXTRA_FLAGS_EXT_TABLE;
1812cc1d7b4SHonnappa Nagarahalli 
1822cc1d7b4SHonnappa Nagarahalli 	hash_params.name = "tests";
1832cc1d7b4SHonnappa Nagarahalli 
1842cc1d7b4SHonnappa Nagarahalli 	handle = rte_hash_create(&hash_params);
1852cc1d7b4SHonnappa Nagarahalli 	if (handle == NULL) {
1862cc1d7b4SHonnappa Nagarahalli 		printf("hash creation failed");
1872cc1d7b4SHonnappa Nagarahalli 		return -1;
1882cc1d7b4SHonnappa Nagarahalli 	}
1892cc1d7b4SHonnappa Nagarahalli 
1902cc1d7b4SHonnappa Nagarahalli 	tbl_rwc_test_param.h = handle;
1912cc1d7b4SHonnappa Nagarahalli 	return 0;
1922cc1d7b4SHonnappa Nagarahalli }
1932cc1d7b4SHonnappa Nagarahalli 
1942cc1d7b4SHonnappa Nagarahalli static inline int
1952cc1d7b4SHonnappa Nagarahalli check_bucket(uint32_t bkt_idx, uint32_t key)
1962cc1d7b4SHonnappa Nagarahalli {
1972cc1d7b4SHonnappa Nagarahalli 	uint32_t iter;
1982cc1d7b4SHonnappa Nagarahalli 	uint32_t prev_iter;
1992cc1d7b4SHonnappa Nagarahalli 	uint32_t diff;
2002cc1d7b4SHonnappa Nagarahalli 	uint32_t count = 0;
2012cc1d7b4SHonnappa Nagarahalli 	const void *next_key;
2022cc1d7b4SHonnappa Nagarahalli 	void *next_data;
2032cc1d7b4SHonnappa Nagarahalli 
2042cc1d7b4SHonnappa Nagarahalli 	/* Temporary bucket to hold the keys */
2052cc1d7b4SHonnappa Nagarahalli 	uint32_t keys_in_bkt[8];
2062cc1d7b4SHonnappa Nagarahalli 
2072cc1d7b4SHonnappa Nagarahalli 	iter = bkt_idx * 8;
2082cc1d7b4SHonnappa Nagarahalli 	prev_iter = iter;
2092cc1d7b4SHonnappa Nagarahalli 	while (rte_hash_iterate(tbl_rwc_test_param.h,
2102cc1d7b4SHonnappa Nagarahalli 			&next_key, &next_data, &iter) >= 0) {
2112cc1d7b4SHonnappa Nagarahalli 
2122cc1d7b4SHonnappa Nagarahalli 		/* Check for duplicate entries */
2132cc1d7b4SHonnappa Nagarahalli 		if (*(const uint32_t *)next_key == key)
2142cc1d7b4SHonnappa Nagarahalli 			return 1;
2152cc1d7b4SHonnappa Nagarahalli 
2162cc1d7b4SHonnappa Nagarahalli 		/* Identify if there is any free entry in the bucket */
2172cc1d7b4SHonnappa Nagarahalli 		diff = iter - prev_iter;
2182cc1d7b4SHonnappa Nagarahalli 		if (diff > 1)
2192cc1d7b4SHonnappa Nagarahalli 			break;
2202cc1d7b4SHonnappa Nagarahalli 
2212cc1d7b4SHonnappa Nagarahalli 		prev_iter = iter;
2222cc1d7b4SHonnappa Nagarahalli 		keys_in_bkt[count] = *(const uint32_t *)next_key;
2232cc1d7b4SHonnappa Nagarahalli 		count++;
2242cc1d7b4SHonnappa Nagarahalli 
2252cc1d7b4SHonnappa Nagarahalli 		/* All entries in the bucket are occupied */
2262cc1d7b4SHonnappa Nagarahalli 		if (count == 8) {
2272cc1d7b4SHonnappa Nagarahalli 
2282cc1d7b4SHonnappa Nagarahalli 			/*
2292cc1d7b4SHonnappa Nagarahalli 			 * Check if bucket was not scanned before, to avoid
2302cc1d7b4SHonnappa Nagarahalli 			 * duplicate keys.
2312cc1d7b4SHonnappa Nagarahalli 			 */
2322cc1d7b4SHonnappa Nagarahalli 			if (scanned_bkts[bkt_idx] == 0) {
2332cc1d7b4SHonnappa Nagarahalli 				/*
2342cc1d7b4SHonnappa Nagarahalli 				 * Since this bucket (pointed to by bkt_idx) is
2352cc1d7b4SHonnappa Nagarahalli 				 * full, it is likely that key(s) in this
2362cc1d7b4SHonnappa Nagarahalli 				 * bucket will be on the shift path, when
2372cc1d7b4SHonnappa Nagarahalli 				 * collision occurs. Thus, add it to
2382cc1d7b4SHonnappa Nagarahalli 				 * keys_shift_path.
2392cc1d7b4SHonnappa Nagarahalli 				 */
2402cc1d7b4SHonnappa Nagarahalli 				memcpy(tbl_rwc_test_param.keys_shift_path +
2412cc1d7b4SHonnappa Nagarahalli 					tbl_rwc_test_param.count_keys_shift_path
2422cc1d7b4SHonnappa Nagarahalli 					, keys_in_bkt, 32);
2432cc1d7b4SHonnappa Nagarahalli 				tbl_rwc_test_param.count_keys_shift_path += 8;
2442cc1d7b4SHonnappa Nagarahalli 				scanned_bkts[bkt_idx] = 1;
2452cc1d7b4SHonnappa Nagarahalli 			}
2462cc1d7b4SHonnappa Nagarahalli 			return -1;
2472cc1d7b4SHonnappa Nagarahalli 		}
2482cc1d7b4SHonnappa Nagarahalli 	}
2492cc1d7b4SHonnappa Nagarahalli 	return 0;
2502cc1d7b4SHonnappa Nagarahalli }
2512cc1d7b4SHonnappa Nagarahalli 
2522cc1d7b4SHonnappa Nagarahalli static int
2532cc1d7b4SHonnappa Nagarahalli generate_keys(void)
2542cc1d7b4SHonnappa Nagarahalli {
2552cc1d7b4SHonnappa Nagarahalli 	uint32_t *keys = NULL;
2562cc1d7b4SHonnappa Nagarahalli 	uint32_t *keys_no_ks = NULL;
2572cc1d7b4SHonnappa Nagarahalli 	uint32_t *keys_ks = NULL;
2582cc1d7b4SHonnappa Nagarahalli 	uint32_t *keys_absent = NULL;
2592cc1d7b4SHonnappa Nagarahalli 	uint32_t *keys_non_shift_path = NULL;
2602cc1d7b4SHonnappa Nagarahalli 	uint32_t *keys_ext_bkt = NULL;
2612cc1d7b4SHonnappa Nagarahalli 	uint32_t *keys_ks_extbkt = NULL;
2622cc1d7b4SHonnappa Nagarahalli 	uint32_t *found = NULL;
2632cc1d7b4SHonnappa Nagarahalli 	uint32_t count_keys_no_ks = 0;
2642cc1d7b4SHonnappa Nagarahalli 	uint32_t count_keys_ks = 0;
2652cc1d7b4SHonnappa Nagarahalli 	uint32_t count_keys_extbkt = 0;
2662cc1d7b4SHonnappa Nagarahalli 	uint32_t i;
2672cc1d7b4SHonnappa Nagarahalli 
2682cc1d7b4SHonnappa Nagarahalli 	if (init_params(0, 0, 0, 0) != 0)
2692cc1d7b4SHonnappa Nagarahalli 		return -1;
2702cc1d7b4SHonnappa Nagarahalli 
2712cc1d7b4SHonnappa Nagarahalli 	/*
2722cc1d7b4SHonnappa Nagarahalli 	 * keys will consist of a) keys whose addition to the hash table
2732cc1d7b4SHonnappa Nagarahalli 	 * will result in shifting of the existing keys to their alternate
2742cc1d7b4SHonnappa Nagarahalli 	 * locations b) keys whose addition to the hash table will not result
2752cc1d7b4SHonnappa Nagarahalli 	 * in shifting of the existing keys.
2762cc1d7b4SHonnappa Nagarahalli 	 */
2772cc1d7b4SHonnappa Nagarahalli 	keys = rte_malloc(NULL, sizeof(uint32_t) * TOTAL_INSERT, 0);
2782cc1d7b4SHonnappa Nagarahalli 	if (keys == NULL) {
2792cc1d7b4SHonnappa Nagarahalli 		printf("RTE_MALLOC failed\n");
2802cc1d7b4SHonnappa Nagarahalli 		goto err;
2812cc1d7b4SHonnappa Nagarahalli 	}
2822cc1d7b4SHonnappa Nagarahalli 
2832cc1d7b4SHonnappa Nagarahalli 	/*
2842cc1d7b4SHonnappa Nagarahalli 	 * keys_no_ks (no key-shifts): Subset of 'keys' - consists of keys  that
2852cc1d7b4SHonnappa Nagarahalli 	 * will NOT result in shifting of the existing keys to their alternate
2862cc1d7b4SHonnappa Nagarahalli 	 * locations. Roughly around 900K keys.
2872cc1d7b4SHonnappa Nagarahalli 	 */
2882cc1d7b4SHonnappa Nagarahalli 	keys_no_ks = rte_malloc(NULL, sizeof(uint32_t) * TOTAL_INSERT, 0);
2892cc1d7b4SHonnappa Nagarahalli 	if (keys_no_ks == NULL) {
2902cc1d7b4SHonnappa Nagarahalli 		printf("RTE_MALLOC failed\n");
2912cc1d7b4SHonnappa Nagarahalli 		goto err;
2922cc1d7b4SHonnappa Nagarahalli 	}
2932cc1d7b4SHonnappa Nagarahalli 
2942cc1d7b4SHonnappa Nagarahalli 	/*
2952cc1d7b4SHonnappa Nagarahalli 	 * keys_ks (key-shifts): Subset of 'keys' - consists of keys that will
2962cc1d7b4SHonnappa Nagarahalli 	 * result in shifting of the existing keys to their alternate locations.
2972cc1d7b4SHonnappa Nagarahalli 	 * Roughly around 146K keys. There might be repeating keys. More code is
2982cc1d7b4SHonnappa Nagarahalli 	 * required to filter out these keys which will complicate the test case
2992cc1d7b4SHonnappa Nagarahalli 	 */
3002cc1d7b4SHonnappa Nagarahalli 	keys_ks = rte_malloc(NULL, sizeof(uint32_t) * TOTAL_INSERT, 0);
3012cc1d7b4SHonnappa Nagarahalli 	if (keys_ks == NULL) {
3022cc1d7b4SHonnappa Nagarahalli 		printf("RTE_MALLOC failed\n");
3032cc1d7b4SHonnappa Nagarahalli 		goto err;
3042cc1d7b4SHonnappa Nagarahalli 	}
3052cc1d7b4SHonnappa Nagarahalli 
3062cc1d7b4SHonnappa Nagarahalli 	/* Used to identify keys not inserted in the hash table */
3072cc1d7b4SHonnappa Nagarahalli 	found = rte_zmalloc(NULL, sizeof(uint32_t) * TOTAL_INSERT, 0);
3082cc1d7b4SHonnappa Nagarahalli 	if (found == NULL) {
3092cc1d7b4SHonnappa Nagarahalli 		printf("RTE_MALLOC failed\n");
3102cc1d7b4SHonnappa Nagarahalli 		goto err;
3112cc1d7b4SHonnappa Nagarahalli 	}
3122cc1d7b4SHonnappa Nagarahalli 
3132cc1d7b4SHonnappa Nagarahalli 	/*
3142cc1d7b4SHonnappa Nagarahalli 	 * This consist of keys not inserted to the hash table.
3152cc1d7b4SHonnappa Nagarahalli 	 * Used to test perf of lookup on keys that do not exist in the table.
3162cc1d7b4SHonnappa Nagarahalli 	 */
3172cc1d7b4SHonnappa Nagarahalli 	keys_absent = rte_malloc(NULL, sizeof(uint32_t) * TOTAL_INSERT, 0);
3182cc1d7b4SHonnappa Nagarahalli 	if (keys_absent == NULL) {
3192cc1d7b4SHonnappa Nagarahalli 		printf("RTE_MALLOC failed\n");
3202cc1d7b4SHonnappa Nagarahalli 		goto err;
3212cc1d7b4SHonnappa Nagarahalli 	}
3222cc1d7b4SHonnappa Nagarahalli 
3232cc1d7b4SHonnappa Nagarahalli 	/*
3242cc1d7b4SHonnappa Nagarahalli 	 * This consist of keys which are likely to be on the shift
3252cc1d7b4SHonnappa Nagarahalli 	 * path (i.e. being moved to alternate location), when collision occurs
3262cc1d7b4SHonnappa Nagarahalli 	 * on addition of a key to an already full primary bucket.
3272cc1d7b4SHonnappa Nagarahalli 	 * Used to test perf of lookup on keys that are on the shift path.
3282cc1d7b4SHonnappa Nagarahalli 	 */
3292cc1d7b4SHonnappa Nagarahalli 	tbl_rwc_test_param.keys_shift_path = rte_malloc(NULL, sizeof(uint32_t) *
3302cc1d7b4SHonnappa Nagarahalli 							TOTAL_INSERT, 0);
3312cc1d7b4SHonnappa Nagarahalli 	if (tbl_rwc_test_param.keys_shift_path == NULL) {
3322cc1d7b4SHonnappa Nagarahalli 		printf("RTE_MALLOC failed\n");
3332cc1d7b4SHonnappa Nagarahalli 		goto err;
3342cc1d7b4SHonnappa Nagarahalli 	}
3352cc1d7b4SHonnappa Nagarahalli 
3362cc1d7b4SHonnappa Nagarahalli 	/*
3372cc1d7b4SHonnappa Nagarahalli 	 * This consist of keys which are never on the shift
3382cc1d7b4SHonnappa Nagarahalli 	 * path (i.e. being moved to alternate location), when collision occurs
3392cc1d7b4SHonnappa Nagarahalli 	 * on addition of a key to an already full primary bucket.
3402cc1d7b4SHonnappa Nagarahalli 	 * Used to test perf of lookup on keys that are not on the shift path.
3412cc1d7b4SHonnappa Nagarahalli 	 */
3422cc1d7b4SHonnappa Nagarahalli 	keys_non_shift_path = rte_malloc(NULL, sizeof(uint32_t) * TOTAL_INSERT,
3432cc1d7b4SHonnappa Nagarahalli 					 0);
3442cc1d7b4SHonnappa Nagarahalli 	if (keys_non_shift_path == NULL) {
3452cc1d7b4SHonnappa Nagarahalli 		printf("RTE_MALLOC failed\n");
3462cc1d7b4SHonnappa Nagarahalli 		goto err;
3472cc1d7b4SHonnappa Nagarahalli 	}
3482cc1d7b4SHonnappa Nagarahalli 
3492cc1d7b4SHonnappa Nagarahalli 	/*
3502cc1d7b4SHonnappa Nagarahalli 	 * This consist of keys which will be stored in extended buckets
3512cc1d7b4SHonnappa Nagarahalli 	 */
3522cc1d7b4SHonnappa Nagarahalli 	keys_ext_bkt = rte_malloc(NULL, sizeof(uint32_t) * TOTAL_INSERT, 0);
3532cc1d7b4SHonnappa Nagarahalli 	if (keys_ext_bkt == NULL) {
3542cc1d7b4SHonnappa Nagarahalli 		printf("RTE_MALLOC failed\n");
3552cc1d7b4SHonnappa Nagarahalli 		goto err;
3562cc1d7b4SHonnappa Nagarahalli 	}
3572cc1d7b4SHonnappa Nagarahalli 
3582cc1d7b4SHonnappa Nagarahalli 	/*
3592cc1d7b4SHonnappa Nagarahalli 	 * This consist of keys which when deleted causes shifting of keys
3602cc1d7b4SHonnappa Nagarahalli 	 * in extended buckets to respective secondary buckets
3612cc1d7b4SHonnappa Nagarahalli 	 */
3622cc1d7b4SHonnappa Nagarahalli 	keys_ks_extbkt = rte_malloc(NULL, sizeof(uint32_t) * TOTAL_INSERT, 0);
3632cc1d7b4SHonnappa Nagarahalli 	if (keys_ks_extbkt == NULL) {
3642cc1d7b4SHonnappa Nagarahalli 		printf("RTE_MALLOC failed\n");
3652cc1d7b4SHonnappa Nagarahalli 		goto err;
3662cc1d7b4SHonnappa Nagarahalli 	}
3672cc1d7b4SHonnappa Nagarahalli 
3682cc1d7b4SHonnappa Nagarahalli 	hash_sig_t sig;
3692cc1d7b4SHonnappa Nagarahalli 	uint32_t prim_bucket_idx;
3702cc1d7b4SHonnappa Nagarahalli 	uint32_t sec_bucket_idx;
3712cc1d7b4SHonnappa Nagarahalli 	uint16_t short_sig;
3722cc1d7b4SHonnappa Nagarahalli 	uint32_t num_buckets;
3732cc1d7b4SHonnappa Nagarahalli 	num_buckets  = rte_align32pow2(TOTAL_ENTRY) / 8;
3742cc1d7b4SHonnappa Nagarahalli 	int ret;
3752cc1d7b4SHonnappa Nagarahalli 
3762cc1d7b4SHonnappa Nagarahalli 	/*
3772cc1d7b4SHonnappa Nagarahalli 	 * Used to mark bkts in which at least one key was shifted to its
3782cc1d7b4SHonnappa Nagarahalli 	 * alternate location
3792cc1d7b4SHonnappa Nagarahalli 	 */
3802cc1d7b4SHonnappa Nagarahalli 	scanned_bkts = rte_malloc(NULL, sizeof(uint8_t) * num_buckets, 0);
3812cc1d7b4SHonnappa Nagarahalli 	if (scanned_bkts == NULL) {
3822cc1d7b4SHonnappa Nagarahalli 		printf("RTE_MALLOC failed\n");
3832cc1d7b4SHonnappa Nagarahalli 		goto err;
3842cc1d7b4SHonnappa Nagarahalli 	}
3852cc1d7b4SHonnappa Nagarahalli 
3862cc1d7b4SHonnappa Nagarahalli 	tbl_rwc_test_param.keys = keys;
3872cc1d7b4SHonnappa Nagarahalli 	tbl_rwc_test_param.keys_no_ks = keys_no_ks;
3882cc1d7b4SHonnappa Nagarahalli 	tbl_rwc_test_param.keys_ks = keys_ks;
3892cc1d7b4SHonnappa Nagarahalli 	tbl_rwc_test_param.keys_absent = keys_absent;
3902cc1d7b4SHonnappa Nagarahalli 	tbl_rwc_test_param.keys_non_shift_path = keys_non_shift_path;
3912cc1d7b4SHonnappa Nagarahalli 	tbl_rwc_test_param.keys_ext_bkt = keys_ext_bkt;
3922cc1d7b4SHonnappa Nagarahalli 	tbl_rwc_test_param.keys_ks_extbkt = keys_ks_extbkt;
3932cc1d7b4SHonnappa Nagarahalli 	/* Generate keys by adding previous two keys, neglect overflow */
3942cc1d7b4SHonnappa Nagarahalli 	printf("Generating keys...\n");
3952cc1d7b4SHonnappa Nagarahalli 	keys[0] = 0;
3962cc1d7b4SHonnappa Nagarahalli 	keys[1] = 1;
3972cc1d7b4SHonnappa Nagarahalli 	for (i = 2; i < TOTAL_INSERT; i++)
3982cc1d7b4SHonnappa Nagarahalli 		keys[i] = keys[i-1] + keys[i-2];
3992cc1d7b4SHonnappa Nagarahalli 
400*f81cdd72SStephen Hemminger 	/* Separate keys into keys_no_ks and keys_ks */
4012cc1d7b4SHonnappa Nagarahalli 	for (i = 0; i < TOTAL_INSERT; i++) {
4022cc1d7b4SHonnappa Nagarahalli 		/* Check if primary bucket has space.*/
4032cc1d7b4SHonnappa Nagarahalli 		sig = rte_hash_hash(tbl_rwc_test_param.h,
4042cc1d7b4SHonnappa Nagarahalli 					tbl_rwc_test_param.keys+i);
4052cc1d7b4SHonnappa Nagarahalli 		prim_bucket_idx = get_prim_bucket_index(tbl_rwc_test_param.h,
4062cc1d7b4SHonnappa Nagarahalli 							sig);
4072cc1d7b4SHonnappa Nagarahalli 		ret = check_bucket(prim_bucket_idx, keys[i]);
4082cc1d7b4SHonnappa Nagarahalli 		if (ret < 0) {
4092cc1d7b4SHonnappa Nagarahalli 			/*
4102cc1d7b4SHonnappa Nagarahalli 			 * Primary bucket is full, this key will result in
4112cc1d7b4SHonnappa Nagarahalli 			 * shifting of the keys to their alternate locations.
4122cc1d7b4SHonnappa Nagarahalli 			 */
4132cc1d7b4SHonnappa Nagarahalli 			keys_ks[count_keys_ks] = keys[i];
4142cc1d7b4SHonnappa Nagarahalli 			count_keys_ks++;
4152cc1d7b4SHonnappa Nagarahalli 		} else if (ret == 0) {
4162cc1d7b4SHonnappa Nagarahalli 			/*
4172cc1d7b4SHonnappa Nagarahalli 			 * Primary bucket has space, this key will not result in
4182cc1d7b4SHonnappa Nagarahalli 			 * shifting of the keys. Hence, add key to the table.
4192cc1d7b4SHonnappa Nagarahalli 			 */
4202cc1d7b4SHonnappa Nagarahalli 			ret = rte_hash_add_key_data(tbl_rwc_test_param.h,
4212cc1d7b4SHonnappa Nagarahalli 							keys+i,
4222cc1d7b4SHonnappa Nagarahalli 							(void *)((uintptr_t)i));
4232cc1d7b4SHonnappa Nagarahalli 			if (ret < 0) {
4242cc1d7b4SHonnappa Nagarahalli 				printf("writer failed %"PRIu32"\n", i);
4252cc1d7b4SHonnappa Nagarahalli 				break;
4262cc1d7b4SHonnappa Nagarahalli 			}
4272cc1d7b4SHonnappa Nagarahalli 			keys_no_ks[count_keys_no_ks] = keys[i];
4282cc1d7b4SHonnappa Nagarahalli 			count_keys_no_ks++;
4292cc1d7b4SHonnappa Nagarahalli 		}
4302cc1d7b4SHonnappa Nagarahalli 	}
4312cc1d7b4SHonnappa Nagarahalli 
4322cc1d7b4SHonnappa Nagarahalli 	for (i = 0; i < count_keys_no_ks; i++) {
4332cc1d7b4SHonnappa Nagarahalli 		/*
4342cc1d7b4SHonnappa Nagarahalli 		 * Identify keys in keys_no_ks with value less than
4352cc1d7b4SHonnappa Nagarahalli 		 * 4M (HTM enabled) OR 5K (HTM disabled)
4362cc1d7b4SHonnappa Nagarahalli 		 */
4372cc1d7b4SHonnappa Nagarahalli 		if (keys_no_ks[i] < TOTAL_INSERT)
4382cc1d7b4SHonnappa Nagarahalli 			found[keys_no_ks[i]]++;
4392cc1d7b4SHonnappa Nagarahalli 	}
4402cc1d7b4SHonnappa Nagarahalli 
4412cc1d7b4SHonnappa Nagarahalli 	for (i = 0; i < count_keys_ks; i++) {
4422cc1d7b4SHonnappa Nagarahalli 		/*
4432cc1d7b4SHonnappa Nagarahalli 		 * Identify keys in keys_ks with value less than
4442cc1d7b4SHonnappa Nagarahalli 		 * 4M (HTM enabled) OR 5K (HTM disabled)
4452cc1d7b4SHonnappa Nagarahalli 		 */
4462cc1d7b4SHonnappa Nagarahalli 		if (keys_ks[i] < TOTAL_INSERT)
4472cc1d7b4SHonnappa Nagarahalli 			found[keys_ks[i]]++;
4482cc1d7b4SHonnappa Nagarahalli 	}
4492cc1d7b4SHonnappa Nagarahalli 
4502cc1d7b4SHonnappa Nagarahalli 	uint32_t count_keys_absent = 0;
4512cc1d7b4SHonnappa Nagarahalli 	for (i = 0; i < TOTAL_INSERT; i++) {
4522cc1d7b4SHonnappa Nagarahalli 		/*
4532cc1d7b4SHonnappa Nagarahalli 		 * Identify missing keys between 0 and
4542cc1d7b4SHonnappa Nagarahalli 		 * 4M (HTM enabled) OR 5K (HTM disabled)
4552cc1d7b4SHonnappa Nagarahalli 		 */
4562cc1d7b4SHonnappa Nagarahalli 		if (found[i] == 0)
4572cc1d7b4SHonnappa Nagarahalli 			keys_absent[count_keys_absent++] = i;
4582cc1d7b4SHonnappa Nagarahalli 	}
4592cc1d7b4SHonnappa Nagarahalli 
4602cc1d7b4SHonnappa Nagarahalli 	/* Find keys that will not be on the shift path */
4612cc1d7b4SHonnappa Nagarahalli 	uint32_t iter;
4622cc1d7b4SHonnappa Nagarahalli 	const void *next_key;
4632cc1d7b4SHonnappa Nagarahalli 	void *next_data;
4642cc1d7b4SHonnappa Nagarahalli 	uint32_t count = 0;
4652cc1d7b4SHonnappa Nagarahalli 	for (i = 0; i < num_buckets; i++) {
4662cc1d7b4SHonnappa Nagarahalli 		/* Check bucket for no keys shifted to alternate locations */
4672cc1d7b4SHonnappa Nagarahalli 		if (scanned_bkts[i] == 0) {
4682cc1d7b4SHonnappa Nagarahalli 			iter = i * 8;
4692cc1d7b4SHonnappa Nagarahalli 			while (rte_hash_iterate(tbl_rwc_test_param.h,
4702cc1d7b4SHonnappa Nagarahalli 				&next_key, &next_data, &iter) >= 0) {
4712cc1d7b4SHonnappa Nagarahalli 
4722cc1d7b4SHonnappa Nagarahalli 				/* Check if key belongs to the current bucket */
4732cc1d7b4SHonnappa Nagarahalli 				if (i >= (iter-1)/8)
4742cc1d7b4SHonnappa Nagarahalli 					keys_non_shift_path[count++]
4752cc1d7b4SHonnappa Nagarahalli 						= *(const uint32_t *)next_key;
4762cc1d7b4SHonnappa Nagarahalli 				else
4772cc1d7b4SHonnappa Nagarahalli 					break;
4782cc1d7b4SHonnappa Nagarahalli 			}
4792cc1d7b4SHonnappa Nagarahalli 		}
4802cc1d7b4SHonnappa Nagarahalli 	}
4812cc1d7b4SHonnappa Nagarahalli 
4822cc1d7b4SHonnappa Nagarahalli 	tbl_rwc_test_param.count_keys_no_ks = count_keys_no_ks;
4832cc1d7b4SHonnappa Nagarahalli 	tbl_rwc_test_param.count_keys_ks = count_keys_ks;
4842cc1d7b4SHonnappa Nagarahalli 	tbl_rwc_test_param.count_keys_absent = count_keys_absent;
4852cc1d7b4SHonnappa Nagarahalli 	tbl_rwc_test_param.count_keys_non_shift_path = count;
4862cc1d7b4SHonnappa Nagarahalli 
4872cc1d7b4SHonnappa Nagarahalli 	memset(scanned_bkts, 0, num_buckets);
4882cc1d7b4SHonnappa Nagarahalli 	count = 0;
4892cc1d7b4SHonnappa Nagarahalli 	/* Find keys that will be in extended buckets */
4902cc1d7b4SHonnappa Nagarahalli 	for (i = 0; i < count_keys_ks; i++) {
4912cc1d7b4SHonnappa Nagarahalli 		ret = rte_hash_add_key(tbl_rwc_test_param.h, keys_ks + i);
4922cc1d7b4SHonnappa Nagarahalli 		if (ret < 0) {
4932cc1d7b4SHonnappa Nagarahalli 			/* Key will be added to ext bkt */
4942cc1d7b4SHonnappa Nagarahalli 			keys_ext_bkt[count_keys_extbkt++] = keys_ks[i];
4952cc1d7b4SHonnappa Nagarahalli 			/* Sec bkt to be added to keys_ks_extbkt */
4962cc1d7b4SHonnappa Nagarahalli 			sig = rte_hash_hash(tbl_rwc_test_param.h,
4972cc1d7b4SHonnappa Nagarahalli 					tbl_rwc_test_param.keys_ks + i);
4982cc1d7b4SHonnappa Nagarahalli 			prim_bucket_idx = get_prim_bucket_index(
4992cc1d7b4SHonnappa Nagarahalli 						tbl_rwc_test_param.h, sig);
5002cc1d7b4SHonnappa Nagarahalli 			short_sig = get_short_sig(sig);
5012cc1d7b4SHonnappa Nagarahalli 			sec_bucket_idx = get_alt_bucket_index(
5022cc1d7b4SHonnappa Nagarahalli 						tbl_rwc_test_param.h,
5032cc1d7b4SHonnappa Nagarahalli 						prim_bucket_idx, short_sig);
5042cc1d7b4SHonnappa Nagarahalli 			if (scanned_bkts[sec_bucket_idx] == 0)
5052cc1d7b4SHonnappa Nagarahalli 				scanned_bkts[sec_bucket_idx] = 1;
5062cc1d7b4SHonnappa Nagarahalli 		}
5072cc1d7b4SHonnappa Nagarahalli 	}
5082cc1d7b4SHonnappa Nagarahalli 
5092cc1d7b4SHonnappa Nagarahalli 	/* Find keys that will shift keys in ext bucket*/
5102cc1d7b4SHonnappa Nagarahalli 	for (i = 0; i < num_buckets; i++) {
5112cc1d7b4SHonnappa Nagarahalli 		if (scanned_bkts[i] == 1) {
5122cc1d7b4SHonnappa Nagarahalli 			iter = i * 8;
5132cc1d7b4SHonnappa Nagarahalli 			while (rte_hash_iterate(tbl_rwc_test_param.h,
5142cc1d7b4SHonnappa Nagarahalli 				&next_key, &next_data, &iter) >= 0) {
5152cc1d7b4SHonnappa Nagarahalli 				/* Check if key belongs to the current bucket */
5162cc1d7b4SHonnappa Nagarahalli 				if (i >= (iter-1)/8)
5172cc1d7b4SHonnappa Nagarahalli 					keys_ks_extbkt[count++]
5182cc1d7b4SHonnappa Nagarahalli 						= *(const uint32_t *)next_key;
5192cc1d7b4SHonnappa Nagarahalli 				else
5202cc1d7b4SHonnappa Nagarahalli 					break;
5212cc1d7b4SHonnappa Nagarahalli 			}
5222cc1d7b4SHonnappa Nagarahalli 		}
5232cc1d7b4SHonnappa Nagarahalli 	}
5242cc1d7b4SHonnappa Nagarahalli 
5252cc1d7b4SHonnappa Nagarahalli 	tbl_rwc_test_param.count_keys_ks_extbkt = count;
5262cc1d7b4SHonnappa Nagarahalli 	tbl_rwc_test_param.count_keys_extbkt = count_keys_extbkt;
5272cc1d7b4SHonnappa Nagarahalli 
5282cc1d7b4SHonnappa Nagarahalli 	printf("\nCount of keys NOT causing shifting of existing keys to "
5292cc1d7b4SHonnappa Nagarahalli 	"alternate location: %d\n", tbl_rwc_test_param.count_keys_no_ks);
5302cc1d7b4SHonnappa Nagarahalli 	printf("\nCount of keys causing shifting of existing keys to alternate "
5312cc1d7b4SHonnappa Nagarahalli 		"locations: %d\n\n", tbl_rwc_test_param.count_keys_ks);
5322cc1d7b4SHonnappa Nagarahalli 	printf("Count of absent keys that will never be added to the hash "
5332cc1d7b4SHonnappa Nagarahalli 		"table: %d\n\n", tbl_rwc_test_param.count_keys_absent);
5342cc1d7b4SHonnappa Nagarahalli 	printf("Count of keys likely to be on the shift path: %d\n\n",
5352cc1d7b4SHonnappa Nagarahalli 	       tbl_rwc_test_param.count_keys_shift_path);
5362cc1d7b4SHonnappa Nagarahalli 	printf("Count of keys not likely to be on the shift path: %d\n\n",
5372cc1d7b4SHonnappa Nagarahalli 	       tbl_rwc_test_param.count_keys_non_shift_path);
5382cc1d7b4SHonnappa Nagarahalli 	printf("Count of keys in extended buckets: %d\n\n",
5392cc1d7b4SHonnappa Nagarahalli 	       tbl_rwc_test_param.count_keys_extbkt);
5402cc1d7b4SHonnappa Nagarahalli 	printf("Count of keys shifting keys in ext buckets: %d\n\n",
5412cc1d7b4SHonnappa Nagarahalli 	       tbl_rwc_test_param.count_keys_ks_extbkt);
5422cc1d7b4SHonnappa Nagarahalli 
5432cc1d7b4SHonnappa Nagarahalli 	rte_free(found);
5442cc1d7b4SHonnappa Nagarahalli 	rte_free(scanned_bkts);
5452cc1d7b4SHonnappa Nagarahalli 	rte_hash_free(tbl_rwc_test_param.h);
5462cc1d7b4SHonnappa Nagarahalli 	return 0;
5472cc1d7b4SHonnappa Nagarahalli 
5482cc1d7b4SHonnappa Nagarahalli err:
5492cc1d7b4SHonnappa Nagarahalli 	rte_free(keys);
5502cc1d7b4SHonnappa Nagarahalli 	rte_free(keys_no_ks);
5512cc1d7b4SHonnappa Nagarahalli 	rte_free(keys_ks);
5522cc1d7b4SHonnappa Nagarahalli 	rte_free(keys_absent);
5532cc1d7b4SHonnappa Nagarahalli 	rte_free(found);
5542cc1d7b4SHonnappa Nagarahalli 	rte_free(tbl_rwc_test_param.keys_shift_path);
5552cc1d7b4SHonnappa Nagarahalli 	rte_free(keys_non_shift_path);
5562cc1d7b4SHonnappa Nagarahalli 	rte_free(keys_ext_bkt);
5572cc1d7b4SHonnappa Nagarahalli 	rte_free(keys_ks_extbkt);
5582cc1d7b4SHonnappa Nagarahalli 	rte_free(scanned_bkts);
5592cc1d7b4SHonnappa Nagarahalli 	rte_hash_free(tbl_rwc_test_param.h);
5602cc1d7b4SHonnappa Nagarahalli 	return -1;
5612cc1d7b4SHonnappa Nagarahalli }
5622cc1d7b4SHonnappa Nagarahalli 
5632cc1d7b4SHonnappa Nagarahalli static int
564f2fc83b4SThomas Monjalon test_rwc_reader(__rte_unused void *arg)
5652cc1d7b4SHonnappa Nagarahalli {
5662cc1d7b4SHonnappa Nagarahalli 	uint32_t i, j;
5672cc1d7b4SHonnappa Nagarahalli 	int ret;
5682cc1d7b4SHonnappa Nagarahalli 	uint64_t begin, cycles;
5692cc1d7b4SHonnappa Nagarahalli 	uint32_t loop_cnt = 0;
5702cc1d7b4SHonnappa Nagarahalli 	uint8_t read_type = (uint8_t)((uintptr_t)arg);
5712cc1d7b4SHonnappa Nagarahalli 	uint32_t read_cnt;
5722cc1d7b4SHonnappa Nagarahalli 	uint32_t *keys;
5732cc1d7b4SHonnappa Nagarahalli 	uint32_t extra_keys;
5742cc1d7b4SHonnappa Nagarahalli 	int32_t pos[BULK_LOOKUP_SIZE];
5752cc1d7b4SHonnappa Nagarahalli 	void *temp_a[BULK_LOOKUP_SIZE];
5762cc1d7b4SHonnappa Nagarahalli 
5772cc1d7b4SHonnappa Nagarahalli 	if (read_type & READ_FAIL) {
5782cc1d7b4SHonnappa Nagarahalli 		keys = tbl_rwc_test_param.keys_absent;
5792cc1d7b4SHonnappa Nagarahalli 		read_cnt = tbl_rwc_test_param.count_keys_absent;
5802cc1d7b4SHonnappa Nagarahalli 	} else if (read_type & READ_PASS_NO_KEY_SHIFTS) {
5812cc1d7b4SHonnappa Nagarahalli 		keys = tbl_rwc_test_param.keys_no_ks;
5822cc1d7b4SHonnappa Nagarahalli 		read_cnt = tbl_rwc_test_param.count_keys_no_ks;
5832cc1d7b4SHonnappa Nagarahalli 	} else if (read_type & READ_PASS_SHIFT_PATH) {
5842cc1d7b4SHonnappa Nagarahalli 		keys = tbl_rwc_test_param.keys_shift_path;
5852cc1d7b4SHonnappa Nagarahalli 		read_cnt = tbl_rwc_test_param.count_keys_shift_path;
5862cc1d7b4SHonnappa Nagarahalli 	} else if (read_type & READ_PASS_KEY_SHIFTS_EXTBKT) {
5872cc1d7b4SHonnappa Nagarahalli 		keys = tbl_rwc_test_param.keys_ext_bkt;
5882cc1d7b4SHonnappa Nagarahalli 		read_cnt = tbl_rwc_test_param.count_keys_extbkt;
5892cc1d7b4SHonnappa Nagarahalli 	} else {
5902cc1d7b4SHonnappa Nagarahalli 		keys = tbl_rwc_test_param.keys_non_shift_path;
5912cc1d7b4SHonnappa Nagarahalli 		read_cnt = tbl_rwc_test_param.count_keys_non_shift_path;
5922cc1d7b4SHonnappa Nagarahalli 	}
5932cc1d7b4SHonnappa Nagarahalli 
5942cc1d7b4SHonnappa Nagarahalli 	extra_keys = read_cnt & (BULK_LOOKUP_SIZE - 1);
5952cc1d7b4SHonnappa Nagarahalli 
5962cc1d7b4SHonnappa Nagarahalli 	begin = rte_rdtsc_precise();
5972cc1d7b4SHonnappa Nagarahalli 	do {
5982cc1d7b4SHonnappa Nagarahalli 		if (read_type & BULK_LOOKUP) {
5992cc1d7b4SHonnappa Nagarahalli 			for (i = 0; i < (read_cnt - extra_keys);
6002cc1d7b4SHonnappa Nagarahalli 			     i += BULK_LOOKUP_SIZE) {
6012cc1d7b4SHonnappa Nagarahalli 				/* Array of  pointer to the list of keys */
6022cc1d7b4SHonnappa Nagarahalli 				for (j = 0; j < BULK_LOOKUP_SIZE; j++)
6032cc1d7b4SHonnappa Nagarahalli 					temp_a[j] = keys + i + j;
6042cc1d7b4SHonnappa Nagarahalli 				rte_hash_lookup_bulk(tbl_rwc_test_param.h,
6052cc1d7b4SHonnappa Nagarahalli 						   (const void **)
6062cc1d7b4SHonnappa Nagarahalli 						   ((uintptr_t)temp_a),
6072cc1d7b4SHonnappa Nagarahalli 						   BULK_LOOKUP_SIZE, pos);
6082cc1d7b4SHonnappa Nagarahalli 				/* Validate lookup result */
6092cc1d7b4SHonnappa Nagarahalli 				for (j = 0; j < BULK_LOOKUP_SIZE; j++)
6102cc1d7b4SHonnappa Nagarahalli 					if ((read_type & READ_FAIL &&
6112cc1d7b4SHonnappa Nagarahalli 					     pos[j] != -ENOENT) ||
6122cc1d7b4SHonnappa Nagarahalli 					    (!(read_type & READ_FAIL) &&
6132cc1d7b4SHonnappa Nagarahalli 					     pos[j] == -ENOENT)) {
6142cc1d7b4SHonnappa Nagarahalli 						printf("lookup failed!"
6152cc1d7b4SHonnappa Nagarahalli 						       "%"PRIu32"\n",
6162cc1d7b4SHonnappa Nagarahalli 						       keys[i + j]);
6172cc1d7b4SHonnappa Nagarahalli 						return -1;
6182cc1d7b4SHonnappa Nagarahalli 					}
6192cc1d7b4SHonnappa Nagarahalli 			}
6202cc1d7b4SHonnappa Nagarahalli 			for (j = 0; j < extra_keys; j++)
6212cc1d7b4SHonnappa Nagarahalli 				temp_a[j] = keys + i + j;
6222cc1d7b4SHonnappa Nagarahalli 
6232cc1d7b4SHonnappa Nagarahalli 			rte_hash_lookup_bulk(tbl_rwc_test_param.h,
6242cc1d7b4SHonnappa Nagarahalli 					   (const void **)
6252cc1d7b4SHonnappa Nagarahalli 					   ((uintptr_t)temp_a),
6262cc1d7b4SHonnappa Nagarahalli 					   extra_keys, pos);
6272cc1d7b4SHonnappa Nagarahalli 			for (j = 0; j < extra_keys; j++)
6282cc1d7b4SHonnappa Nagarahalli 				if ((read_type & READ_FAIL &&
6292cc1d7b4SHonnappa Nagarahalli 				     pos[j] != -ENOENT) ||
6302cc1d7b4SHonnappa Nagarahalli 				    (!(read_type & READ_FAIL) &&
6312cc1d7b4SHonnappa Nagarahalli 				     pos[j] == -ENOENT)) {
6322cc1d7b4SHonnappa Nagarahalli 					printf("lookup failed! %"PRIu32"\n",
6332cc1d7b4SHonnappa Nagarahalli 					       keys[i + j]);
6342cc1d7b4SHonnappa Nagarahalli 					return -1;
6352cc1d7b4SHonnappa Nagarahalli 				}
6362cc1d7b4SHonnappa Nagarahalli 		} else {
6372cc1d7b4SHonnappa Nagarahalli 			for (i = 0; i < read_cnt; i++) {
6382cc1d7b4SHonnappa Nagarahalli 				ret = rte_hash_lookup
6392cc1d7b4SHonnappa Nagarahalli 					(tbl_rwc_test_param.h, keys + i);
6402cc1d7b4SHonnappa Nagarahalli 				if (((read_type & READ_FAIL) &&
6412cc1d7b4SHonnappa Nagarahalli 				     (ret != -ENOENT)) ||
6422cc1d7b4SHonnappa Nagarahalli 				    (!(read_type & READ_FAIL) &&
6432cc1d7b4SHonnappa Nagarahalli 					ret == -ENOENT)) {
6442cc1d7b4SHonnappa Nagarahalli 					printf("lookup failed! %"PRIu32"\n",
6452cc1d7b4SHonnappa Nagarahalli 					       keys[i]);
6462cc1d7b4SHonnappa Nagarahalli 					return -1;
6472cc1d7b4SHonnappa Nagarahalli 				}
6482cc1d7b4SHonnappa Nagarahalli 			}
6492cc1d7b4SHonnappa Nagarahalli 		}
6502cc1d7b4SHonnappa Nagarahalli 		loop_cnt++;
6512cc1d7b4SHonnappa Nagarahalli 	} while (!writer_done);
6522cc1d7b4SHonnappa Nagarahalli 
6532cc1d7b4SHonnappa Nagarahalli 	cycles = rte_rdtsc_precise() - begin;
654b6a7e685STyler Retzlaff 	rte_atomic_fetch_add_explicit(&gread_cycles, cycles, rte_memory_order_relaxed);
655b6a7e685STyler Retzlaff 	rte_atomic_fetch_add_explicit(&greads, read_cnt*loop_cnt, rte_memory_order_relaxed);
6562cc1d7b4SHonnappa Nagarahalli 	return 0;
6572cc1d7b4SHonnappa Nagarahalli }
6582cc1d7b4SHonnappa Nagarahalli 
6592cc1d7b4SHonnappa Nagarahalli static int
6602cc1d7b4SHonnappa Nagarahalli write_keys(uint8_t write_type)
6612cc1d7b4SHonnappa Nagarahalli {
6622cc1d7b4SHonnappa Nagarahalli 	uint32_t i;
6632cc1d7b4SHonnappa Nagarahalli 	int ret;
6642cc1d7b4SHonnappa Nagarahalli 	uint32_t key_cnt = 0;
6652cc1d7b4SHonnappa Nagarahalli 	uint32_t *keys;
6662cc1d7b4SHonnappa Nagarahalli 	if (write_type == WRITE_KEY_SHIFT) {
6672cc1d7b4SHonnappa Nagarahalli 		key_cnt = tbl_rwc_test_param.count_keys_ks;
6682cc1d7b4SHonnappa Nagarahalli 		keys = tbl_rwc_test_param.keys_ks;
6692cc1d7b4SHonnappa Nagarahalli 	} else if (write_type == WRITE_NO_KEY_SHIFT) {
6702cc1d7b4SHonnappa Nagarahalli 		key_cnt = tbl_rwc_test_param.count_keys_no_ks;
6712cc1d7b4SHonnappa Nagarahalli 		keys = tbl_rwc_test_param.keys_no_ks;
6722cc1d7b4SHonnappa Nagarahalli 	} else if (write_type == WRITE_EXT_BKT) {
6732cc1d7b4SHonnappa Nagarahalli 		key_cnt = tbl_rwc_test_param.count_keys_extbkt;
6742cc1d7b4SHonnappa Nagarahalli 		keys = tbl_rwc_test_param.keys_ext_bkt;
6752cc1d7b4SHonnappa Nagarahalli 	}
6762cc1d7b4SHonnappa Nagarahalli 	for (i = 0; i < key_cnt; i++) {
6772cc1d7b4SHonnappa Nagarahalli 		ret = rte_hash_add_key(tbl_rwc_test_param.h, keys + i);
6782cc1d7b4SHonnappa Nagarahalli 		if ((write_type == WRITE_NO_KEY_SHIFT) && ret < 0) {
6792cc1d7b4SHonnappa Nagarahalli 			printf("writer failed %"PRIu32"\n", i);
6802cc1d7b4SHonnappa Nagarahalli 			return -1;
6812cc1d7b4SHonnappa Nagarahalli 		}
6822cc1d7b4SHonnappa Nagarahalli 	}
6832cc1d7b4SHonnappa Nagarahalli 	return 0;
6842cc1d7b4SHonnappa Nagarahalli }
6852cc1d7b4SHonnappa Nagarahalli 
6862cc1d7b4SHonnappa Nagarahalli static int
687f2fc83b4SThomas Monjalon test_rwc_multi_writer(__rte_unused void *arg)
6882cc1d7b4SHonnappa Nagarahalli {
6892cc1d7b4SHonnappa Nagarahalli 	uint32_t i, offset;
6902cc1d7b4SHonnappa Nagarahalli 	uint32_t pos_core = (uint32_t)((uintptr_t)arg);
6912cc1d7b4SHonnappa Nagarahalli 	offset = pos_core * tbl_rwc_test_param.single_insert;
6922cc1d7b4SHonnappa Nagarahalli 	for (i = offset; i < offset + tbl_rwc_test_param.single_insert; i++)
6932cc1d7b4SHonnappa Nagarahalli 		rte_hash_add_key(tbl_rwc_test_param.h,
6942cc1d7b4SHonnappa Nagarahalli 				 tbl_rwc_test_param.keys_ks + i);
6952cc1d7b4SHonnappa Nagarahalli 	return 0;
6962cc1d7b4SHonnappa Nagarahalli }
6972cc1d7b4SHonnappa Nagarahalli 
6982cc1d7b4SHonnappa Nagarahalli /*
6992cc1d7b4SHonnappa Nagarahalli  * Test lookup perf:
7002cc1d7b4SHonnappa Nagarahalli  * Reader(s) lookup keys present in the table.
7012cc1d7b4SHonnappa Nagarahalli  */
7022cc1d7b4SHonnappa Nagarahalli static int
7032cc1d7b4SHonnappa Nagarahalli test_hash_add_no_ks_lookup_hit(struct rwc_perf *rwc_perf_results, int rwc_lf,
7042cc1d7b4SHonnappa Nagarahalli 				int htm, int ext_bkt)
7052cc1d7b4SHonnappa Nagarahalli {
7062cc1d7b4SHonnappa Nagarahalli 	unsigned int n, m;
7072cc1d7b4SHonnappa Nagarahalli 	uint64_t i;
7082cc1d7b4SHonnappa Nagarahalli 	int use_jhash = 0;
7092cc1d7b4SHonnappa Nagarahalli 	uint8_t write_type = WRITE_NO_KEY_SHIFT;
7102cc1d7b4SHonnappa Nagarahalli 	uint8_t read_type = READ_PASS_NO_KEY_SHIFTS;
7112cc1d7b4SHonnappa Nagarahalli 
7122cc1d7b4SHonnappa Nagarahalli 	if (init_params(rwc_lf, use_jhash, htm, ext_bkt) != 0)
7132cc1d7b4SHonnappa Nagarahalli 		goto err;
7142cc1d7b4SHonnappa Nagarahalli 	printf("\nTest: Hash add - no key-shifts, read - hit\n");
7152cc1d7b4SHonnappa Nagarahalli 	for (m = 0; m < 2; m++) {
7162cc1d7b4SHonnappa Nagarahalli 		if (m == 1) {
7172cc1d7b4SHonnappa Nagarahalli 			printf("\n** With bulk-lookup **\n");
7182cc1d7b4SHonnappa Nagarahalli 			read_type |= BULK_LOOKUP;
7192cc1d7b4SHonnappa Nagarahalli 		}
7202cc1d7b4SHonnappa Nagarahalli 		for (n = 0; n < NUM_TEST; n++) {
7212cc1d7b4SHonnappa Nagarahalli 			unsigned int tot_lcore = rte_lcore_count();
7222cc1d7b4SHonnappa Nagarahalli 			if (tot_lcore < rwc_core_cnt[n] + 1)
7232cc1d7b4SHonnappa Nagarahalli 				goto finish;
7242cc1d7b4SHonnappa Nagarahalli 
7252cc1d7b4SHonnappa Nagarahalli 			printf("\nNumber of readers: %u\n", rwc_core_cnt[n]);
7262cc1d7b4SHonnappa Nagarahalli 
727b6a7e685STyler Retzlaff 			rte_atomic_store_explicit(&greads, 0, rte_memory_order_relaxed);
728b6a7e685STyler Retzlaff 			rte_atomic_store_explicit(&gread_cycles, 0, rte_memory_order_relaxed);
7292cc1d7b4SHonnappa Nagarahalli 
7302cc1d7b4SHonnappa Nagarahalli 			rte_hash_reset(tbl_rwc_test_param.h);
7312cc1d7b4SHonnappa Nagarahalli 			writer_done = 0;
7322cc1d7b4SHonnappa Nagarahalli 			if (write_keys(write_type) < 0)
7332cc1d7b4SHonnappa Nagarahalli 				goto err;
7342cc1d7b4SHonnappa Nagarahalli 			writer_done = 1;
7352cc1d7b4SHonnappa Nagarahalli 			for (i = 1; i <= rwc_core_cnt[n]; i++)
7362cc1d7b4SHonnappa Nagarahalli 				rte_eal_remote_launch(test_rwc_reader,
7372cc1d7b4SHonnappa Nagarahalli 						(void *)(uintptr_t)read_type,
7382cc1d7b4SHonnappa Nagarahalli 							enabled_core_ids[i]);
7392cc1d7b4SHonnappa Nagarahalli 
7402cc1d7b4SHonnappa Nagarahalli 			for (i = 1; i <= rwc_core_cnt[n]; i++)
7412cc1d7b4SHonnappa Nagarahalli 				if (rte_eal_wait_lcore(enabled_core_ids[i]) < 0)
7422cc1d7b4SHonnappa Nagarahalli 					goto err;
7432cc1d7b4SHonnappa Nagarahalli 
7442cc1d7b4SHonnappa Nagarahalli 			unsigned long long cycles_per_lookup =
745b6a7e685STyler Retzlaff 				rte_atomic_load_explicit(&gread_cycles, rte_memory_order_relaxed)
746b6a7e685STyler Retzlaff 				/ rte_atomic_load_explicit(&greads, rte_memory_order_relaxed);
7472cc1d7b4SHonnappa Nagarahalli 			rwc_perf_results->w_no_ks_r_hit[m][n]
7482cc1d7b4SHonnappa Nagarahalli 						= cycles_per_lookup;
7492cc1d7b4SHonnappa Nagarahalli 			printf("Cycles per lookup: %llu\n", cycles_per_lookup);
7502cc1d7b4SHonnappa Nagarahalli 		}
7512cc1d7b4SHonnappa Nagarahalli 	}
7522cc1d7b4SHonnappa Nagarahalli 
7532cc1d7b4SHonnappa Nagarahalli finish:
7542cc1d7b4SHonnappa Nagarahalli 	rte_hash_free(tbl_rwc_test_param.h);
7552cc1d7b4SHonnappa Nagarahalli 	return 0;
7562cc1d7b4SHonnappa Nagarahalli 
7572cc1d7b4SHonnappa Nagarahalli err:
7582cc1d7b4SHonnappa Nagarahalli 	rte_eal_mp_wait_lcore();
7592cc1d7b4SHonnappa Nagarahalli 	rte_hash_free(tbl_rwc_test_param.h);
7602cc1d7b4SHonnappa Nagarahalli 	return -1;
7612cc1d7b4SHonnappa Nagarahalli }
7622cc1d7b4SHonnappa Nagarahalli 
7632cc1d7b4SHonnappa Nagarahalli /*
7642cc1d7b4SHonnappa Nagarahalli  * Test lookup perf:
7652cc1d7b4SHonnappa Nagarahalli  * Reader(s) lookup keys absent in the table while
7662cc1d7b4SHonnappa Nagarahalli  * 'Main' thread adds with no key-shifts.
7672cc1d7b4SHonnappa Nagarahalli  */
7682cc1d7b4SHonnappa Nagarahalli static int
7692cc1d7b4SHonnappa Nagarahalli test_hash_add_no_ks_lookup_miss(struct rwc_perf *rwc_perf_results, int rwc_lf,
7702cc1d7b4SHonnappa Nagarahalli 				int htm, int ext_bkt)
7712cc1d7b4SHonnappa Nagarahalli {
7722cc1d7b4SHonnappa Nagarahalli 	unsigned int n, m;
7732cc1d7b4SHonnappa Nagarahalli 	uint64_t i;
7742cc1d7b4SHonnappa Nagarahalli 	int use_jhash = 0;
7752cc1d7b4SHonnappa Nagarahalli 	uint8_t write_type = WRITE_NO_KEY_SHIFT;
7762cc1d7b4SHonnappa Nagarahalli 	uint8_t read_type = READ_FAIL;
7772cc1d7b4SHonnappa Nagarahalli 	int ret;
7782cc1d7b4SHonnappa Nagarahalli 
7792cc1d7b4SHonnappa Nagarahalli 	if (init_params(rwc_lf, use_jhash, htm, ext_bkt) != 0)
7802cc1d7b4SHonnappa Nagarahalli 		goto err;
7812cc1d7b4SHonnappa Nagarahalli 	printf("\nTest: Hash add - no key-shifts, Hash lookup - miss\n");
7822cc1d7b4SHonnappa Nagarahalli 	for (m = 0; m < 2; m++) {
7832cc1d7b4SHonnappa Nagarahalli 		if (m == 1) {
7842cc1d7b4SHonnappa Nagarahalli 			printf("\n** With bulk-lookup **\n");
7852cc1d7b4SHonnappa Nagarahalli 			read_type |= BULK_LOOKUP;
7862cc1d7b4SHonnappa Nagarahalli 		}
7872cc1d7b4SHonnappa Nagarahalli 		for (n = 0; n < NUM_TEST; n++) {
7882cc1d7b4SHonnappa Nagarahalli 			unsigned int tot_lcore = rte_lcore_count();
7892cc1d7b4SHonnappa Nagarahalli 			if (tot_lcore < rwc_core_cnt[n] + 1)
7902cc1d7b4SHonnappa Nagarahalli 				goto finish;
7912cc1d7b4SHonnappa Nagarahalli 
7922cc1d7b4SHonnappa Nagarahalli 			printf("\nNumber of readers: %u\n", rwc_core_cnt[n]);
7932cc1d7b4SHonnappa Nagarahalli 
794b6a7e685STyler Retzlaff 			rte_atomic_store_explicit(&greads, 0, rte_memory_order_relaxed);
795b6a7e685STyler Retzlaff 			rte_atomic_store_explicit(&gread_cycles, 0, rte_memory_order_relaxed);
7962cc1d7b4SHonnappa Nagarahalli 
7972cc1d7b4SHonnappa Nagarahalli 			rte_hash_reset(tbl_rwc_test_param.h);
7982cc1d7b4SHonnappa Nagarahalli 			writer_done = 0;
7992cc1d7b4SHonnappa Nagarahalli 
8002cc1d7b4SHonnappa Nagarahalli 			for (i = 1; i <= rwc_core_cnt[n]; i++)
8012cc1d7b4SHonnappa Nagarahalli 				rte_eal_remote_launch(test_rwc_reader,
8022cc1d7b4SHonnappa Nagarahalli 						(void *)(uintptr_t)read_type,
8032cc1d7b4SHonnappa Nagarahalli 							enabled_core_ids[i]);
8042cc1d7b4SHonnappa Nagarahalli 			ret = write_keys(write_type);
8052cc1d7b4SHonnappa Nagarahalli 			writer_done = 1;
8062cc1d7b4SHonnappa Nagarahalli 
8072cc1d7b4SHonnappa Nagarahalli 			if (ret < 0)
8082cc1d7b4SHonnappa Nagarahalli 				goto err;
8092cc1d7b4SHonnappa Nagarahalli 			for (i = 1; i <= rwc_core_cnt[n]; i++)
8102cc1d7b4SHonnappa Nagarahalli 				if (rte_eal_wait_lcore(enabled_core_ids[i]) < 0)
8112cc1d7b4SHonnappa Nagarahalli 					goto err;
8122cc1d7b4SHonnappa Nagarahalli 
8132cc1d7b4SHonnappa Nagarahalli 			unsigned long long cycles_per_lookup =
814b6a7e685STyler Retzlaff 				rte_atomic_load_explicit(&gread_cycles, rte_memory_order_relaxed)
815b6a7e685STyler Retzlaff 				/ rte_atomic_load_explicit(&greads, rte_memory_order_relaxed);
8162cc1d7b4SHonnappa Nagarahalli 			rwc_perf_results->w_no_ks_r_miss[m][n]
8172cc1d7b4SHonnappa Nagarahalli 						= cycles_per_lookup;
8182cc1d7b4SHonnappa Nagarahalli 			printf("Cycles per lookup: %llu\n", cycles_per_lookup);
8192cc1d7b4SHonnappa Nagarahalli 		}
8202cc1d7b4SHonnappa Nagarahalli 	}
8212cc1d7b4SHonnappa Nagarahalli 
8222cc1d7b4SHonnappa Nagarahalli finish:
8232cc1d7b4SHonnappa Nagarahalli 	rte_hash_free(tbl_rwc_test_param.h);
8242cc1d7b4SHonnappa Nagarahalli 	return 0;
8252cc1d7b4SHonnappa Nagarahalli 
8262cc1d7b4SHonnappa Nagarahalli err:
8272cc1d7b4SHonnappa Nagarahalli 	rte_eal_mp_wait_lcore();
8282cc1d7b4SHonnappa Nagarahalli 	rte_hash_free(tbl_rwc_test_param.h);
8292cc1d7b4SHonnappa Nagarahalli 	return -1;
8302cc1d7b4SHonnappa Nagarahalli }
8312cc1d7b4SHonnappa Nagarahalli 
8322cc1d7b4SHonnappa Nagarahalli /*
8332cc1d7b4SHonnappa Nagarahalli  * Test lookup perf:
8342cc1d7b4SHonnappa Nagarahalli  * Reader(s) lookup keys present in the table and not likely to be on the
8352cc1d7b4SHonnappa Nagarahalli  * shift path  while 'Main' thread adds keys causing key-shifts.
8362cc1d7b4SHonnappa Nagarahalli  */
8372cc1d7b4SHonnappa Nagarahalli static int
8382cc1d7b4SHonnappa Nagarahalli test_hash_add_ks_lookup_hit_non_sp(struct rwc_perf *rwc_perf_results,
8392cc1d7b4SHonnappa Nagarahalli 				    int rwc_lf, int htm, int ext_bkt)
8402cc1d7b4SHonnappa Nagarahalli {
8412cc1d7b4SHonnappa Nagarahalli 	unsigned int n, m;
8422cc1d7b4SHonnappa Nagarahalli 	uint64_t i;
8432cc1d7b4SHonnappa Nagarahalli 	int use_jhash = 0;
8442cc1d7b4SHonnappa Nagarahalli 	int ret;
8452cc1d7b4SHonnappa Nagarahalli 	uint8_t write_type;
8462cc1d7b4SHonnappa Nagarahalli 	uint8_t read_type = READ_PASS_NON_SHIFT_PATH;
8472cc1d7b4SHonnappa Nagarahalli 
8482cc1d7b4SHonnappa Nagarahalli 	if (init_params(rwc_lf, use_jhash, htm, ext_bkt) != 0)
8492cc1d7b4SHonnappa Nagarahalli 		goto err;
8502cc1d7b4SHonnappa Nagarahalli 	printf("\nTest: Hash add - key shift, Hash lookup - hit"
8512cc1d7b4SHonnappa Nagarahalli 	       " (non-shift-path)\n");
8522cc1d7b4SHonnappa Nagarahalli 	for (m = 0; m < 2; m++) {
8532cc1d7b4SHonnappa Nagarahalli 		if (m == 1) {
8542cc1d7b4SHonnappa Nagarahalli 			printf("\n** With bulk-lookup **\n");
8552cc1d7b4SHonnappa Nagarahalli 			read_type |= BULK_LOOKUP;
8562cc1d7b4SHonnappa Nagarahalli 		}
8572cc1d7b4SHonnappa Nagarahalli 		for (n = 0; n < NUM_TEST; n++) {
8582cc1d7b4SHonnappa Nagarahalli 			unsigned int tot_lcore = rte_lcore_count();
8592cc1d7b4SHonnappa Nagarahalli 			if (tot_lcore < rwc_core_cnt[n] + 1)
8602cc1d7b4SHonnappa Nagarahalli 				goto finish;
8612cc1d7b4SHonnappa Nagarahalli 
8622cc1d7b4SHonnappa Nagarahalli 			printf("\nNumber of readers: %u\n", rwc_core_cnt[n]);
8632cc1d7b4SHonnappa Nagarahalli 
864b6a7e685STyler Retzlaff 			rte_atomic_store_explicit(&greads, 0, rte_memory_order_relaxed);
865b6a7e685STyler Retzlaff 			rte_atomic_store_explicit(&gread_cycles, 0, rte_memory_order_relaxed);
8662cc1d7b4SHonnappa Nagarahalli 
8672cc1d7b4SHonnappa Nagarahalli 			rte_hash_reset(tbl_rwc_test_param.h);
8682cc1d7b4SHonnappa Nagarahalli 			writer_done = 0;
8692cc1d7b4SHonnappa Nagarahalli 			write_type = WRITE_NO_KEY_SHIFT;
8702cc1d7b4SHonnappa Nagarahalli 			if (write_keys(write_type) < 0)
8712cc1d7b4SHonnappa Nagarahalli 				goto err;
8722cc1d7b4SHonnappa Nagarahalli 			for (i = 1; i <= rwc_core_cnt[n]; i++)
8732cc1d7b4SHonnappa Nagarahalli 				rte_eal_remote_launch(test_rwc_reader,
8742cc1d7b4SHonnappa Nagarahalli 						(void *)(uintptr_t)read_type,
8752cc1d7b4SHonnappa Nagarahalli 							enabled_core_ids[i]);
8762cc1d7b4SHonnappa Nagarahalli 			write_type = WRITE_KEY_SHIFT;
8772cc1d7b4SHonnappa Nagarahalli 			ret = write_keys(write_type);
8782cc1d7b4SHonnappa Nagarahalli 			writer_done = 1;
8792cc1d7b4SHonnappa Nagarahalli 
8802cc1d7b4SHonnappa Nagarahalli 			if (ret < 0)
8812cc1d7b4SHonnappa Nagarahalli 				goto err;
8822cc1d7b4SHonnappa Nagarahalli 			for (i = 1; i <= rwc_core_cnt[n]; i++)
8832cc1d7b4SHonnappa Nagarahalli 				if (rte_eal_wait_lcore(enabled_core_ids[i]) < 0)
8842cc1d7b4SHonnappa Nagarahalli 					goto err;
8852cc1d7b4SHonnappa Nagarahalli 
8862cc1d7b4SHonnappa Nagarahalli 			unsigned long long cycles_per_lookup =
887b6a7e685STyler Retzlaff 				rte_atomic_load_explicit(&gread_cycles, rte_memory_order_relaxed)
888b6a7e685STyler Retzlaff 				/ rte_atomic_load_explicit(&greads, rte_memory_order_relaxed);
8892cc1d7b4SHonnappa Nagarahalli 			rwc_perf_results->w_ks_r_hit_nsp[m][n]
8902cc1d7b4SHonnappa Nagarahalli 						= cycles_per_lookup;
8912cc1d7b4SHonnappa Nagarahalli 			printf("Cycles per lookup: %llu\n", cycles_per_lookup);
8922cc1d7b4SHonnappa Nagarahalli 		}
8932cc1d7b4SHonnappa Nagarahalli 	}
8942cc1d7b4SHonnappa Nagarahalli 
8952cc1d7b4SHonnappa Nagarahalli finish:
8962cc1d7b4SHonnappa Nagarahalli 	rte_hash_free(tbl_rwc_test_param.h);
8972cc1d7b4SHonnappa Nagarahalli 	return 0;
8982cc1d7b4SHonnappa Nagarahalli 
8992cc1d7b4SHonnappa Nagarahalli err:
9002cc1d7b4SHonnappa Nagarahalli 	rte_eal_mp_wait_lcore();
9012cc1d7b4SHonnappa Nagarahalli 	rte_hash_free(tbl_rwc_test_param.h);
9022cc1d7b4SHonnappa Nagarahalli 	return -1;
9032cc1d7b4SHonnappa Nagarahalli }
9042cc1d7b4SHonnappa Nagarahalli 
9052cc1d7b4SHonnappa Nagarahalli /*
9062cc1d7b4SHonnappa Nagarahalli  * Test lookup perf:
9072cc1d7b4SHonnappa Nagarahalli  * Reader(s) lookup keys present in the table and likely on the shift-path while
9082cc1d7b4SHonnappa Nagarahalli  * 'Main' thread adds keys causing key-shifts.
9092cc1d7b4SHonnappa Nagarahalli  */
9102cc1d7b4SHonnappa Nagarahalli static int
9112cc1d7b4SHonnappa Nagarahalli test_hash_add_ks_lookup_hit_sp(struct rwc_perf *rwc_perf_results, int rwc_lf,
9122cc1d7b4SHonnappa Nagarahalli 				int htm, int ext_bkt)
9132cc1d7b4SHonnappa Nagarahalli {
9142cc1d7b4SHonnappa Nagarahalli 	unsigned int n, m;
9152cc1d7b4SHonnappa Nagarahalli 	uint64_t i;
9162cc1d7b4SHonnappa Nagarahalli 	int use_jhash = 0;
9172cc1d7b4SHonnappa Nagarahalli 	int ret;
9182cc1d7b4SHonnappa Nagarahalli 	uint8_t write_type;
9192cc1d7b4SHonnappa Nagarahalli 	uint8_t read_type = READ_PASS_SHIFT_PATH;
9202cc1d7b4SHonnappa Nagarahalli 
9212cc1d7b4SHonnappa Nagarahalli 	if (init_params(rwc_lf, use_jhash, htm, ext_bkt) != 0)
9222cc1d7b4SHonnappa Nagarahalli 		goto err;
9232cc1d7b4SHonnappa Nagarahalli 	printf("\nTest: Hash add - key shift, Hash lookup - hit (shift-path)"
9242cc1d7b4SHonnappa Nagarahalli 	       "\n");
9252cc1d7b4SHonnappa Nagarahalli 
9262cc1d7b4SHonnappa Nagarahalli 	for (m = 0; m < 2; m++) {
9272cc1d7b4SHonnappa Nagarahalli 		if (m == 1) {
9282cc1d7b4SHonnappa Nagarahalli 			printf("\n** With bulk-lookup **\n");
9292cc1d7b4SHonnappa Nagarahalli 			read_type |= BULK_LOOKUP;
9302cc1d7b4SHonnappa Nagarahalli 		}
9312cc1d7b4SHonnappa Nagarahalli 		for (n = 0; n < NUM_TEST; n++) {
9322cc1d7b4SHonnappa Nagarahalli 			unsigned int tot_lcore = rte_lcore_count();
9332cc1d7b4SHonnappa Nagarahalli 			if (tot_lcore < rwc_core_cnt[n] + 1)
9342cc1d7b4SHonnappa Nagarahalli 				goto finish;
9352cc1d7b4SHonnappa Nagarahalli 
9362cc1d7b4SHonnappa Nagarahalli 			printf("\nNumber of readers: %u\n", rwc_core_cnt[n]);
9372f14f028SDharmik Thakkar 
938b6a7e685STyler Retzlaff 			rte_atomic_store_explicit(&greads, 0, rte_memory_order_relaxed);
939b6a7e685STyler Retzlaff 			rte_atomic_store_explicit(&gread_cycles, 0, rte_memory_order_relaxed);
9402cc1d7b4SHonnappa Nagarahalli 
9412cc1d7b4SHonnappa Nagarahalli 			rte_hash_reset(tbl_rwc_test_param.h);
9422cc1d7b4SHonnappa Nagarahalli 			writer_done = 0;
9432cc1d7b4SHonnappa Nagarahalli 			write_type = WRITE_NO_KEY_SHIFT;
9442cc1d7b4SHonnappa Nagarahalli 			if (write_keys(write_type) < 0)
9452cc1d7b4SHonnappa Nagarahalli 				goto err;
9462cc1d7b4SHonnappa Nagarahalli 			for (i = 1; i <= rwc_core_cnt[n]; i++)
9472cc1d7b4SHonnappa Nagarahalli 				rte_eal_remote_launch(test_rwc_reader,
9482cc1d7b4SHonnappa Nagarahalli 						(void *)(uintptr_t)read_type,
9492cc1d7b4SHonnappa Nagarahalli 						enabled_core_ids[i]);
9502cc1d7b4SHonnappa Nagarahalli 			write_type = WRITE_KEY_SHIFT;
9512cc1d7b4SHonnappa Nagarahalli 			ret = write_keys(write_type);
9522cc1d7b4SHonnappa Nagarahalli 			writer_done = 1;
9532cc1d7b4SHonnappa Nagarahalli 
9542cc1d7b4SHonnappa Nagarahalli 			if (ret < 0)
9552cc1d7b4SHonnappa Nagarahalli 				goto err;
9562cc1d7b4SHonnappa Nagarahalli 			for (i = 1; i <= rwc_core_cnt[n]; i++)
9572cc1d7b4SHonnappa Nagarahalli 				if (rte_eal_wait_lcore(enabled_core_ids[i]) < 0)
9582cc1d7b4SHonnappa Nagarahalli 					goto err;
9592cc1d7b4SHonnappa Nagarahalli 
9602cc1d7b4SHonnappa Nagarahalli 			unsigned long long cycles_per_lookup =
961b6a7e685STyler Retzlaff 				rte_atomic_load_explicit(&gread_cycles, rte_memory_order_relaxed)
962b6a7e685STyler Retzlaff 				/ rte_atomic_load_explicit(&greads, rte_memory_order_relaxed);
9632cc1d7b4SHonnappa Nagarahalli 			rwc_perf_results->w_ks_r_hit_sp[m][n]
9642cc1d7b4SHonnappa Nagarahalli 						= cycles_per_lookup;
9652cc1d7b4SHonnappa Nagarahalli 			printf("Cycles per lookup: %llu\n", cycles_per_lookup);
9662cc1d7b4SHonnappa Nagarahalli 		}
9672cc1d7b4SHonnappa Nagarahalli 	}
9682cc1d7b4SHonnappa Nagarahalli 
9692cc1d7b4SHonnappa Nagarahalli finish:
9702cc1d7b4SHonnappa Nagarahalli 	rte_hash_free(tbl_rwc_test_param.h);
9712cc1d7b4SHonnappa Nagarahalli 	return 0;
9722cc1d7b4SHonnappa Nagarahalli 
9732cc1d7b4SHonnappa Nagarahalli err:
9742cc1d7b4SHonnappa Nagarahalli 	rte_eal_mp_wait_lcore();
9752cc1d7b4SHonnappa Nagarahalli 	rte_hash_free(tbl_rwc_test_param.h);
9762cc1d7b4SHonnappa Nagarahalli 	return -1;
9772cc1d7b4SHonnappa Nagarahalli }
9782cc1d7b4SHonnappa Nagarahalli 
9792cc1d7b4SHonnappa Nagarahalli /*
9802cc1d7b4SHonnappa Nagarahalli  * Test lookup perf:
9812cc1d7b4SHonnappa Nagarahalli  * Reader(s) lookup keys absent in the table while
9822cc1d7b4SHonnappa Nagarahalli  * 'Main' thread adds keys causing key-shifts.
9832cc1d7b4SHonnappa Nagarahalli  */
9842cc1d7b4SHonnappa Nagarahalli static int
9852cc1d7b4SHonnappa Nagarahalli test_hash_add_ks_lookup_miss(struct rwc_perf *rwc_perf_results, int rwc_lf, int
9862cc1d7b4SHonnappa Nagarahalli 			     htm, int ext_bkt)
9872cc1d7b4SHonnappa Nagarahalli {
9882cc1d7b4SHonnappa Nagarahalli 	unsigned int n, m;
9892cc1d7b4SHonnappa Nagarahalli 	uint64_t i;
9902cc1d7b4SHonnappa Nagarahalli 	int use_jhash = 0;
9912cc1d7b4SHonnappa Nagarahalli 	int ret;
9922cc1d7b4SHonnappa Nagarahalli 	uint8_t write_type;
9932cc1d7b4SHonnappa Nagarahalli 	uint8_t read_type = READ_FAIL;
9942cc1d7b4SHonnappa Nagarahalli 
9952cc1d7b4SHonnappa Nagarahalli 	if (init_params(rwc_lf, use_jhash, htm, ext_bkt) != 0)
9962cc1d7b4SHonnappa Nagarahalli 		goto err;
9972cc1d7b4SHonnappa Nagarahalli 	printf("\nTest: Hash add - key shift, Hash lookup - miss\n");
9982cc1d7b4SHonnappa Nagarahalli 	for (m = 0; m < 2; m++) {
9992cc1d7b4SHonnappa Nagarahalli 		if (m == 1) {
10002cc1d7b4SHonnappa Nagarahalli 			printf("\n** With bulk-lookup **\n");
10012cc1d7b4SHonnappa Nagarahalli 			read_type |= BULK_LOOKUP;
10022cc1d7b4SHonnappa Nagarahalli 		}
10032cc1d7b4SHonnappa Nagarahalli 		for (n = 0; n < NUM_TEST; n++) {
10042cc1d7b4SHonnappa Nagarahalli 			unsigned int tot_lcore = rte_lcore_count();
10052cc1d7b4SHonnappa Nagarahalli 			if (tot_lcore < rwc_core_cnt[n] + 1)
10062cc1d7b4SHonnappa Nagarahalli 				goto finish;
10072cc1d7b4SHonnappa Nagarahalli 
10082cc1d7b4SHonnappa Nagarahalli 			printf("\nNumber of readers: %u\n", rwc_core_cnt[n]);
10092cc1d7b4SHonnappa Nagarahalli 
1010b6a7e685STyler Retzlaff 			rte_atomic_store_explicit(&greads, 0, rte_memory_order_relaxed);
1011b6a7e685STyler Retzlaff 			rte_atomic_store_explicit(&gread_cycles, 0, rte_memory_order_relaxed);
10122cc1d7b4SHonnappa Nagarahalli 
10132cc1d7b4SHonnappa Nagarahalli 			rte_hash_reset(tbl_rwc_test_param.h);
10142cc1d7b4SHonnappa Nagarahalli 			writer_done = 0;
10152cc1d7b4SHonnappa Nagarahalli 			write_type = WRITE_NO_KEY_SHIFT;
10162cc1d7b4SHonnappa Nagarahalli 			if (write_keys(write_type) < 0)
10172cc1d7b4SHonnappa Nagarahalli 				goto err;
10182cc1d7b4SHonnappa Nagarahalli 			for (i = 1; i <= rwc_core_cnt[n]; i++)
10192cc1d7b4SHonnappa Nagarahalli 				rte_eal_remote_launch(test_rwc_reader,
10202cc1d7b4SHonnappa Nagarahalli 						(void *)(uintptr_t)read_type,
10212cc1d7b4SHonnappa Nagarahalli 							enabled_core_ids[i]);
10222cc1d7b4SHonnappa Nagarahalli 			write_type = WRITE_KEY_SHIFT;
10232cc1d7b4SHonnappa Nagarahalli 			ret = write_keys(write_type);
10242cc1d7b4SHonnappa Nagarahalli 			writer_done = 1;
10252cc1d7b4SHonnappa Nagarahalli 
10262cc1d7b4SHonnappa Nagarahalli 			if (ret < 0)
10272cc1d7b4SHonnappa Nagarahalli 				goto err;
10282cc1d7b4SHonnappa Nagarahalli 			for (i = 1; i <= rwc_core_cnt[n]; i++)
10292cc1d7b4SHonnappa Nagarahalli 				if (rte_eal_wait_lcore(enabled_core_ids[i]) < 0)
10302cc1d7b4SHonnappa Nagarahalli 					goto err;
10312cc1d7b4SHonnappa Nagarahalli 
10322cc1d7b4SHonnappa Nagarahalli 			unsigned long long cycles_per_lookup =
1033b6a7e685STyler Retzlaff 				rte_atomic_load_explicit(&gread_cycles, rte_memory_order_relaxed)
1034b6a7e685STyler Retzlaff 				/ rte_atomic_load_explicit(&greads, rte_memory_order_relaxed);
10352cc1d7b4SHonnappa Nagarahalli 			rwc_perf_results->w_ks_r_miss[m][n] = cycles_per_lookup;
10362cc1d7b4SHonnappa Nagarahalli 			printf("Cycles per lookup: %llu\n", cycles_per_lookup);
10372cc1d7b4SHonnappa Nagarahalli 		}
10382cc1d7b4SHonnappa Nagarahalli 	}
10392cc1d7b4SHonnappa Nagarahalli 
10402cc1d7b4SHonnappa Nagarahalli finish:
10412cc1d7b4SHonnappa Nagarahalli 	rte_hash_free(tbl_rwc_test_param.h);
10422cc1d7b4SHonnappa Nagarahalli 	return 0;
10432cc1d7b4SHonnappa Nagarahalli 
10442cc1d7b4SHonnappa Nagarahalli err:
10452cc1d7b4SHonnappa Nagarahalli 	rte_eal_mp_wait_lcore();
10462cc1d7b4SHonnappa Nagarahalli 	rte_hash_free(tbl_rwc_test_param.h);
10472cc1d7b4SHonnappa Nagarahalli 	return -1;
10482cc1d7b4SHonnappa Nagarahalli }
10492cc1d7b4SHonnappa Nagarahalli 
10502cc1d7b4SHonnappa Nagarahalli /*
10512cc1d7b4SHonnappa Nagarahalli  * Test lookup perf for multi-writer:
10522cc1d7b4SHonnappa Nagarahalli  * Reader(s) lookup keys present in the table and likely on the shift-path while
10532cc1d7b4SHonnappa Nagarahalli  * Writers add keys causing key-shiftsi.
10542cc1d7b4SHonnappa Nagarahalli  * Writers are running in parallel, on different data plane cores.
10552cc1d7b4SHonnappa Nagarahalli  */
10562cc1d7b4SHonnappa Nagarahalli static int
10572cc1d7b4SHonnappa Nagarahalli test_hash_multi_add_lookup(struct rwc_perf *rwc_perf_results, int rwc_lf,
10582cc1d7b4SHonnappa Nagarahalli 			   int htm, int ext_bkt)
10592cc1d7b4SHonnappa Nagarahalli {
10602cc1d7b4SHonnappa Nagarahalli 	unsigned int n, m, k;
10612cc1d7b4SHonnappa Nagarahalli 	uint64_t i;
10622cc1d7b4SHonnappa Nagarahalli 	int use_jhash = 0;
10632cc1d7b4SHonnappa Nagarahalli 	uint8_t write_type;
10642cc1d7b4SHonnappa Nagarahalli 	uint8_t read_type = READ_PASS_SHIFT_PATH;
10652cc1d7b4SHonnappa Nagarahalli 
10662cc1d7b4SHonnappa Nagarahalli 	if (init_params(rwc_lf, use_jhash, htm, ext_bkt) != 0)
10672cc1d7b4SHonnappa Nagarahalli 		goto err;
10682cc1d7b4SHonnappa Nagarahalli 	printf("\nTest: Multi-add-lookup\n");
10692cc1d7b4SHonnappa Nagarahalli 	uint8_t pos_core;
10702cc1d7b4SHonnappa Nagarahalli 	for (m = 1; m < NUM_TEST; m++) {
10712cc1d7b4SHonnappa Nagarahalli 		/* Calculate keys added by each writer */
10722cc1d7b4SHonnappa Nagarahalli 		tbl_rwc_test_param.single_insert =
10732cc1d7b4SHonnappa Nagarahalli 			tbl_rwc_test_param.count_keys_ks / rwc_core_cnt[m];
10742cc1d7b4SHonnappa Nagarahalli 		for (k = 0; k < 2; k++) {
10752cc1d7b4SHonnappa Nagarahalli 			if (k == 1) {
10762cc1d7b4SHonnappa Nagarahalli 				printf("\n** With bulk-lookup **\n");
10772cc1d7b4SHonnappa Nagarahalli 				read_type |= BULK_LOOKUP;
10782cc1d7b4SHonnappa Nagarahalli 			}
10792cc1d7b4SHonnappa Nagarahalli 			for (n = 0; n < NUM_TEST; n++) {
10802cc1d7b4SHonnappa Nagarahalli 				unsigned int tot_lcore	= rte_lcore_count();
10812cc1d7b4SHonnappa Nagarahalli 				if (tot_lcore < (rwc_core_cnt[n] +
10822cc1d7b4SHonnappa Nagarahalli 				     rwc_core_cnt[m] + 1))
10832cc1d7b4SHonnappa Nagarahalli 					goto finish;
10842cc1d7b4SHonnappa Nagarahalli 
10852cc1d7b4SHonnappa Nagarahalli 				printf("\nNumber of writers: %u",
10862cc1d7b4SHonnappa Nagarahalli 				       rwc_core_cnt[m]);
10872cc1d7b4SHonnappa Nagarahalli 				printf("\nNumber of readers: %u\n",
10882cc1d7b4SHonnappa Nagarahalli 				       rwc_core_cnt[n]);
10892cc1d7b4SHonnappa Nagarahalli 
1090b6a7e685STyler Retzlaff 				rte_atomic_store_explicit(&greads, 0, rte_memory_order_relaxed);
1091b6a7e685STyler Retzlaff 				rte_atomic_store_explicit(&gread_cycles, 0,
1092b6a7e685STyler Retzlaff 						 rte_memory_order_relaxed);
10932cc1d7b4SHonnappa Nagarahalli 
10942cc1d7b4SHonnappa Nagarahalli 				rte_hash_reset(tbl_rwc_test_param.h);
10952cc1d7b4SHonnappa Nagarahalli 				writer_done = 0;
10962cc1d7b4SHonnappa Nagarahalli 				write_type = WRITE_NO_KEY_SHIFT;
10972cc1d7b4SHonnappa Nagarahalli 				if (write_keys(write_type) < 0)
10982cc1d7b4SHonnappa Nagarahalli 					goto err;
10992cc1d7b4SHonnappa Nagarahalli 
11002cc1d7b4SHonnappa Nagarahalli 				/* Launch reader(s) */
11012cc1d7b4SHonnappa Nagarahalli 				for (i = 1; i <= rwc_core_cnt[n]; i++)
11022cc1d7b4SHonnappa Nagarahalli 					rte_eal_remote_launch(test_rwc_reader,
11032cc1d7b4SHonnappa Nagarahalli 						(void *)(uintptr_t)read_type,
11042cc1d7b4SHonnappa Nagarahalli 						enabled_core_ids[i]);
11052cc1d7b4SHonnappa Nagarahalli 				pos_core = 0;
11062cc1d7b4SHonnappa Nagarahalli 
11072cc1d7b4SHonnappa Nagarahalli 				/* Launch writers */
11082cc1d7b4SHonnappa Nagarahalli 				for (; i <= rwc_core_cnt[m]
11092cc1d7b4SHonnappa Nagarahalli 				     + rwc_core_cnt[n];	i++) {
11102cc1d7b4SHonnappa Nagarahalli 					rte_eal_remote_launch
11112cc1d7b4SHonnappa Nagarahalli 						(test_rwc_multi_writer,
11122cc1d7b4SHonnappa Nagarahalli 						(void *)(uintptr_t)pos_core,
11132cc1d7b4SHonnappa Nagarahalli 						enabled_core_ids[i]);
11142cc1d7b4SHonnappa Nagarahalli 					pos_core++;
11152cc1d7b4SHonnappa Nagarahalli 				}
11162cc1d7b4SHonnappa Nagarahalli 
11172cc1d7b4SHonnappa Nagarahalli 				/* Wait for writers to complete */
11182cc1d7b4SHonnappa Nagarahalli 				for (i = rwc_core_cnt[n] + 1;
11192cc1d7b4SHonnappa Nagarahalli 				     i <= rwc_core_cnt[m] + rwc_core_cnt[n];
11202cc1d7b4SHonnappa Nagarahalli 				     i++)
11212cc1d7b4SHonnappa Nagarahalli 					rte_eal_wait_lcore(enabled_core_ids[i]);
11222cc1d7b4SHonnappa Nagarahalli 
11232cc1d7b4SHonnappa Nagarahalli 				writer_done = 1;
11242cc1d7b4SHonnappa Nagarahalli 
11252cc1d7b4SHonnappa Nagarahalli 				for (i = 1; i <= rwc_core_cnt[n]; i++)
11262cc1d7b4SHonnappa Nagarahalli 					if (rte_eal_wait_lcore(enabled_core_ids[i]) < 0)
11272cc1d7b4SHonnappa Nagarahalli 						goto err;
11282cc1d7b4SHonnappa Nagarahalli 
11292cc1d7b4SHonnappa Nagarahalli 				unsigned long long cycles_per_lookup =
1130b6a7e685STyler Retzlaff 					rte_atomic_load_explicit(&gread_cycles,
1131b6a7e685STyler Retzlaff 							rte_memory_order_relaxed) /
1132b6a7e685STyler Retzlaff 					rte_atomic_load_explicit(&greads,
1133b6a7e685STyler Retzlaff 							  rte_memory_order_relaxed);
11342cc1d7b4SHonnappa Nagarahalli 				rwc_perf_results->multi_rw[m][k][n]
11352cc1d7b4SHonnappa Nagarahalli 					= cycles_per_lookup;
11362cc1d7b4SHonnappa Nagarahalli 				printf("Cycles per lookup: %llu\n",
11372cc1d7b4SHonnappa Nagarahalli 				       cycles_per_lookup);
11382cc1d7b4SHonnappa Nagarahalli 			}
11392cc1d7b4SHonnappa Nagarahalli 		}
11402cc1d7b4SHonnappa Nagarahalli 	}
11412cc1d7b4SHonnappa Nagarahalli 
11422cc1d7b4SHonnappa Nagarahalli finish:
11432cc1d7b4SHonnappa Nagarahalli 	rte_hash_free(tbl_rwc_test_param.h);
11442cc1d7b4SHonnappa Nagarahalli 	return 0;
11452cc1d7b4SHonnappa Nagarahalli 
11462cc1d7b4SHonnappa Nagarahalli err:
11472cc1d7b4SHonnappa Nagarahalli 	rte_eal_mp_wait_lcore();
11482cc1d7b4SHonnappa Nagarahalli 	rte_hash_free(tbl_rwc_test_param.h);
11492cc1d7b4SHonnappa Nagarahalli 	return -1;
11502cc1d7b4SHonnappa Nagarahalli }
11512cc1d7b4SHonnappa Nagarahalli 
11522cc1d7b4SHonnappa Nagarahalli /*
11532cc1d7b4SHonnappa Nagarahalli  * Test lookup perf:
11542cc1d7b4SHonnappa Nagarahalli  * Reader(s) lookup keys present in the extendable bkt.
11552cc1d7b4SHonnappa Nagarahalli  */
11562cc1d7b4SHonnappa Nagarahalli static int
11572cc1d7b4SHonnappa Nagarahalli test_hash_add_ks_lookup_hit_extbkt(struct rwc_perf *rwc_perf_results,
11582cc1d7b4SHonnappa Nagarahalli 				int rwc_lf, int htm, int ext_bkt)
11592cc1d7b4SHonnappa Nagarahalli {
11602cc1d7b4SHonnappa Nagarahalli 	unsigned int n, m;
11612cc1d7b4SHonnappa Nagarahalli 	uint64_t i;
11622cc1d7b4SHonnappa Nagarahalli 	int use_jhash = 0;
11632cc1d7b4SHonnappa Nagarahalli 	uint8_t write_type;
11642cc1d7b4SHonnappa Nagarahalli 	uint8_t read_type = READ_PASS_KEY_SHIFTS_EXTBKT;
11652cc1d7b4SHonnappa Nagarahalli 
11662cc1d7b4SHonnappa Nagarahalli 	if (init_params(rwc_lf, use_jhash, htm, ext_bkt) != 0)
11672cc1d7b4SHonnappa Nagarahalli 		goto err;
11682cc1d7b4SHonnappa Nagarahalli 	printf("\nTest: Hash add - key-shifts, read - hit (ext_bkt)\n");
11692cc1d7b4SHonnappa Nagarahalli 	for (m = 0; m < 2; m++) {
11702cc1d7b4SHonnappa Nagarahalli 		if (m == 1) {
11712cc1d7b4SHonnappa Nagarahalli 			printf("\n** With bulk-lookup **\n");
11722cc1d7b4SHonnappa Nagarahalli 			read_type |= BULK_LOOKUP;
11732cc1d7b4SHonnappa Nagarahalli 		}
11742cc1d7b4SHonnappa Nagarahalli 		for (n = 0; n < NUM_TEST; n++) {
11752cc1d7b4SHonnappa Nagarahalli 			unsigned int tot_lcore = rte_lcore_count();
11762cc1d7b4SHonnappa Nagarahalli 			if (tot_lcore < rwc_core_cnt[n] + 1)
11772cc1d7b4SHonnappa Nagarahalli 				goto finish;
11782cc1d7b4SHonnappa Nagarahalli 
11792cc1d7b4SHonnappa Nagarahalli 			printf("\nNumber of readers: %u\n", rwc_core_cnt[n]);
11802cc1d7b4SHonnappa Nagarahalli 
1181b6a7e685STyler Retzlaff 			rte_atomic_store_explicit(&greads, 0, rte_memory_order_relaxed);
1182b6a7e685STyler Retzlaff 			rte_atomic_store_explicit(&gread_cycles, 0, rte_memory_order_relaxed);
11832cc1d7b4SHonnappa Nagarahalli 
11842cc1d7b4SHonnappa Nagarahalli 			rte_hash_reset(tbl_rwc_test_param.h);
11852cc1d7b4SHonnappa Nagarahalli 			write_type = WRITE_NO_KEY_SHIFT;
11862cc1d7b4SHonnappa Nagarahalli 			if (write_keys(write_type) < 0)
11872cc1d7b4SHonnappa Nagarahalli 				goto err;
11882cc1d7b4SHonnappa Nagarahalli 			write_type = WRITE_KEY_SHIFT;
11892cc1d7b4SHonnappa Nagarahalli 			if (write_keys(write_type) < 0)
11902cc1d7b4SHonnappa Nagarahalli 				goto err;
11912cc1d7b4SHonnappa Nagarahalli 			writer_done = 0;
11922cc1d7b4SHonnappa Nagarahalli 			for (i = 1; i <= rwc_core_cnt[n]; i++)
11932cc1d7b4SHonnappa Nagarahalli 				rte_eal_remote_launch(test_rwc_reader,
11942cc1d7b4SHonnappa Nagarahalli 						(void *)(uintptr_t)read_type,
11952cc1d7b4SHonnappa Nagarahalli 							enabled_core_ids[i]);
11962cc1d7b4SHonnappa Nagarahalli 			for (i = 0; i < tbl_rwc_test_param.count_keys_ks_extbkt;
11972cc1d7b4SHonnappa Nagarahalli 			     i++) {
11982cc1d7b4SHonnappa Nagarahalli 				if (rte_hash_del_key(tbl_rwc_test_param.h,
11992cc1d7b4SHonnappa Nagarahalli 					tbl_rwc_test_param.keys_ks_extbkt + i)
12002cc1d7b4SHonnappa Nagarahalli 							< 0) {
12012cc1d7b4SHonnappa Nagarahalli 					printf("Delete Failed: %u\n",
12022cc1d7b4SHonnappa Nagarahalli 					tbl_rwc_test_param.keys_ks_extbkt[i]);
12032cc1d7b4SHonnappa Nagarahalli 					goto err;
12042cc1d7b4SHonnappa Nagarahalli 				}
12052cc1d7b4SHonnappa Nagarahalli 			}
12062cc1d7b4SHonnappa Nagarahalli 			writer_done = 1;
12072cc1d7b4SHonnappa Nagarahalli 
12082cc1d7b4SHonnappa Nagarahalli 			for (i = 1; i <= rwc_core_cnt[n]; i++)
12092cc1d7b4SHonnappa Nagarahalli 				if (rte_eal_wait_lcore(enabled_core_ids[i]) < 0)
12102cc1d7b4SHonnappa Nagarahalli 					goto err;
12112cc1d7b4SHonnappa Nagarahalli 
12122cc1d7b4SHonnappa Nagarahalli 			unsigned long long cycles_per_lookup =
1213b6a7e685STyler Retzlaff 				rte_atomic_load_explicit(&gread_cycles, rte_memory_order_relaxed)
1214b6a7e685STyler Retzlaff 				/ rte_atomic_load_explicit(&greads, rte_memory_order_relaxed);
12152cc1d7b4SHonnappa Nagarahalli 			rwc_perf_results->w_ks_r_hit_extbkt[m][n]
12162cc1d7b4SHonnappa Nagarahalli 						= cycles_per_lookup;
12172cc1d7b4SHonnappa Nagarahalli 			printf("Cycles per lookup: %llu\n", cycles_per_lookup);
12182cc1d7b4SHonnappa Nagarahalli 		}
12192cc1d7b4SHonnappa Nagarahalli 	}
12202cc1d7b4SHonnappa Nagarahalli 
12212cc1d7b4SHonnappa Nagarahalli finish:
12222cc1d7b4SHonnappa Nagarahalli 	rte_hash_free(tbl_rwc_test_param.h);
12232cc1d7b4SHonnappa Nagarahalli 	return 0;
12242cc1d7b4SHonnappa Nagarahalli 
12252cc1d7b4SHonnappa Nagarahalli err:
12262cc1d7b4SHonnappa Nagarahalli 	rte_eal_mp_wait_lcore();
12272cc1d7b4SHonnappa Nagarahalli 	rte_hash_free(tbl_rwc_test_param.h);
12282cc1d7b4SHonnappa Nagarahalli 	return -1;
12292cc1d7b4SHonnappa Nagarahalli }
12302cc1d7b4SHonnappa Nagarahalli 
12319c7d8eedSDharmik Thakkar static struct rte_rcu_qsbr *rv;
12329c7d8eedSDharmik Thakkar 
12339c7d8eedSDharmik Thakkar /*
12349c7d8eedSDharmik Thakkar  * Reader thread using rte_hash data structure with RCU
12359c7d8eedSDharmik Thakkar  */
12369c7d8eedSDharmik Thakkar static int
12379c7d8eedSDharmik Thakkar test_hash_rcu_qsbr_reader(void *arg)
12389c7d8eedSDharmik Thakkar {
12399c7d8eedSDharmik Thakkar 	unsigned int i, j;
12409c7d8eedSDharmik Thakkar 	uint32_t num_keys = tbl_rwc_test_param.count_keys_no_ks
12419c7d8eedSDharmik Thakkar 				- QSBR_REPORTING_INTERVAL;
12429c7d8eedSDharmik Thakkar 	uint32_t *keys = tbl_rwc_test_param.keys_no_ks;
12439c7d8eedSDharmik Thakkar 	uint32_t lcore_id = rte_lcore_id();
12449c7d8eedSDharmik Thakkar 	RTE_SET_USED(arg);
12459c7d8eedSDharmik Thakkar 
12469c7d8eedSDharmik Thakkar 	(void)rte_rcu_qsbr_thread_register(rv, lcore_id);
12479c7d8eedSDharmik Thakkar 	rte_rcu_qsbr_thread_online(rv, lcore_id);
12489c7d8eedSDharmik Thakkar 	do {
12499c7d8eedSDharmik Thakkar 		for (i = 0; i < num_keys; i += j) {
12509c7d8eedSDharmik Thakkar 			for (j = 0; j < QSBR_REPORTING_INTERVAL; j++)
12519c7d8eedSDharmik Thakkar 				rte_hash_lookup(tbl_rwc_test_param.h,
12529c7d8eedSDharmik Thakkar 						keys + i + j);
12539c7d8eedSDharmik Thakkar 			/* Update quiescent state counter */
12549c7d8eedSDharmik Thakkar 			rte_rcu_qsbr_quiescent(rv, lcore_id);
12559c7d8eedSDharmik Thakkar 		}
12569c7d8eedSDharmik Thakkar 	} while (!writer_done);
12579c7d8eedSDharmik Thakkar 	rte_rcu_qsbr_thread_offline(rv, lcore_id);
12589c7d8eedSDharmik Thakkar 	(void)rte_rcu_qsbr_thread_unregister(rv, lcore_id);
12599c7d8eedSDharmik Thakkar 
12609c7d8eedSDharmik Thakkar 	return 0;
12619c7d8eedSDharmik Thakkar }
12629c7d8eedSDharmik Thakkar 
12639c7d8eedSDharmik Thakkar /*
12649c7d8eedSDharmik Thakkar  * Writer thread using rte_hash data structure with RCU
12659c7d8eedSDharmik Thakkar  */
12669c7d8eedSDharmik Thakkar static int
12679c7d8eedSDharmik Thakkar test_hash_rcu_qsbr_writer(void *arg)
12689c7d8eedSDharmik Thakkar {
12699c7d8eedSDharmik Thakkar 	uint32_t i, offset;
12709c7d8eedSDharmik Thakkar 	uint64_t begin, cycles;
12719c7d8eedSDharmik Thakkar 	uint8_t pos_core = (uint32_t)((uintptr_t)arg);
12729c7d8eedSDharmik Thakkar 	offset = pos_core * tbl_rwc_test_param.single_insert;
12739c7d8eedSDharmik Thakkar 
12749c7d8eedSDharmik Thakkar 	begin = rte_rdtsc_precise();
12759c7d8eedSDharmik Thakkar 	for (i = offset; i < offset + tbl_rwc_test_param.single_insert; i++) {
12769c7d8eedSDharmik Thakkar 		/* Delete element from the shared data structure */
12779c7d8eedSDharmik Thakkar 		rte_hash_del_key(tbl_rwc_test_param.h,
12789c7d8eedSDharmik Thakkar 					tbl_rwc_test_param.keys_no_ks + i);
12799c7d8eedSDharmik Thakkar 		rte_hash_add_key(tbl_rwc_test_param.h,
12809c7d8eedSDharmik Thakkar 				tbl_rwc_test_param.keys_no_ks + i);
12819c7d8eedSDharmik Thakkar 	}
12829c7d8eedSDharmik Thakkar 	cycles = rte_rdtsc_precise() - begin;
1283b6a7e685STyler Retzlaff 	rte_atomic_fetch_add_explicit(&gwrite_cycles, cycles, rte_memory_order_relaxed);
1284b6a7e685STyler Retzlaff 	rte_atomic_fetch_add_explicit(&gwrites, tbl_rwc_test_param.single_insert,
1285b6a7e685STyler Retzlaff 			   rte_memory_order_relaxed);
12869c7d8eedSDharmik Thakkar 	return 0;
12879c7d8eedSDharmik Thakkar }
12889c7d8eedSDharmik Thakkar 
12899c7d8eedSDharmik Thakkar /*
12909c7d8eedSDharmik Thakkar  * Writer perf test with RCU QSBR in DQ mode:
12919c7d8eedSDharmik Thakkar  * Writer(s) delete and add keys in the table.
12929c7d8eedSDharmik Thakkar  * Readers lookup keys in the hash table
12939c7d8eedSDharmik Thakkar  */
12949c7d8eedSDharmik Thakkar static int
12959c7d8eedSDharmik Thakkar test_hash_rcu_qsbr_writer_perf(struct rwc_perf *rwc_perf_results, int rwc_lf,
12969c7d8eedSDharmik Thakkar 				int htm, int ext_bkt)
12979c7d8eedSDharmik Thakkar {
12989c7d8eedSDharmik Thakkar 	unsigned int n;
12999c7d8eedSDharmik Thakkar 	uint64_t i;
13009c7d8eedSDharmik Thakkar 	uint8_t write_type;
13019c7d8eedSDharmik Thakkar 	int use_jhash = 0;
13029c7d8eedSDharmik Thakkar 	struct rte_hash_rcu_config rcu_config = {0};
13039c7d8eedSDharmik Thakkar 	uint32_t sz;
13049c7d8eedSDharmik Thakkar 	uint8_t pos_core;
13059c7d8eedSDharmik Thakkar 
13069c7d8eedSDharmik Thakkar 	printf("\nTest: Writer perf with integrated RCU\n");
13079c7d8eedSDharmik Thakkar 
13089c7d8eedSDharmik Thakkar 	if (init_params(rwc_lf, use_jhash, htm, ext_bkt) != 0)
13099c7d8eedSDharmik Thakkar 		goto err;
13109c7d8eedSDharmik Thakkar 
13119c7d8eedSDharmik Thakkar 	sz = rte_rcu_qsbr_get_memsize(RTE_MAX_LCORE);
13129c7d8eedSDharmik Thakkar 	rv = (struct rte_rcu_qsbr *)rte_zmalloc(NULL, sz, RTE_CACHE_LINE_SIZE);
13139c7d8eedSDharmik Thakkar 	rcu_config.v = rv;
13149c7d8eedSDharmik Thakkar 
13159c7d8eedSDharmik Thakkar 	if (rte_hash_rcu_qsbr_add(tbl_rwc_test_param.h, &rcu_config) < 0) {
13169c7d8eedSDharmik Thakkar 		printf("RCU init in hash failed\n");
13179c7d8eedSDharmik Thakkar 		goto err;
13189c7d8eedSDharmik Thakkar 	}
13199c7d8eedSDharmik Thakkar 
13209c7d8eedSDharmik Thakkar 	for (n = 0; n < NUM_TEST; n++) {
13219c7d8eedSDharmik Thakkar 		unsigned int tot_lcore = rte_lcore_count();
13229c7d8eedSDharmik Thakkar 		if (tot_lcore < rwc_core_cnt[n] + 3)
13239c7d8eedSDharmik Thakkar 			goto finish;
13249c7d8eedSDharmik Thakkar 
13259c7d8eedSDharmik Thakkar 		/* Calculate keys added by each writer */
13269c7d8eedSDharmik Thakkar 		tbl_rwc_test_param.single_insert =
13279c7d8eedSDharmik Thakkar 			tbl_rwc_test_param.count_keys_no_ks /
13289c7d8eedSDharmik Thakkar 				rwc_core_cnt[n];
13299c7d8eedSDharmik Thakkar 		printf("\nNumber of writers: %u\n", rwc_core_cnt[n]);
13309c7d8eedSDharmik Thakkar 
1331b6a7e685STyler Retzlaff 		rte_atomic_store_explicit(&gwrites, 0, rte_memory_order_relaxed);
1332b6a7e685STyler Retzlaff 		rte_atomic_store_explicit(&gwrite_cycles, 0, rte_memory_order_relaxed);
13339c7d8eedSDharmik Thakkar 
13349c7d8eedSDharmik Thakkar 		rte_hash_reset(tbl_rwc_test_param.h);
13359c7d8eedSDharmik Thakkar 		rte_rcu_qsbr_init(rv, RTE_MAX_LCORE);
13369c7d8eedSDharmik Thakkar 
13379c7d8eedSDharmik Thakkar 		write_type = WRITE_NO_KEY_SHIFT;
13389c7d8eedSDharmik Thakkar 		if (write_keys(write_type) < 0)
13399c7d8eedSDharmik Thakkar 			goto err;
13409c7d8eedSDharmik Thakkar 		write_type = WRITE_KEY_SHIFT;
13419c7d8eedSDharmik Thakkar 		if (write_keys(write_type) < 0)
13429c7d8eedSDharmik Thakkar 			goto err;
13439c7d8eedSDharmik Thakkar 
13449c7d8eedSDharmik Thakkar 		/* Launch 2 readers */
13459c7d8eedSDharmik Thakkar 		for (i = 1; i <= 2; i++)
13469c7d8eedSDharmik Thakkar 			rte_eal_remote_launch(test_hash_rcu_qsbr_reader, NULL,
13479c7d8eedSDharmik Thakkar 					      enabled_core_ids[i]);
13489c7d8eedSDharmik Thakkar 		pos_core = 0;
13499c7d8eedSDharmik Thakkar 		/* Launch writer(s) */
13509c7d8eedSDharmik Thakkar 		for (; i <= rwc_core_cnt[n] + 2; i++) {
13519c7d8eedSDharmik Thakkar 			rte_eal_remote_launch(test_hash_rcu_qsbr_writer,
13529c7d8eedSDharmik Thakkar 				(void *)(uintptr_t)pos_core,
13539c7d8eedSDharmik Thakkar 				enabled_core_ids[i]);
13549c7d8eedSDharmik Thakkar 			pos_core++;
13559c7d8eedSDharmik Thakkar 		}
13569c7d8eedSDharmik Thakkar 
13579c7d8eedSDharmik Thakkar 		/* Wait for writers to complete */
13589c7d8eedSDharmik Thakkar 		for (i = 3; i <= rwc_core_cnt[n] + 2; i++)
13599c7d8eedSDharmik Thakkar 			rte_eal_wait_lcore(enabled_core_ids[i]);
13609c7d8eedSDharmik Thakkar 
13619c7d8eedSDharmik Thakkar 		writer_done = 1;
13629c7d8eedSDharmik Thakkar 
13639c7d8eedSDharmik Thakkar 		/* Wait for readers to complete */
13649c7d8eedSDharmik Thakkar 		rte_eal_mp_wait_lcore();
13659c7d8eedSDharmik Thakkar 
13669c7d8eedSDharmik Thakkar 		unsigned long long cycles_per_write_operation =
1367b6a7e685STyler Retzlaff 			rte_atomic_load_explicit(&gwrite_cycles, rte_memory_order_relaxed) /
1368b6a7e685STyler Retzlaff 			rte_atomic_load_explicit(&gwrites, rte_memory_order_relaxed);
13699c7d8eedSDharmik Thakkar 		rwc_perf_results->writer_add_del[n]
13709c7d8eedSDharmik Thakkar 					= cycles_per_write_operation;
13719c7d8eedSDharmik Thakkar 		printf("Cycles per write operation: %llu\n",
13729c7d8eedSDharmik Thakkar 				cycles_per_write_operation);
13739c7d8eedSDharmik Thakkar 	}
13749c7d8eedSDharmik Thakkar 
13759c7d8eedSDharmik Thakkar finish:
13769c7d8eedSDharmik Thakkar 	rte_hash_free(tbl_rwc_test_param.h);
13779c7d8eedSDharmik Thakkar 	rte_free(rv);
13789c7d8eedSDharmik Thakkar 	return 0;
13799c7d8eedSDharmik Thakkar 
13809c7d8eedSDharmik Thakkar err:
13819c7d8eedSDharmik Thakkar 	writer_done = 1;
13829c7d8eedSDharmik Thakkar 	rte_eal_mp_wait_lcore();
13839c7d8eedSDharmik Thakkar 	rte_hash_free(tbl_rwc_test_param.h);
13849c7d8eedSDharmik Thakkar 	rte_free(rv);
13859c7d8eedSDharmik Thakkar 	return -1;
13869c7d8eedSDharmik Thakkar }
13879c7d8eedSDharmik Thakkar 
13882cc1d7b4SHonnappa Nagarahalli static int
13892cc1d7b4SHonnappa Nagarahalli test_hash_readwrite_lf_perf_main(void)
13902cc1d7b4SHonnappa Nagarahalli {
13912cc1d7b4SHonnappa Nagarahalli 	/*
13922cc1d7b4SHonnappa Nagarahalli 	 * Variables used to choose different tests.
13932cc1d7b4SHonnappa Nagarahalli 	 * rwc_lf indicates if read-write concurrency lock-free support is
13942cc1d7b4SHonnappa Nagarahalli 	 * enabled.
13952cc1d7b4SHonnappa Nagarahalli 	 * htm indicates if Hardware transactional memory support is enabled.
13962cc1d7b4SHonnappa Nagarahalli 	 */
13972cc1d7b4SHonnappa Nagarahalli 	int rwc_lf = 0;
13982cc1d7b4SHonnappa Nagarahalli 	int htm;
13992cc1d7b4SHonnappa Nagarahalli 	int ext_bkt = 0;
14002cc1d7b4SHonnappa Nagarahalli 
14012cc1d7b4SHonnappa Nagarahalli 	if (rte_lcore_count() < 2) {
14022cc1d7b4SHonnappa Nagarahalli 		printf("Not enough cores for hash_readwrite_lf_perf_autotest, expecting at least 2\n");
14032cc1d7b4SHonnappa Nagarahalli 		return TEST_SKIPPED;
14042cc1d7b4SHonnappa Nagarahalli 	}
14052cc1d7b4SHonnappa Nagarahalli 
14062cc1d7b4SHonnappa Nagarahalli 	setlocale(LC_NUMERIC, "");
14072cc1d7b4SHonnappa Nagarahalli 
14082cc1d7b4SHonnappa Nagarahalli 	/* Reset tbl_rwc_test_param to discard values from previous run */
14092cc1d7b4SHonnappa Nagarahalli 	memset(&tbl_rwc_test_param, 0, sizeof(tbl_rwc_test_param));
14102cc1d7b4SHonnappa Nagarahalli 
14112cc1d7b4SHonnappa Nagarahalli 	if (rte_tm_supported())
14122cc1d7b4SHonnappa Nagarahalli 		htm = 1;
14132cc1d7b4SHonnappa Nagarahalli 	else
14142cc1d7b4SHonnappa Nagarahalli 		htm = 0;
14152cc1d7b4SHonnappa Nagarahalli 
14162cc1d7b4SHonnappa Nagarahalli 	if (generate_keys() != 0)
14172cc1d7b4SHonnappa Nagarahalli 		return -1;
14182cc1d7b4SHonnappa Nagarahalli 	if (get_enabled_cores_list() != 0)
14192cc1d7b4SHonnappa Nagarahalli 		return -1;
14202cc1d7b4SHonnappa Nagarahalli 
14212cc1d7b4SHonnappa Nagarahalli 	if (RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY_LF) {
14222cc1d7b4SHonnappa Nagarahalli 		rwc_lf = 1;
14232cc1d7b4SHonnappa Nagarahalli 		ext_bkt = 1;
14242cc1d7b4SHonnappa Nagarahalli 		printf("Test lookup with read-write concurrency lock free support"
14252cc1d7b4SHonnappa Nagarahalli 		       " enabled\n");
14262cc1d7b4SHonnappa Nagarahalli 		if (test_hash_add_no_ks_lookup_hit(&rwc_lf_results, rwc_lf,
14272cc1d7b4SHonnappa Nagarahalli 							htm, ext_bkt) < 0)
14282cc1d7b4SHonnappa Nagarahalli 			return -1;
14292cc1d7b4SHonnappa Nagarahalli 		if (test_hash_add_no_ks_lookup_miss(&rwc_lf_results, rwc_lf,
14302cc1d7b4SHonnappa Nagarahalli 							htm, ext_bkt) < 0)
14312cc1d7b4SHonnappa Nagarahalli 			return -1;
14322cc1d7b4SHonnappa Nagarahalli 		if (test_hash_add_ks_lookup_hit_non_sp(&rwc_lf_results, rwc_lf,
14332cc1d7b4SHonnappa Nagarahalli 							htm, ext_bkt) < 0)
14342cc1d7b4SHonnappa Nagarahalli 			return -1;
14352cc1d7b4SHonnappa Nagarahalli 		if (test_hash_add_ks_lookup_hit_sp(&rwc_lf_results, rwc_lf,
14362cc1d7b4SHonnappa Nagarahalli 							htm, ext_bkt) < 0)
14372cc1d7b4SHonnappa Nagarahalli 			return -1;
14382cc1d7b4SHonnappa Nagarahalli 		if (test_hash_add_ks_lookup_miss(&rwc_lf_results, rwc_lf, htm,
14392cc1d7b4SHonnappa Nagarahalli 						 ext_bkt) < 0)
14402cc1d7b4SHonnappa Nagarahalli 			return -1;
14412cc1d7b4SHonnappa Nagarahalli 		if (test_hash_multi_add_lookup(&rwc_lf_results, rwc_lf, htm,
14422cc1d7b4SHonnappa Nagarahalli 					       ext_bkt) < 0)
14432cc1d7b4SHonnappa Nagarahalli 			return -1;
14442cc1d7b4SHonnappa Nagarahalli 		if (test_hash_add_ks_lookup_hit_extbkt(&rwc_lf_results, rwc_lf,
14452cc1d7b4SHonnappa Nagarahalli 							htm, ext_bkt) < 0)
14462cc1d7b4SHonnappa Nagarahalli 			return -1;
14479c7d8eedSDharmik Thakkar 		if (test_hash_rcu_qsbr_writer_perf(&rwc_lf_results, rwc_lf,
14489c7d8eedSDharmik Thakkar 						   htm, ext_bkt) < 0)
14499c7d8eedSDharmik Thakkar 			return -1;
14502cc1d7b4SHonnappa Nagarahalli 	}
14512cc1d7b4SHonnappa Nagarahalli 	printf("\nTest lookup with read-write concurrency lock free support"
14522cc1d7b4SHonnappa Nagarahalli 	       " disabled\n");
14532cc1d7b4SHonnappa Nagarahalli 	rwc_lf = 0;
14542cc1d7b4SHonnappa Nagarahalli 	if (!htm) {
14552cc1d7b4SHonnappa Nagarahalli 		printf("With HTM Disabled\n");
14562cc1d7b4SHonnappa Nagarahalli 		if (!RUN_WITH_HTM_DISABLED) {
14572cc1d7b4SHonnappa Nagarahalli 			printf("Enable RUN_WITH_HTM_DISABLED to test with"
14582cc1d7b4SHonnappa Nagarahalli 			       " lock-free disabled");
14592cc1d7b4SHonnappa Nagarahalli 			goto results;
14602cc1d7b4SHonnappa Nagarahalli 		}
14612cc1d7b4SHonnappa Nagarahalli 	} else
14622cc1d7b4SHonnappa Nagarahalli 		printf("With HTM Enabled\n");
14632cc1d7b4SHonnappa Nagarahalli 	if (test_hash_add_no_ks_lookup_hit(&rwc_non_lf_results, rwc_lf, htm,
14642cc1d7b4SHonnappa Nagarahalli 					   ext_bkt) < 0)
14652cc1d7b4SHonnappa Nagarahalli 		return -1;
14662cc1d7b4SHonnappa Nagarahalli 	if (test_hash_add_no_ks_lookup_miss(&rwc_non_lf_results, rwc_lf, htm,
14672cc1d7b4SHonnappa Nagarahalli 						ext_bkt) < 0)
14682cc1d7b4SHonnappa Nagarahalli 		return -1;
14692cc1d7b4SHonnappa Nagarahalli 	if (test_hash_add_ks_lookup_hit_non_sp(&rwc_non_lf_results, rwc_lf,
14702cc1d7b4SHonnappa Nagarahalli 						htm, ext_bkt) < 0)
14712cc1d7b4SHonnappa Nagarahalli 		return -1;
14722cc1d7b4SHonnappa Nagarahalli 	if (test_hash_add_ks_lookup_hit_sp(&rwc_non_lf_results, rwc_lf, htm,
14732cc1d7b4SHonnappa Nagarahalli 						ext_bkt) < 0)
14742cc1d7b4SHonnappa Nagarahalli 		return -1;
14752cc1d7b4SHonnappa Nagarahalli 	if (test_hash_add_ks_lookup_miss(&rwc_non_lf_results, rwc_lf, htm,
14762cc1d7b4SHonnappa Nagarahalli 					 ext_bkt) < 0)
14772cc1d7b4SHonnappa Nagarahalli 		return -1;
14782cc1d7b4SHonnappa Nagarahalli 	if (test_hash_multi_add_lookup(&rwc_non_lf_results, rwc_lf, htm,
14792cc1d7b4SHonnappa Nagarahalli 							ext_bkt) < 0)
14802cc1d7b4SHonnappa Nagarahalli 		return -1;
14812cc1d7b4SHonnappa Nagarahalli 	if (test_hash_add_ks_lookup_hit_extbkt(&rwc_non_lf_results, rwc_lf,
14822cc1d7b4SHonnappa Nagarahalli 						htm, ext_bkt) < 0)
14832cc1d7b4SHonnappa Nagarahalli 		return -1;
14842cc1d7b4SHonnappa Nagarahalli results:
14852cc1d7b4SHonnappa Nagarahalli 	printf("\n\t\t\t\t\t\t********** Results summary **********\n\n");
14862cc1d7b4SHonnappa Nagarahalli 	int i, j, k;
14872cc1d7b4SHonnappa Nagarahalli 	for (j = 0; j < 2; j++) {
14882cc1d7b4SHonnappa Nagarahalli 		if (j == 1)
14892cc1d7b4SHonnappa Nagarahalli 			printf("\n\t\t\t\t\t#######********** Bulk Lookup "
14902cc1d7b4SHonnappa Nagarahalli 			       "**********#######\n\n");
14912cc1d7b4SHonnappa Nagarahalli 		printf("_______\t\t_______\t\t_________\t___\t\t_________\t\t"
14922cc1d7b4SHonnappa Nagarahalli 			"\t\t\t\t_________________\n");
14932cc1d7b4SHonnappa Nagarahalli 		printf("Writers\t\tReaders\t\tLock-free\tHTM\t\tTest-case\t\t\t"
14942cc1d7b4SHonnappa Nagarahalli 		       "\t\t\tCycles per lookup\n");
14952cc1d7b4SHonnappa Nagarahalli 		printf("_______\t\t_______\t\t_________\t___\t\t_________\t\t\t"
14962cc1d7b4SHonnappa Nagarahalli 		       "\t\t\t_________________\n");
14972cc1d7b4SHonnappa Nagarahalli 		for (i = 0; i < NUM_TEST; i++) {
14982cc1d7b4SHonnappa Nagarahalli 			printf("%u\t\t%u\t\t", 1, rwc_core_cnt[i]);
14992cc1d7b4SHonnappa Nagarahalli 			printf("Enabled\t\t");
15002cc1d7b4SHonnappa Nagarahalli 			printf("N/A\t\t");
15012cc1d7b4SHonnappa Nagarahalli 			printf("Hash add - no key-shifts, lookup - hit\t\t\t\t"
15022cc1d7b4SHonnappa Nagarahalli 				"%u\n\t\t\t\t\t\t\t\t",
15032cc1d7b4SHonnappa Nagarahalli 				rwc_lf_results.w_no_ks_r_hit[j][i]);
15042cc1d7b4SHonnappa Nagarahalli 			printf("Hash add - no key-shifts, lookup - miss\t\t\t\t"
15052cc1d7b4SHonnappa Nagarahalli 				"%u\n\t\t\t\t\t\t\t\t",
15062cc1d7b4SHonnappa Nagarahalli 				rwc_lf_results.w_no_ks_r_miss[j][i]);
15072cc1d7b4SHonnappa Nagarahalli 			printf("Hash add - key-shifts, lookup - hit"
15082cc1d7b4SHonnappa Nagarahalli 			       "(non-shift-path)\t\t%u\n\t\t\t\t\t\t\t\t",
15092cc1d7b4SHonnappa Nagarahalli 			       rwc_lf_results.w_ks_r_hit_nsp[j][i]);
15102cc1d7b4SHonnappa Nagarahalli 			printf("Hash add - key-shifts, lookup - hit "
15112cc1d7b4SHonnappa Nagarahalli 			       "(shift-path)\t\t%u\n\t\t\t\t\t\t\t\t",
15122cc1d7b4SHonnappa Nagarahalli 			       rwc_lf_results.w_ks_r_hit_sp[j][i]);
15132cc1d7b4SHonnappa Nagarahalli 			printf("Hash add - key-shifts, Hash lookup miss\t\t\t\t"
15142cc1d7b4SHonnappa Nagarahalli 				"%u\n\t\t\t\t\t\t\t\t",
15152cc1d7b4SHonnappa Nagarahalli 				rwc_lf_results.w_ks_r_miss[j][i]);
15162cc1d7b4SHonnappa Nagarahalli 			printf("Hash add - key-shifts, Hash lookup hit (ext_bkt)\t\t"
15172cc1d7b4SHonnappa Nagarahalli 				"%u\n\n\t\t\t\t",
15182cc1d7b4SHonnappa Nagarahalli 				rwc_lf_results.w_ks_r_hit_extbkt[j][i]);
15192cc1d7b4SHonnappa Nagarahalli 
15202cc1d7b4SHonnappa Nagarahalli 			printf("Disabled\t");
15212cc1d7b4SHonnappa Nagarahalli 			if (htm)
15222cc1d7b4SHonnappa Nagarahalli 				printf("Enabled\t\t");
15232cc1d7b4SHonnappa Nagarahalli 			else
15242cc1d7b4SHonnappa Nagarahalli 				printf("Disabled\t");
15252cc1d7b4SHonnappa Nagarahalli 			printf("Hash add - no key-shifts, lookup - hit\t\t\t\t"
15262cc1d7b4SHonnappa Nagarahalli 				"%u\n\t\t\t\t\t\t\t\t",
15272cc1d7b4SHonnappa Nagarahalli 				rwc_non_lf_results.w_no_ks_r_hit[j][i]);
15282cc1d7b4SHonnappa Nagarahalli 			printf("Hash add - no key-shifts, lookup - miss\t\t\t\t"
15292cc1d7b4SHonnappa Nagarahalli 				"%u\n\t\t\t\t\t\t\t\t",
15302cc1d7b4SHonnappa Nagarahalli 				rwc_non_lf_results.w_no_ks_r_miss[j][i]);
15312cc1d7b4SHonnappa Nagarahalli 			printf("Hash add - key-shifts, lookup - hit "
15322cc1d7b4SHonnappa Nagarahalli 			       "(non-shift-path)\t\t%u\n\t\t\t\t\t\t\t\t",
15332cc1d7b4SHonnappa Nagarahalli 			       rwc_non_lf_results.w_ks_r_hit_nsp[j][i]);
15342cc1d7b4SHonnappa Nagarahalli 			printf("Hash add - key-shifts, lookup - hit "
15352cc1d7b4SHonnappa Nagarahalli 			       "(shift-path)\t\t%u\n\t\t\t\t\t\t\t\t",
15362cc1d7b4SHonnappa Nagarahalli 			       rwc_non_lf_results.w_ks_r_hit_sp[j][i]);
15372cc1d7b4SHonnappa Nagarahalli 			printf("Hash add - key-shifts, Hash lookup miss\t\t\t\t"
15382cc1d7b4SHonnappa Nagarahalli 			       "%u\n\t\t\t\t\t\t\t\t",
15392cc1d7b4SHonnappa Nagarahalli 			       rwc_non_lf_results.w_ks_r_miss[j][i]);
15402cc1d7b4SHonnappa Nagarahalli 			printf("Hash add - key-shifts, Hash lookup hit (ext_bkt)\t\t"
15412cc1d7b4SHonnappa Nagarahalli 				"%u\n",
15422cc1d7b4SHonnappa Nagarahalli 				rwc_non_lf_results.w_ks_r_hit_extbkt[j][i]);
15432cc1d7b4SHonnappa Nagarahalli 
15442cc1d7b4SHonnappa Nagarahalli 			printf("_______\t\t_______\t\t_________\t___\t\t"
15452cc1d7b4SHonnappa Nagarahalli 			       "_________\t\t\t\t\t\t_________________\n");
15462cc1d7b4SHonnappa Nagarahalli 		}
15472cc1d7b4SHonnappa Nagarahalli 
15482cc1d7b4SHonnappa Nagarahalli 		for (i = 1; i < NUM_TEST; i++) {
15492cc1d7b4SHonnappa Nagarahalli 			for (k = 0; k < NUM_TEST; k++) {
15502cc1d7b4SHonnappa Nagarahalli 				printf("%u", rwc_core_cnt[i]);
15512cc1d7b4SHonnappa Nagarahalli 				printf("\t\t%u\t\t", rwc_core_cnt[k]);
15522cc1d7b4SHonnappa Nagarahalli 				printf("Enabled\t\t");
15532cc1d7b4SHonnappa Nagarahalli 				printf("N/A\t\t");
15542cc1d7b4SHonnappa Nagarahalli 				printf("Multi-add-lookup\t\t\t\t\t\t%u\n\n\t\t"
15552cc1d7b4SHonnappa Nagarahalli 				       "\t\t",
15562cc1d7b4SHonnappa Nagarahalli 				       rwc_lf_results.multi_rw[i][j][k]);
15572cc1d7b4SHonnappa Nagarahalli 				printf("Disabled\t");
15582cc1d7b4SHonnappa Nagarahalli 				if (htm)
15592cc1d7b4SHonnappa Nagarahalli 					printf("Enabled\t\t");
15602cc1d7b4SHonnappa Nagarahalli 				else
15612cc1d7b4SHonnappa Nagarahalli 					printf("Disabled\t");
15622cc1d7b4SHonnappa Nagarahalli 				printf("Multi-add-lookup\t\t\t\t\t\t%u\n",
15632cc1d7b4SHonnappa Nagarahalli 				       rwc_non_lf_results.multi_rw[i][j][k]);
15642cc1d7b4SHonnappa Nagarahalli 
15652cc1d7b4SHonnappa Nagarahalli 				printf("_______\t\t_______\t\t_________\t___"
15662cc1d7b4SHonnappa Nagarahalli 				       "\t\t_________\t\t\t\t\t\t"
15672cc1d7b4SHonnappa Nagarahalli 				       "_________________\n");
15682cc1d7b4SHonnappa Nagarahalli 			}
15692cc1d7b4SHonnappa Nagarahalli 		}
15702cc1d7b4SHonnappa Nagarahalli 	}
15712cc1d7b4SHonnappa Nagarahalli 	rte_free(tbl_rwc_test_param.keys);
15722cc1d7b4SHonnappa Nagarahalli 	rte_free(tbl_rwc_test_param.keys_no_ks);
15732cc1d7b4SHonnappa Nagarahalli 	rte_free(tbl_rwc_test_param.keys_ks);
15742cc1d7b4SHonnappa Nagarahalli 	rte_free(tbl_rwc_test_param.keys_absent);
15752cc1d7b4SHonnappa Nagarahalli 	rte_free(tbl_rwc_test_param.keys_shift_path);
15762cc1d7b4SHonnappa Nagarahalli 	rte_free(tbl_rwc_test_param.keys_non_shift_path);
15772cc1d7b4SHonnappa Nagarahalli 	rte_free(tbl_rwc_test_param.keys_ext_bkt);
15782cc1d7b4SHonnappa Nagarahalli 	rte_free(tbl_rwc_test_param.keys_ks_extbkt);
15792cc1d7b4SHonnappa Nagarahalli 	return 0;
15802cc1d7b4SHonnappa Nagarahalli }
15812cc1d7b4SHonnappa Nagarahalli 
1582e0a8442cSBruce Richardson REGISTER_PERF_TEST(hash_readwrite_lf_perf_autotest,
15832cc1d7b4SHonnappa Nagarahalli 	test_hash_readwrite_lf_perf_main);
1584