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