app/test: count tests skipped at setup
[dpdk.git] / app / test / test_hash_perf.c
index a438eae..5d36c0f 100644 (file)
 #define BURST_SIZE 16
 
 enum operations {
-       ADD = 0,
-       LOOKUP,
-       LOOKUP_MULTI,
-       DELETE,
+       OP_ADD = 0,
+       OP_LOOKUP,
+       OP_LOOKUP_MULTI,
+       OP_DELETE,
        NUM_OPERATIONS
 };
 
@@ -106,12 +106,7 @@ create_table(unsigned int with_data, unsigned int table_index,
        ut_params.key_len = hashtest_key_lens[table_index];
        ut_params.socket_id = rte_socket_id();
        h[table_index] = rte_hash_find_existing(name);
-       if (h[table_index] != NULL)
-               /*
-                * If table was already created, free it to create it again,
-                * so we force it is empty
-                */
-               rte_hash_free(h[table_index]);
+       rte_hash_free(h[table_index]);
        h[table_index] = rte_hash_create(&ut_params);
        if (h[table_index] == NULL) {
                printf("Error creating table\n");
@@ -308,7 +303,7 @@ timed_adds(unsigned int with_hash, unsigned int with_data,
        const uint64_t end_tsc = rte_rdtsc();
        const uint64_t time_taken = end_tsc - start_tsc;
 
-       cycles[table_index][ADD][with_hash][with_data] = time_taken/keys_to_add;
+       cycles[table_index][OP_ADD][with_hash][with_data] = time_taken/keys_to_add;
 
        return 0;
 }
@@ -385,14 +380,14 @@ timed_lookups(unsigned int with_hash, unsigned int with_data,
        const uint64_t end_tsc = rte_rdtsc();
        const uint64_t time_taken = end_tsc - start_tsc;
 
-       cycles[table_index][LOOKUP][with_hash][with_data] = time_taken/num_lookups;
+       cycles[table_index][OP_LOOKUP][with_hash][with_data] = time_taken/num_lookups;
 
        return 0;
 }
 
 static int
-timed_lookups_multi(unsigned int with_data, unsigned int table_index,
-                                                       unsigned int ext)
+timed_lookups_multi(unsigned int with_hash, unsigned int with_data,
+               unsigned int table_index, unsigned int ext)
 {
        unsigned i, j, k;
        int32_t positions_burst[BURST_SIZE];
@@ -417,7 +412,7 @@ timed_lookups_multi(unsigned int with_data, unsigned int table_index,
                for (j = 0; j < keys_to_add/BURST_SIZE; j++) {
                        for (k = 0; k < BURST_SIZE; k++)
                                keys_burst[k] = keys[j * BURST_SIZE + k];
-                       if (with_data) {
+                       if (!with_hash && with_data) {
                                ret = rte_hash_lookup_bulk_data(h[table_index],
                                        (const void **) keys_burst,
                                        BURST_SIZE,
@@ -442,6 +437,55 @@ timed_lookups_multi(unsigned int with_data, unsigned int table_index,
                                                return -1;
                                        }
                                }
+                       } else if (with_hash && with_data) {
+                               ret = rte_hash_lookup_with_hash_bulk_data(
+                                       h[table_index],
+                                       (const void **)keys_burst,
+                                       &signatures[j * BURST_SIZE],
+                                       BURST_SIZE, &hit_mask, ret_data);
+                               if (ret != BURST_SIZE) {
+                                       printf("Expect to find %u keys,"
+                                              " but found %d\n",
+                                               BURST_SIZE, ret);
+                                       return -1;
+                               }
+                               for (k = 0; k < BURST_SIZE; k++) {
+                                       if ((hit_mask & (1ULL << k))  == 0) {
+                                               printf("Key number %u"
+                                                       " not found\n",
+                                                       j * BURST_SIZE + k);
+                                               return -1;
+                                       }
+                                       expected_data[k] =
+                                               (void *)((uintptr_t)signatures[
+                                               j * BURST_SIZE + k]);
+                                       if (ret_data[k] != expected_data[k]) {
+                                               printf("Data returned for key"
+                                                       " number %u is %p,"
+                                                       " but should be %p\n",
+                                                       j * BURST_SIZE + k,
+                                                       ret_data[k],
+                                                       expected_data[k]);
+                                               return -1;
+                                       }
+                               }
+                       } else if (with_hash && !with_data) {
+                               ret = rte_hash_lookup_with_hash_bulk(
+                                       h[table_index],
+                                       (const void **)keys_burst,
+                                       &signatures[j * BURST_SIZE],
+                                       BURST_SIZE, positions_burst);
+                               for (k = 0; k < BURST_SIZE; k++) {
+                                       if (positions_burst[k] !=
+                                                       positions[j *
+                                                       BURST_SIZE + k]) {
+                                               printf("Key looked up in %d, should be in %d\n",
+                                                       positions_burst[k],
+                                                       positions[j *
+                                                       BURST_SIZE + k]);
+                                               return -1;
+                                       }
+                               }
                        } else {
                                rte_hash_lookup_bulk(h[table_index],
                                                (const void **) keys_burst,
@@ -462,7 +506,8 @@ timed_lookups_multi(unsigned int with_data, unsigned int table_index,
        const uint64_t end_tsc = rte_rdtsc();
        const uint64_t time_taken = end_tsc - start_tsc;
 
-       cycles[table_index][LOOKUP_MULTI][0][with_data] = time_taken/num_lookups;
+       cycles[table_index][OP_LOOKUP_MULTI][with_hash][with_data] =
+               time_taken/num_lookups;
 
        return 0;
 }
@@ -500,7 +545,7 @@ timed_deletes(unsigned int with_hash, unsigned int with_data,
        const uint64_t end_tsc = rte_rdtsc();
        const uint64_t time_taken = end_tsc - start_tsc;
 
-       cycles[table_index][DELETE][with_hash][with_data] = time_taken/keys_to_add;
+       cycles[table_index][OP_DELETE][with_hash][with_data] = time_taken/keys_to_add;
 
        return 0;
 }
@@ -543,7 +588,8 @@ run_all_tbl_perf_tests(unsigned int with_pushes, unsigned int with_locks,
                                if (timed_lookups(with_hash, with_data, i, ext) < 0)
                                        return -1;
 
-                               if (timed_lookups_multi(with_data, i, ext) < 0)
+                               if (timed_lookups_multi(with_hash, with_data,
+                                               i, ext) < 0)
                                        return -1;
 
                                if (timed_deletes(with_hash, with_data, i, ext) < 0)
@@ -672,6 +718,10 @@ static int
 test_hash_perf(void)
 {
        unsigned int with_pushes, with_locks;
+
+       if (RTE_EXEC_ENV_IS_WINDOWS)
+               return TEST_SKIPPED;
+
        for (with_locks = 0; with_locks <= 1; with_locks++) {
                if (with_locks)
                        printf("\nWith locks in the code\n");