From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR04-VI1-obe.outbound.protection.outlook.com (mail-eopbgr80088.outbound.protection.outlook.com [40.107.8.88]) by dpdk.org (Postfix) with ESMTP id A5F295B20 for ; Thu, 27 Sep 2018 06:24:11 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector1-arm-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=y19sxQxh0H1iwWH8MYNQDOWrRh3OmsazJT0VEMUWLjY=; b=aByxIxT0JF2V85uo7Mmv3LnYn/tfqGZlL6X7u09HuUignJxyZg/d3vWIeNYTH0fpEC4hOzXIaGyCRj4SQ0PIoMQcyJLrnpMnGPgm1Ks2LmhomiK6IWkmSNz6BBWYwIHuQXCGbvJfAteiA4THyDQJ2xUpEtGJ55Zp3tmtFL7ilG4= Received: from AM6PR08MB3672.eurprd08.prod.outlook.com (20.177.115.29) by AM6PR08MB2950.eurprd08.prod.outlook.com (52.135.163.15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1164.22; Thu, 27 Sep 2018 04:24:10 +0000 Received: from AM6PR08MB3672.eurprd08.prod.outlook.com ([fe80::589e:d3cf:9777:5ff9]) by AM6PR08MB3672.eurprd08.prod.outlook.com ([fe80::589e:d3cf:9777:5ff9%2]) with mapi id 15.20.1164.024; Thu, 27 Sep 2018 04:24:10 +0000 From: Honnappa Nagarahalli To: Yipeng Wang , "bruce.richardson@intel.com" CC: "dev@dpdk.org" , "michel@digirati.com.br" Thread-Topic: [PATCH v2 6/7] test/hash: implement extendable bucket hash test Thread-Index: AQHUUgpSFZ8VB1FepUa0+UjfyR9uLKUC+vGw Date: Thu, 27 Sep 2018 04:24:10 +0000 Message-ID: References: <1536253745-133104-1-git-send-email-yipeng1.wang@intel.com> <1537550255-252066-1-git-send-email-yipeng1.wang@intel.com> <1537550255-252066-7-git-send-email-yipeng1.wang@intel.com> In-Reply-To: <1537550255-252066-7-git-send-email-yipeng1.wang@intel.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: spf=none (sender IP is ) smtp.mailfrom=Honnappa.Nagarahalli@arm.com; x-originating-ip: [217.140.111.135] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; AM6PR08MB2950; 6:KYL2J8UrxX5ldTrj6kg4Rkw1foOrFjIILrG6ehoI1qUQ+r9eGhGGNY4sq8gX0MxPlaViV/Q9uSKl7LKnNSJtZfD3CPtFEiWg8MUOYjChecK+o7DonBZ0xljk1Q9Sz8lOm9FCmRh0/g+HhQZdLs6pZIEelJ3lP5wXujGZo3kLvbbEMAqM/42ZOMmDtzhslUIzalPdCTx2Uisw1Xqzk8a3rjpG8S2yhCVZEt44NOb4tPMHn4arHJN9EnkVwQxB8b/XgTxokXCUBwC6n4DNuWKOkPTBYytpjPDWSU1PyzD787WwlEq3KXYoTMfRNmKO3CTiE7VZpUssNeDbiUu1v6rXLL28j0y0dBvy4+w3MfyJhB6tvXBwfL6rtQANo0s9EP9wA1SZCQigg8nxxeq6NXCpqATPBJlZiy4Ej/YbShBmR0GPtjH9ljhPsxuBMRGb8u2+r9QmEUWZAAz/Hzbd8JEMTg==; 5:BRSVlQ7BhzUddKcTiAaytpS8pIyddzQX7+EIs7N9mcZRVxoCRWiaRm2L+MoarhHkg/JuVaOlnM7At2SZbYjdxGWuRLLxfivT4+SPFLxpHPVL+cDsXeWSXkXArcR/QCv9TxZBAl3AtX35GHt6x51ES0L4C+YCjvWbjSnj/m5VscQ=; 7:TZ7Ey8f4sr3NWvbnGkwd2GRkzEtKb9TIhY0WjMmv4OVXVkSv+dUn5fSpXDQjg3MpNGYX709ZobXYQtawsH6Nw8uNwy96y71ESyz3CmY5AyjYz59X9Lazh+mba1X3Ncy7cX+n4yCf8hR9TdIKFnOGt6MebYep2PDihpXjQvSKse+8ZUop/M88fncGj+2aJyc/U0vE0kYD5dyNBj8MxStcsCiSxyTGk9WfO9nEttinC6JsBmaH0XFYLYifG8OFICxL x-ms-exchange-antispam-srfa-diagnostics: SOS; x-ms-office365-filtering-correlation-id: e3e007f3-ca34-4225-8168-08d624311289 x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: BCL:0; PCL:0; RULEID:(7020095)(4652040)(8989299)(4534165)(4627221)(201703031133081)(201702281549075)(8990200)(5600074)(711020)(4618075)(2017052603328)(7153060)(7193020); SRVR:AM6PR08MB2950; x-ms-traffictypediagnostic: AM6PR08MB2950: x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:(228905959029699)(166494164430575)(131327999870524)(180628864354917); x-ms-exchange-senderadcheck: 1 x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(93006095)(93001095)(3002001)(3231355)(944501410)(52105095)(10201501046)(6055026)(149066)(150057)(6041310)(20161123558120)(20161123560045)(20161123564045)(20161123562045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(201708071742011)(7699051); SRVR:AM6PR08MB2950; BCL:0; PCL:0; RULEID:; SRVR:AM6PR08MB2950; x-forefront-prvs: 0808323E97 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(136003)(396003)(366004)(39860400002)(376002)(346002)(199004)(40434004)(13464003)(189003)(110136005)(186003)(54906003)(305945005)(66066001)(97736004)(2906002)(68736007)(316002)(8936002)(5250100002)(81156014)(81166006)(74316002)(6246003)(33656002)(8676002)(4326008)(14444005)(5024004)(6436002)(105586002)(7696005)(7736002)(2501003)(53546011)(72206003)(229853002)(86362001)(106356001)(486006)(446003)(102836004)(478600001)(256004)(9686003)(99286004)(53946003)(14454004)(55016002)(53936002)(6506007)(25786009)(34290500001)(5660300001)(11346002)(6116002)(3846002)(476003)(76176011)(71200400001)(2900100001)(71190400001)(26005); DIR:OUT; SFP:1101; SCL:1; SRVR:AM6PR08MB2950; H:AM6PR08MB3672.eurprd08.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX:1; received-spf: None (protection.outlook.com: arm.com does not designate permitted sender hosts) x-microsoft-antispam-message-info: kmh+j+/Wx3SfWrBmF6wGeF+VKknsixY/OePdjd7iZPBzg6F0FxI1rXvquKMNjw8XuL3il23E7Ue1UTPDoLrdmPWlTpLP0a8F3TFQEM9NjwMEPbUO8bemFfeyBIGQZcePDtZ8ZU//h31pgN2k9VRnOcRHHeNIN1mz72F4mGA7EYSuzdVA56Ok0GDfqUIK22xQUB5hoLeiWj2mca7rrxIdcs/6av4RX5WX9jkDGS15/zkyO2UQBaEf/8R5IowJE0Q6a5WnKyV1d+IfAZ3VQgEpFhAocfXxv04N6WLzqs68rCX6zCliHyWxiybTg8Q3g8umFNu9AfZHC0iFT4fLjG5H+1TLplR0+kU8nUzwrbG/dvE= spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-Network-Message-Id: e3e007f3-ca34-4225-8168-08d624311289 X-MS-Exchange-CrossTenant-originalarrivaltime: 27 Sep 2018 04:24:10.1532 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM6PR08MB2950 Subject: Re: [dpdk-dev] [PATCH v2 6/7] test/hash: implement extendable bucket hash test X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 27 Sep 2018 04:24:11 -0000 > -----Original Message----- > From: Yipeng Wang > Sent: Friday, September 21, 2018 12:18 PM > To: bruce.richardson@intel.com > Cc: dev@dpdk.org; yipeng1.wang@intel.com; michel@digirati.com.br; > Honnappa Nagarahalli > Subject: [PATCH v2 6/7] test/hash: implement extendable bucket hash test > > This commit changes the current rte_hash unit test to test the extendable > table feature and performance. > > Signed-off-by: Yipeng Wang > --- > test/test/test_hash.c | 151 > +++++++++++++++++++++++++++++++++++++++++++-- > test/test/test_hash_perf.c | 114 +++++++++++++++++++++++++--------- > 2 files changed, 230 insertions(+), 35 deletions(-) > > diff --git a/test/test/test_hash.c b/test/test/test_hash.c index > b3db9fd..c97095f 100644 > --- a/test/test/test_hash.c > +++ b/test/test/test_hash.c > @@ -660,6 +660,116 @@ static int test_full_bucket(void) > return 0; > } > > +/* > + * Similar to the test above (full bucket test), but for extendable buck= ets. > + */ > +static int test_extendable_bucket(void) { > +struct rte_hash_parameters params_pseudo_hash =3D { > +.name =3D "test5", > +.entries =3D 64, > +.key_len =3D sizeof(struct flow_key), /* 13 */ > +.hash_func =3D pseudo_hash, > +.hash_func_init_val =3D 0, > +.socket_id =3D 0, > +.extra_flag =3D RTE_HASH_EXTRA_FLAGS_EXT_TABLE > +}; > +struct rte_hash *handle; > +int pos[64]; > +int expected_pos[64]; > +unsigned int i; > +struct flow_key rand_keys[64]; > + > +for (i =3D 0; i < 64; i++) { > +rand_keys[i].port_dst =3D i; > +rand_keys[i].port_src =3D i+1; > +} > + > +handle =3D rte_hash_create(¶ms_pseudo_hash); > +RETURN_IF_ERROR(handle =3D=3D NULL, "hash creation failed"); > + > +/* Fill bucket */ > +for (i =3D 0; i < 64; i++) { > +pos[i] =3D rte_hash_add_key(handle, &rand_keys[i]); > +print_key_info("Add", &rand_keys[i], pos[i]); > +RETURN_IF_ERROR(pos[i] < 0, > +"failed to add key (pos[%u]=3D%d)", i, pos[i]); > +expected_pos[i] =3D pos[i]; > +} > + > +/* Lookup */ > +for (i =3D 0; i < 64; i++) { > +pos[i] =3D rte_hash_lookup(handle, &rand_keys[i]); > +print_key_info("Lkp", &rand_keys[i], pos[i]); > +RETURN_IF_ERROR(pos[i] !=3D expected_pos[i], > +"failed to find key (pos[%u]=3D%d)", i, pos[i]); > +} > + > +/* Add - update */ > +for (i =3D 0; i < 64; i++) { > +pos[i] =3D rte_hash_add_key(handle, &rand_keys[i]); > +print_key_info("Add", &rand_keys[i], pos[i]); > +RETURN_IF_ERROR(pos[i] !=3D expected_pos[i], > +"failed to add key (pos[%u]=3D%d)", i, pos[i]); > +} > + > +/* Lookup */ > +for (i =3D 0; i < 64; i++) { > +pos[i] =3D rte_hash_lookup(handle, &rand_keys[i]); > +print_key_info("Lkp", &rand_keys[i], pos[i]); > +RETURN_IF_ERROR(pos[i] !=3D expected_pos[i], > +"failed to find key (pos[%u]=3D%d)", i, pos[i]); > +} > + > +/* Delete 1 key, check other keys are still found */ > +pos[35] =3D rte_hash_del_key(handle, &rand_keys[35]); > +print_key_info("Del", &rand_keys[35], pos[35]); > +RETURN_IF_ERROR(pos[35] !=3D expected_pos[35], > +"failed to delete key (pos[1]=3D%d)", pos[35]); > +pos[20] =3D rte_hash_lookup(handle, &rand_keys[20]); > +print_key_info("Lkp", &rand_keys[20], pos[20]); > +RETURN_IF_ERROR(pos[20] !=3D expected_pos[20], > +"failed lookup after deleting key from same bucket " > +"(pos[20]=3D%d)", pos[20]); > + > +/* Go back to previous state */ > +pos[35] =3D rte_hash_add_key(handle, &rand_keys[35]); > +print_key_info("Add", &rand_keys[35], pos[35]); > +expected_pos[35] =3D pos[35]; > +RETURN_IF_ERROR(pos[35] < 0, "failed to add key (pos[1]=3D%d)", > +pos[35]); > + > +/* Delete */ > +for (i =3D 0; i < 64; i++) { > +pos[i] =3D rte_hash_del_key(handle, &rand_keys[i]); > +print_key_info("Del", &rand_keys[i], pos[i]); > +RETURN_IF_ERROR(pos[i] !=3D expected_pos[i], > +"failed to delete key (pos[%u]=3D%d)", i, pos[i]); > +} > + > +/* Lookup */ > +for (i =3D 0; i < 64; i++) { > +pos[i] =3D rte_hash_lookup(handle, &rand_keys[i]); > +print_key_info("Lkp", &rand_keys[i], pos[i]); > +RETURN_IF_ERROR(pos[i] !=3D -ENOENT, > +"fail: found non-existent key (pos[%u]=3D%d)", i, pos[i]); > +} > + > +/* Add again */ > +for (i =3D 0; i < 64; i++) { > +pos[i] =3D rte_hash_add_key(handle, &rand_keys[i]); > +print_key_info("Add", &rand_keys[i], pos[i]); > +RETURN_IF_ERROR(pos[i] < 0, > +"failed to add key (pos[%u]=3D%d)", i, pos[i]); > +expected_pos[i] =3D pos[i]; > +} > + > +rte_hash_free(handle); > + > +/* Cover the NULL case. */ > +rte_hash_free(0); > +return 0; > +} > + > > /***************************************************************** > *************/ > static int > fbk_hash_unit_test(void) > @@ -1096,7 +1206,7 @@ test_hash_creation_with_good_parameters(void) > * Test to see the average table utilization (entries added/max entries) > * before hitting a random entry that cannot be added > */ > -static int test_average_table_utilization(void) > +static int test_average_table_utilization(uint32_t ext_table) > { > struct rte_hash *handle; > uint8_t simple_key[MAX_KEYSIZE]; > @@ -1107,12 +1217,23 @@ static int test_average_table_utilization(void) > > printf("\n# Running test to determine average utilization" > "\n before adding elements begins to fail\n"); > +if (ext_table) > +printf("ext table is enabled\n"); > +else > +printf("ext table is disabled\n"); > + > printf("Measuring performance, please wait"); > fflush(stdout); > ut_params.entries =3D 1 << 16; > ut_params.name =3D "test_average_utilization"; > ut_params.hash_func =3D rte_jhash; > +if (ext_table) > +ut_params.extra_flag |=3D > RTE_HASH_EXTRA_FLAGS_EXT_TABLE; > +else > +ut_params.extra_flag &=3D > ~RTE_HASH_EXTRA_FLAGS_EXT_TABLE; > + > handle =3D rte_hash_create(&ut_params); > + > RETURN_IF_ERROR(handle =3D=3D NULL, "hash creation failed"); > > for (j =3D 0; j < ITERATIONS; j++) { My understanding is that when extendable table feature is enabled, we will = add entries to the full capacity. Hence the rte_hash_count and rte_hash_res= et should get tested in this test case. > @@ -1161,7 +1282,7 @@ static int test_average_table_utilization(void) > } > > #define NUM_ENTRIES 256 > -static int test_hash_iteration(void) > +static int test_hash_iteration(uint32_t ext_table) > { > struct rte_hash *handle; > unsigned i; > @@ -1177,6 +1298,11 @@ static int test_hash_iteration(void) > ut_params.name =3D "test_hash_iteration"; > ut_params.hash_func =3D rte_jhash; > ut_params.key_len =3D 16; > +if (ext_table) > +ut_params.extra_flag |=3D > RTE_HASH_EXTRA_FLAGS_EXT_TABLE; > +else > +ut_params.extra_flag &=3D > ~RTE_HASH_EXTRA_FLAGS_EXT_TABLE; > + > handle =3D rte_hash_create(&ut_params); > RETURN_IF_ERROR(handle =3D=3D NULL, "hash creation failed"); > > @@ -1186,8 +1312,13 @@ static int test_hash_iteration(void) > for (i =3D 0; i < ut_params.key_len; i++) > keys[added_keys][i] =3D rte_rand() % 255; > ret =3D rte_hash_add_key_data(handle, keys[added_keys], > data[added_keys]); > -if (ret < 0) > +if (ret < 0) { > +if (ext_table) { > +printf("Insertion failed for ext table\n"); > +goto err; > +} > break; > +} > } > I suggest we add a call to rte_hash_count() to verify that configured maxim= um number of entries are added, will be a good corner test for rte_hash_cou= nt as well. > /* Iterate through the hash table */ > @@ -1474,6 +1605,8 @@ test_hash(void) > return -1; > if (test_full_bucket() < 0) > return -1; > +if (test_extendable_bucket() < 0) > +return -1; > > if (test_fbk_hash_find_existing() < 0) > return -1; > @@ -1483,9 +1616,17 @@ test_hash(void) > return -1; > if (test_hash_creation_with_good_parameters() < 0) > return -1; > -if (test_average_table_utilization() < 0) > + > +/* ext table disabled */ > +if (test_average_table_utilization(0) < 0) > +return -1; > +if (test_hash_iteration(0) < 0) > +return -1; > + > +/* ext table enabled */ > +if (test_average_table_utilization(1) < 0) > return -1; > -if (test_hash_iteration() < 0) > +if (test_hash_iteration(1) < 0) > return -1; > > run_hash_func_tests(); > diff --git a/test/test/test_hash_perf.c b/test/test/test_hash_perf.c inde= x > 4d00c20..d169cd0 100644 > --- a/test/test/test_hash_perf.c > +++ b/test/test/test_hash_perf.c > @@ -18,7 +18,8 @@ > #include "test.h" > > #define MAX_ENTRIES (1 << 19) > -#define KEYS_TO_ADD (MAX_ENTRIES * 3 / 4) /* 75% table utilization */ > +#define KEYS_TO_ADD (MAX_ENTRIES) > +#define ADD_PERCENT 0.75 /* 75% table utilization */ > #define NUM_LOOKUPS (KEYS_TO_ADD * 5) /* Loop among keys added, > several times */ #define BUCKET_SIZE 8 #define NUM_BUCKETS > (MAX_ENTRIES / BUCKET_SIZE) @@ -77,7 +78,7 @@ static struct > rte_hash_parameters ut_params =3D { > > static int > create_table(unsigned int with_data, unsigned int table_index, > -unsigned int with_locks) > +unsigned int with_locks, unsigned int ext) > { > char name[RTE_HASH_NAMESIZE]; > > @@ -95,6 +96,9 @@ create_table(unsigned int with_data, unsigned int > table_index, > else > ut_params.extra_flag =3D 0; > > +if (ext) > +ut_params.extra_flag |=3D > RTE_HASH_EXTRA_FLAGS_EXT_TABLE; > + > ut_params.name =3D name; > ut_params.key_len =3D hashtest_key_lens[table_index]; > ut_params.socket_id =3D rte_socket_id(); @@ -116,15 +120,21 @@ > create_table(unsigned int with_data, unsigned int table_index, > > /* Shuffle the keys that have been added, so lookups will be totally ran= dom */ > static void -shuffle_input_keys(unsigned table_index) > +shuffle_input_keys(unsigned int table_index, unsigned int ext) > { > unsigned i; > uint32_t swap_idx; > uint8_t temp_key[MAX_KEYSIZE]; > hash_sig_t temp_signature; > int32_t temp_position; > +unsigned int keys_to_add; > + > +if (!ext) > +keys_to_add =3D KEYS_TO_ADD * ADD_PERCENT; > +else > +keys_to_add =3D KEYS_TO_ADD; > > -for (i =3D KEYS_TO_ADD - 1; i > 0; i--) { > +for (i =3D keys_to_add - 1; i > 0; i--) { > swap_idx =3D rte_rand() % i; > > memcpy(temp_key, keys[i], hashtest_key_lens[table_index]); > @@ -146,14 +156,20 @@ shuffle_input_keys(unsigned table_index) > * ALL can fit in hash table (no errors) > */ > static int > -get_input_keys(unsigned with_pushes, unsigned table_index) > +get_input_keys(unsigned int with_pushes, unsigned int table_index, > +unsigned int ext) > { > unsigned i, j; > unsigned bucket_idx, incr, success =3D 1; > uint8_t k =3D 0; > int32_t ret; > const uint32_t bucket_bitmask =3D NUM_BUCKETS - 1; > +unsigned int keys_to_add; > > +if (!ext) > +keys_to_add =3D KEYS_TO_ADD * ADD_PERCENT; > +else > +keys_to_add =3D KEYS_TO_ADD; > /* Reset all arrays */ > for (i =3D 0; i < MAX_ENTRIES; i++) > slot_taken[i] =3D 0; > @@ -170,7 +186,7 @@ get_input_keys(unsigned with_pushes, unsigned > table_index) > * Regardless a key has been added correctly or not (success), > * the next one to try will be increased by 1. > */ > -for (i =3D 0; i < KEYS_TO_ADD;) { > +for (i =3D 0; i < keys_to_add;) { > incr =3D 0; > if (i !=3D 0) { > keys[i][0] =3D ++k; > @@ -234,14 +250,20 @@ get_input_keys(unsigned with_pushes, unsigned > table_index) } > > static int > -timed_adds(unsigned with_hash, unsigned with_data, unsigned table_index) > +timed_adds(unsigned int with_hash, unsigned int with_data, > +unsigned int table_index, unsigned int ext) > { > unsigned i; > const uint64_t start_tsc =3D rte_rdtsc(); > void *data; > int32_t ret; > +unsigned int keys_to_add; > +if (!ext) > +keys_to_add =3D KEYS_TO_ADD * ADD_PERCENT; > +else > +keys_to_add =3D KEYS_TO_ADD; > > -for (i =3D 0; i < KEYS_TO_ADD; i++) { > +for (i =3D 0; i < keys_to_add; i++) { > data =3D (void *) ((uintptr_t) signatures[i]); > if (with_hash && with_data) { > ret =3D > rte_hash_add_key_with_hash_data(h[table_index], > @@ -283,22 +305,31 @@ timed_adds(unsigned with_hash, unsigned > with_data, unsigned table_index) > const uint64_t end_tsc =3D rte_rdtsc(); > const uint64_t time_taken =3D end_tsc - start_tsc; > > -cycles[table_index][ADD][with_hash][with_data] =3D > time_taken/KEYS_TO_ADD; > +cycles[table_index][ADD][with_hash][with_data] =3D > +time_taken/keys_to_add; > > return 0; > } > > static int > -timed_lookups(unsigned with_hash, unsigned with_data, unsigned > table_index) > +timed_lookups(unsigned int with_hash, unsigned int with_data, > +unsigned int table_index, unsigned int ext) > { > unsigned i, j; > const uint64_t start_tsc =3D rte_rdtsc(); > void *ret_data; > void *expected_data; > int32_t ret; > - > -for (i =3D 0; i < NUM_LOOKUPS/KEYS_TO_ADD; i++) { > -for (j =3D 0; j < KEYS_TO_ADD; j++) { > +unsigned int keys_to_add, num_lookups; > + > +if (!ext) { > +keys_to_add =3D KEYS_TO_ADD * ADD_PERCENT; > +num_lookups =3D NUM_LOOKUPS * ADD_PERCENT; > +} else { > +keys_to_add =3D KEYS_TO_ADD; > +num_lookups =3D NUM_LOOKUPS; > +} > +for (i =3D 0; i < num_lookups / keys_to_add; i++) { > +for (j =3D 0; j < keys_to_add; j++) { > if (with_hash && with_data) { > ret =3D > rte_hash_lookup_with_hash_data(h[table_index], > (const void *) keys[j], > @@ -351,13 +382,14 @@ timed_lookups(unsigned with_hash, unsigned > with_data, unsigned table_index) > const uint64_t end_tsc =3D rte_rdtsc(); > const uint64_t time_taken =3D end_tsc - start_tsc; > > -cycles[table_index][LOOKUP][with_hash][with_data] =3D > time_taken/NUM_LOOKUPS; > +cycles[table_index][LOOKUP][with_hash][with_data] =3D > +time_taken/num_lookups; > > return 0; > } > > static int > -timed_lookups_multi(unsigned with_data, unsigned table_index) > +timed_lookups_multi(unsigned int with_data, unsigned int table_index, > +unsigned int ext) > { > unsigned i, j, k; > int32_t positions_burst[BURST_SIZE]; > @@ -366,11 +398,20 @@ timed_lookups_multi(unsigned with_data, > unsigned table_index) > void *ret_data[BURST_SIZE]; > uint64_t hit_mask; > int ret; > +unsigned int keys_to_add, num_lookups; > + > +if (!ext) { > +keys_to_add =3D KEYS_TO_ADD * ADD_PERCENT; > +num_lookups =3D NUM_LOOKUPS * ADD_PERCENT; > +} else { > +keys_to_add =3D KEYS_TO_ADD; > +num_lookups =3D NUM_LOOKUPS; > +} > > const uint64_t start_tsc =3D rte_rdtsc(); > > -for (i =3D 0; i < NUM_LOOKUPS/KEYS_TO_ADD; i++) { > -for (j =3D 0; j < KEYS_TO_ADD/BURST_SIZE; j++) { > +for (i =3D 0; i < num_lookups/keys_to_add; i++) { > +for (j =3D 0; j < keys_to_add/BURST_SIZE; j++) { > for (k =3D 0; k < BURST_SIZE; k++) > keys_burst[k] =3D keys[j * BURST_SIZE + k]; > if (with_data) { > @@ -418,19 +459,25 @@ timed_lookups_multi(unsigned with_data, > unsigned table_index) > const uint64_t end_tsc =3D rte_rdtsc(); > const uint64_t time_taken =3D end_tsc - start_tsc; > > -cycles[table_index][LOOKUP_MULTI][0][with_data] =3D > time_taken/NUM_LOOKUPS; > +cycles[table_index][LOOKUP_MULTI][0][with_data] =3D > +time_taken/num_lookups; > > return 0; > } > > static int > -timed_deletes(unsigned with_hash, unsigned with_data, unsigned > table_index) > +timed_deletes(unsigned int with_hash, unsigned int with_data, > +unsigned int table_index, unsigned int ext) > { > unsigned i; > const uint64_t start_tsc =3D rte_rdtsc(); > int32_t ret; > +unsigned int keys_to_add; > +if (!ext) > +keys_to_add =3D KEYS_TO_ADD * ADD_PERCENT; > +else > +keys_to_add =3D KEYS_TO_ADD; > > -for (i =3D 0; i < KEYS_TO_ADD; i++) { > +for (i =3D 0; i < keys_to_add; i++) { > /* There are no delete functions with data, so just call two > functions */ > if (with_hash) > ret =3D rte_hash_del_key_with_hash(h[table_index], > @@ -450,7 +497,7 @@ timed_deletes(unsigned with_hash, unsigned > with_data, unsigned table_index) > const uint64_t end_tsc =3D rte_rdtsc(); > const uint64_t time_taken =3D end_tsc - start_tsc; > > -cycles[table_index][DELETE][with_hash][with_data] =3D > time_taken/KEYS_TO_ADD; > +cycles[table_index][DELETE][with_hash][with_data] =3D > +time_taken/keys_to_add; > > return 0; > } > @@ -468,7 +515,8 @@ reset_table(unsigned table_index) } > > static int > -run_all_tbl_perf_tests(unsigned int with_pushes, unsigned int with_locks= ) > +run_all_tbl_perf_tests(unsigned int with_pushes, unsigned int with_locks= , > +unsigned int ext) > { > unsigned i, j, with_data, with_hash; > > @@ -477,25 +525,25 @@ run_all_tbl_perf_tests(unsigned int with_pushes, > unsigned int with_locks) > > for (with_data =3D 0; with_data <=3D 1; with_data++) { > for (i =3D 0; i < NUM_KEYSIZES; i++) { > -if (create_table(with_data, i, with_locks) < 0) > +if (create_table(with_data, i, with_locks, ext) < 0) > return -1; > > -if (get_input_keys(with_pushes, i) < 0) > +if (get_input_keys(with_pushes, i, ext) < 0) > return -1; > for (with_hash =3D 0; with_hash <=3D 1; with_hash++) { > -if (timed_adds(with_hash, with_data, i) < 0) > +if (timed_adds(with_hash, with_data, i, ext) < > 0) > return -1; > > for (j =3D 0; j < NUM_SHUFFLES; j++) > -shuffle_input_keys(i); > +shuffle_input_keys(i, ext); > > -if (timed_lookups(with_hash, with_data, i) < 0) > +if (timed_lookups(with_hash, with_data, i, ext) > < 0) > return -1; > > -if (timed_lookups_multi(with_data, i) < 0) > +if (timed_lookups_multi(with_data, i, ext) < 0) > return -1; > > -if (timed_deletes(with_hash, with_data, i) < 0) > +if (timed_deletes(with_hash, with_data, i, ext) > < 0) > return -1; > > /* Print a dot to show progress on operations > */ @@ -631,10 +679,16 @@ test_hash_perf(void) > printf("\nALL ELEMENTS IN PRIMARY > LOCATION\n"); > else > printf("\nELEMENTS IN PRIMARY OR > SECONDARY LOCATION\n"); > -if (run_all_tbl_perf_tests(with_pushes, with_locks) < > 0) > +if (run_all_tbl_perf_tests(with_pushes, with_locks, 0) > < 0) > return -1; > } > } > + > +printf("\n EXTENDABLE BUCKETS PERFORMANCE\n"); > + > +if (run_all_tbl_perf_tests(1, 0, 1) < 0) > +return -1; > + > if (fbk_hash_perf_test() < 0) > return -1; > > -- > 2.7.4 IMPORTANT NOTICE: The contents of this email and any attachments are confid= ential and may also be privileged. If you are not the intended recipient, p= lease notify the sender immediately and do not disclose the contents to any= other person, use it for any purpose, or store or copy the information in = any medium. Thank you.