X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=app%2Ftest%2Ftest_hash_readwrite.c;h=4860768a6491fbb0c827daf8718378964cea87d7;hb=a550baf24af90f76354eab0d4f91165a78157d38;hp=615767fb6053336ece6c1bff65b67343ec706b82;hpb=1d3bb890a432e3f8b7223b1b68e658b40b1dc077;p=dpdk.git diff --git a/app/test/test_hash_readwrite.c b/app/test/test_hash_readwrite.c index 615767fb60..4860768a64 100644 --- a/app/test/test_hash_readwrite.c +++ b/app/test/test_hash_readwrite.c @@ -25,7 +25,7 @@ #define NUM_TEST 3 unsigned int core_cnt[NUM_TEST] = {2, 4, 8}; -unsigned int slave_core_ids[RTE_MAX_LCORE]; +unsigned int worker_core_ids[RTE_MAX_LCORE]; struct perf { uint32_t single_read; uint32_t single_write; @@ -55,7 +55,7 @@ static rte_atomic64_t greads; static rte_atomic64_t gwrites; static int -test_hash_readwrite_worker(__attribute__((unused)) void *arg) +test_hash_readwrite_worker(__rte_unused void *arg) { uint64_t i, offset; uint32_t lcore_id = rte_lcore_id(); @@ -65,7 +65,7 @@ test_hash_readwrite_worker(__attribute__((unused)) void *arg) ret = rte_malloc(NULL, sizeof(int) * tbl_rw_test_param.num_insert, 0); for (i = 0; i < rte_lcore_count(); i++) { - if (slave_core_ids[i] == lcore_id) + if (worker_core_ids[i] == lcore_id) break; } offset = tbl_rw_test_param.num_insert * i; @@ -121,7 +121,7 @@ test_hash_readwrite_worker(__attribute__((unused)) void *arg) } static int -init_params(int use_ext, int use_htm, int use_jhash) +init_params(int use_ext, int use_htm, int rw_lf, int use_jhash) { unsigned int i; @@ -140,15 +140,16 @@ init_params(int use_ext, int use_htm, int use_jhash) else hash_params.hash_func = rte_hash_crc; + hash_params.extra_flag = RTE_HASH_EXTRA_FLAGS_MULTI_WRITER_ADD; if (use_htm) - hash_params.extra_flag = - RTE_HASH_EXTRA_FLAGS_TRANS_MEM_SUPPORT | - RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY | - RTE_HASH_EXTRA_FLAGS_MULTI_WRITER_ADD; + hash_params.extra_flag |= + RTE_HASH_EXTRA_FLAGS_TRANS_MEM_SUPPORT; + if (rw_lf) + hash_params.extra_flag |= + RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY_LF; else - hash_params.extra_flag = - RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY | - RTE_HASH_EXTRA_FLAGS_MULTI_WRITER_ADD; + hash_params.extra_flag |= + RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY; if (use_ext) hash_params.extra_flag |= @@ -195,7 +196,7 @@ err: } static int -test_hash_readwrite_functional(int use_ext, int use_htm) +test_hash_readwrite_functional(int use_htm, int use_rw_lf, int use_ext) { unsigned int i; const void *next_key; @@ -205,7 +206,7 @@ test_hash_readwrite_functional(int use_ext, int use_htm) uint32_t duplicated_keys = 0; uint32_t lost_keys = 0; int use_jhash = 1; - int slave_cnt = rte_lcore_count() - 1; + int worker_cnt = rte_lcore_count() - 1; uint32_t tot_insert = 0; rte_atomic64_init(&gcycles); @@ -214,7 +215,7 @@ test_hash_readwrite_functional(int use_ext, int use_htm) rte_atomic64_init(&ginsertions); rte_atomic64_clear(&ginsertions); - if (init_params(use_ext, use_htm, use_jhash) != 0) + if (init_params(use_ext, use_htm, use_rw_lf, use_jhash) != 0) goto err; if (use_ext) @@ -223,17 +224,18 @@ test_hash_readwrite_functional(int use_ext, int use_htm) tot_insert = TOTAL_INSERT; tbl_rw_test_param.num_insert = - tot_insert / slave_cnt; + tot_insert / worker_cnt; tbl_rw_test_param.rounded_tot_insert = - tbl_rw_test_param.num_insert - * slave_cnt; + tbl_rw_test_param.num_insert * worker_cnt; + printf("\nHTM = %d, RW-LF = %d, EXT-Table = %d\n", + use_htm, use_rw_lf, use_ext); printf("++++++++Start function tests:+++++++++\n"); /* Fire all threads. */ rte_eal_mp_remote_launch(test_hash_readwrite_worker, - NULL, SKIP_MASTER); + NULL, SKIP_MAIN); rte_eal_mp_wait_lcore(); while (rte_hash_iterate(tbl_rw_test_param.h, &next_key, @@ -327,7 +329,7 @@ test_rw_writer(void *arg) uint64_t offset; for (i = 0; i < rte_lcore_count(); i++) { - if (slave_core_ids[i] == lcore_id) + if (worker_core_ids[i] == lcore_id) break; } @@ -379,7 +381,7 @@ test_hash_readwrite_perf(struct perf *perf_results, int use_htm, rte_atomic64_init(&gwrite_cycles); rte_atomic64_clear(&gwrite_cycles); - if (init_params(0, use_htm, use_jhash) != 0) + if (init_params(0, use_htm, 0, use_jhash) != 0) goto err; /* @@ -430,8 +432,8 @@ test_hash_readwrite_perf(struct perf *perf_results, int use_htm, perf_results->single_read = end / i; for (n = 0; n < NUM_TEST; n++) { - unsigned int tot_slave_lcore = rte_lcore_count() - 1; - if (tot_slave_lcore < core_cnt[n] * 2) + unsigned int tot_worker_lcore = rte_lcore_count() - 1; + if (tot_worker_lcore < core_cnt[n] * 2) goto finish; rte_atomic64_clear(&greads); @@ -464,7 +466,7 @@ test_hash_readwrite_perf(struct perf *perf_results, int use_htm, for (i = 0; i < core_cnt[n]; i++) rte_eal_remote_launch(test_rw_reader, (void *)(uintptr_t)read_cnt, - slave_core_ids[i]); + worker_core_ids[i]); rte_eal_mp_wait_lcore(); @@ -473,7 +475,7 @@ test_hash_readwrite_perf(struct perf *perf_results, int use_htm, for (; i < core_cnt[n] * 2; i++) rte_eal_remote_launch(test_rw_writer, (void *)((uintptr_t)start_coreid), - slave_core_ids[i]); + worker_core_ids[i]); rte_eal_mp_wait_lcore(); @@ -518,20 +520,20 @@ test_hash_readwrite_perf(struct perf *perf_results, int use_htm, for (i = core_cnt[n]; i < core_cnt[n] * 2; i++) rte_eal_remote_launch(test_rw_writer, (void *)((uintptr_t)start_coreid), - slave_core_ids[i]); + worker_core_ids[i]); for (i = 0; i < core_cnt[n]; i++) rte_eal_remote_launch(test_rw_reader, (void *)(uintptr_t)read_cnt, - slave_core_ids[i]); + worker_core_ids[i]); } else { for (i = 0; i < core_cnt[n]; i++) rte_eal_remote_launch(test_rw_reader, (void *)(uintptr_t)read_cnt, - slave_core_ids[i]); + worker_core_ids[i]); for (; i < core_cnt[n] * 2; i++) rte_eal_remote_launch(test_rw_writer, (void *)((uintptr_t)start_coreid), - slave_core_ids[i]); + worker_core_ids[i]); } rte_eal_mp_wait_lcore(); @@ -606,7 +608,7 @@ err: } static int -test_hash_readwrite_main(void) +test_hash_rw_perf_main(void) { /* * Variables used to choose different tests. @@ -615,7 +617,7 @@ test_hash_readwrite_main(void) * than writer threads. This is to timing either reader threads or * writer threads for performance numbers. */ - int use_htm, use_ext, reader_faster; + int use_htm, reader_faster; unsigned int i = 0, core_id = 0; if (rte_lcore_count() < 3) { @@ -623,8 +625,8 @@ test_hash_readwrite_main(void) return TEST_SKIPPED; } - RTE_LCORE_FOREACH_SLAVE(core_id) { - slave_core_ids[i] = core_id; + RTE_LCORE_FOREACH_WORKER(core_id) { + worker_core_ids[i] = core_id; i++; } @@ -637,14 +639,6 @@ test_hash_readwrite_main(void) printf("Test read-write with Hardware transactional memory\n"); use_htm = 1; - use_ext = 0; - - if (test_hash_readwrite_functional(use_ext, use_htm) < 0) - return -1; - - use_ext = 1; - if (test_hash_readwrite_functional(use_ext, use_htm) < 0) - return -1; reader_faster = 1; if (test_hash_readwrite_perf(&htm_results, use_htm, @@ -662,13 +656,6 @@ test_hash_readwrite_main(void) printf("Test read-write without Hardware transactional memory\n"); use_htm = 0; - use_ext = 0; - if (test_hash_readwrite_functional(use_ext, use_htm) < 0) - return -1; - - use_ext = 1; - if (test_hash_readwrite_functional(use_ext, use_htm) < 0) - return -1; reader_faster = 1; if (test_hash_readwrite_perf(&non_htm_results, use_htm, @@ -705,4 +692,75 @@ test_hash_readwrite_main(void) return 0; } -REGISTER_TEST_COMMAND(hash_readwrite_autotest, test_hash_readwrite_main); +static int +test_hash_rw_func_main(void) +{ + /* + * Variables used to choose different tests. + * use_htm indicates if hardware transactional memory should be used. + * reader_faster indicates if the reader threads should finish earlier + * than writer threads. This is to timing either reader threads or + * writer threads for performance numbers. + */ + unsigned int i = 0, core_id = 0; + + if (rte_lcore_count() < 3) { + printf("Not enough cores for hash_readwrite_autotest, expecting at least 3\n"); + return TEST_SKIPPED; + } + + RTE_LCORE_FOREACH_WORKER(core_id) { + worker_core_ids[i] = core_id; + i++; + } + + setlocale(LC_NUMERIC, ""); + + if (rte_tm_supported()) { + printf("Hardware transactional memory (lock elision) " + "is supported\n"); + + printf("Test read-write with Hardware transactional memory\n"); + + /* htm = 1, rw_lf = 0, ext = 0 */ + if (test_hash_readwrite_functional(1, 0, 0) < 0) + return -1; + + /* htm = 1, rw_lf = 1, ext = 0 */ + if (test_hash_readwrite_functional(1, 1, 0) < 0) + return -1; + + /* htm = 1, rw_lf = 0, ext = 1 */ + if (test_hash_readwrite_functional(1, 0, 1) < 0) + return -1; + + /* htm = 1, rw_lf = 1, ext = 1 */ + if (test_hash_readwrite_functional(1, 1, 1) < 0) + return -1; + } else { + printf("Hardware transactional memory (lock elision) " + "is NOT supported\n"); + } + + printf("Test read-write without Hardware transactional memory\n"); + /* htm = 0, rw_lf = 0, ext = 0 */ + if (test_hash_readwrite_functional(0, 0, 0) < 0) + return -1; + + /* htm = 0, rw_lf = 1, ext = 0 */ + if (test_hash_readwrite_functional(0, 1, 0) < 0) + return -1; + + /* htm = 0, rw_lf = 0, ext = 1 */ + if (test_hash_readwrite_functional(0, 0, 1) < 0) + return -1; + + /* htm = 0, rw_lf = 1, ext = 1 */ + if (test_hash_readwrite_functional(0, 1, 1) < 0) + return -1; + + return 0; +} + +REGISTER_TEST_COMMAND(hash_readwrite_func_autotest, test_hash_rw_func_main); +REGISTER_TEST_COMMAND(hash_readwrite_perf_autotest, test_hash_rw_perf_main);