From patchwork Tue Oct 13 13:57:26 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jasvinder Singh X-Patchwork-Id: 7563 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id A9B899197; Tue, 13 Oct 2015 15:57:46 +0200 (CEST) Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by dpdk.org (Postfix) with ESMTP id 315D98E5D for ; Tue, 13 Oct 2015 15:57:36 +0200 (CEST) Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by orsmga103.jf.intel.com with ESMTP; 13 Oct 2015 06:57:35 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.17,678,1437462000"; d="scan'208";a="825858509" Received: from irvmail001.ir.intel.com ([163.33.26.43]) by fmsmga002.fm.intel.com with ESMTP; 13 Oct 2015 06:57:34 -0700 Received: from sivswdev02.ir.intel.com (sivswdev02.ir.intel.com [10.237.217.46]) by irvmail001.ir.intel.com (8.14.3/8.13.6/MailSET/Hub) with ESMTP id t9DDvX3I013275; Tue, 13 Oct 2015 14:57:33 +0100 Received: from sivswdev02.ir.intel.com (localhost [127.0.0.1]) by sivswdev02.ir.intel.com with ESMTP id t9DDvXx3000621; Tue, 13 Oct 2015 14:57:33 +0100 Received: (from jasvinde@localhost) by sivswdev02.ir.intel.com with id t9DDvXME000617; Tue, 13 Oct 2015 14:57:33 +0100 From: Jasvinder Singh To: dev@dpdk.org Date: Tue, 13 Oct 2015 14:57:26 +0100 Message-Id: <1444744652-573-3-git-send-email-jasvinder.singh@intel.com> X-Mailer: git-send-email 1.7.4.1 In-Reply-To: <1444744652-573-1-git-send-email-jasvinder.singh@intel.com> References: <1444744652-573-1-git-send-email-jasvinder.singh@intel.com> Subject: [dpdk-dev] [PATCH v2 2/8] librte_table: add key_mask parameter to 16-byte key hash parameters X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Fan Zhang This patch relates to ABI change proposed for librte_table. key_mask parameter is added for 16-byte key extendible bucket and LRU tables. Signed-off-by: Fan Zhang --- lib/librte_table/rte_table_hash.h | 6 ++++ lib/librte_table/rte_table_hash_key16.c | 53 ++++++++++++++++++++++++++++----- 2 files changed, 52 insertions(+), 7 deletions(-) diff --git a/lib/librte_table/rte_table_hash.h b/lib/librte_table/rte_table_hash.h index ef65355..e2c60e1 100644 --- a/lib/librte_table/rte_table_hash.h +++ b/lib/librte_table/rte_table_hash.h @@ -263,6 +263,9 @@ struct rte_table_hash_key16_lru_params { /** Byte offset within packet meta-data where the key is located */ uint32_t key_offset; + + /** Bit-mask to be AND-ed to the key on lookup */ + uint8_t *key_mask; }; /** LRU hash table operations for pre-computed key signature */ @@ -290,6 +293,9 @@ struct rte_table_hash_key16_ext_params { /** Byte offset within packet meta-data where the key is located */ uint32_t key_offset; + + /** Bit-mask to be AND-ed to the key on lookup */ + uint8_t *key_mask; }; /** Extendible bucket operations for pre-computed key signature */ diff --git a/lib/librte_table/rte_table_hash_key16.c b/lib/librte_table/rte_table_hash_key16.c index f6a3306..ffd3249 100644 --- a/lib/librte_table/rte_table_hash_key16.c +++ b/lib/librte_table/rte_table_hash_key16.c @@ -85,6 +85,7 @@ struct rte_table_hash { uint32_t bucket_size; uint32_t signature_offset; uint32_t key_offset; + uint64_t key_mask[2]; rte_table_hash_op_hash f_hash; uint64_t seed; @@ -164,6 +165,14 @@ rte_table_hash_create_key16_lru(void *params, f->f_hash = p->f_hash; f->seed = p->seed; + if (p->key_mask != NULL) { + f->key_mask[0] = ((uint64_t *)p->key_mask)[0]; + f->key_mask[1] = ((uint64_t *)p->key_mask)[1]; + } else { + f->key_mask[0] = 0xFFFFFFFFFFFFFFFFLLU; + f->key_mask[1] = 0xFFFFFFFFFFFFFFFFLLU; + } + for (i = 0; i < n_buckets; i++) { struct rte_bucket_4_16 *bucket; @@ -384,6 +393,14 @@ rte_table_hash_create_key16_ext(void *params, for (i = 0; i < n_buckets_ext; i++) f->stack[i] = i; + if (p->key_mask != NULL) { + f->key_mask[0] = (((uint64_t *)p->key_mask)[0]); + f->key_mask[1] = (((uint64_t *)p->key_mask)[1]); + } else { + f->key_mask[0] = 0xFFFFFFFFFFFFFFFFLLU; + f->key_mask[1] = 0xFFFFFFFFFFFFFFFFLLU; + } + return f; } @@ -609,11 +626,14 @@ rte_table_hash_entry_delete_key16_ext( void *a; \ uint64_t pkt_mask; \ uint64_t *key; \ + uint64_t hash_key_buffer[2]; \ uint32_t pos; \ \ key = RTE_MBUF_METADATA_UINT64_PTR(mbuf2, f->key_offset);\ + hash_key_buffer[0] = key[0] & f->key_mask[0]; \ + hash_key_buffer[1] = key[1] & f->key_mask[1]; \ \ - lookup_key16_cmp(key, bucket2, pos); \ + lookup_key16_cmp(hash_key_buffer, bucket2, pos); \ \ pkt_mask = (bucket2->signature[pos] & 1LLU) << pkt2_index;\ pkts_mask_out |= pkt_mask; \ @@ -631,11 +651,14 @@ rte_table_hash_entry_delete_key16_ext( void *a; \ uint64_t pkt_mask, bucket_mask; \ uint64_t *key; \ + uint64_t hash_key_buffer[2]; \ uint32_t pos; \ \ key = RTE_MBUF_METADATA_UINT64_PTR(mbuf2, f->key_offset);\ + hash_key_buffer[0] = key[0] & f->key_mask[0]; \ + hash_key_buffer[1] = key[1] & f->key_mask[1]; \ \ - lookup_key16_cmp(key, bucket2, pos); \ + lookup_key16_cmp(hash_key_buffer, bucket2, pos); \ \ pkt_mask = (bucket2->signature[pos] & 1LLU) << pkt2_index;\ pkts_mask_out |= pkt_mask; \ @@ -658,12 +681,15 @@ rte_table_hash_entry_delete_key16_ext( void *a; \ uint64_t pkt_mask, bucket_mask; \ uint64_t *key; \ + uint64_t hash_key_buffer[2]; \ uint32_t pos; \ \ bucket = buckets[pkt_index]; \ key = keys[pkt_index]; \ + hash_key_buffer[0] = key[0] & f->key_mask[0]; \ + hash_key_buffer[1] = key[1] & f->key_mask[1]; \ \ - lookup_key16_cmp(key, bucket, pos); \ + lookup_key16_cmp(hash_key_buffer, bucket, pos); \ \ pkt_mask = (bucket->signature[pos] & 1LLU) << pkt_index;\ pkts_mask_out |= pkt_mask; \ @@ -749,13 +775,19 @@ rte_table_hash_entry_delete_key16_ext( void *a20, *a21; \ uint64_t pkt20_mask, pkt21_mask; \ uint64_t *key20, *key21; \ + uint64_t hash_key_buffer20[2]; \ + uint64_t hash_key_buffer21[2]; \ uint32_t pos20, pos21; \ \ key20 = RTE_MBUF_METADATA_UINT64_PTR(mbuf20, f->key_offset);\ key21 = RTE_MBUF_METADATA_UINT64_PTR(mbuf21, f->key_offset);\ + hash_key_buffer20[0] = key20[0] & f->key_mask[0]; \ + hash_key_buffer20[1] = key20[1] & f->key_mask[1]; \ + hash_key_buffer21[0] = key21[0] & f->key_mask[0]; \ + hash_key_buffer21[1] = key21[1] & f->key_mask[1]; \ \ - lookup_key16_cmp(key20, bucket20, pos20); \ - lookup_key16_cmp(key21, bucket21, pos21); \ + lookup_key16_cmp(hash_key_buffer20, bucket20, pos20); \ + lookup_key16_cmp(hash_key_buffer21, bucket21, pos21); \ \ pkt20_mask = (bucket20->signature[pos20] & 1LLU) << pkt20_index;\ pkt21_mask = (bucket21->signature[pos21] & 1LLU) << pkt21_index;\ @@ -778,13 +810,19 @@ rte_table_hash_entry_delete_key16_ext( void *a20, *a21; \ uint64_t pkt20_mask, pkt21_mask, bucket20_mask, bucket21_mask;\ uint64_t *key20, *key21; \ + uint64_t hash_key_buffer20[2]; \ + uint64_t hash_key_buffer21[2]; \ uint32_t pos20, pos21; \ \ key20 = RTE_MBUF_METADATA_UINT64_PTR(mbuf20, f->key_offset);\ key21 = RTE_MBUF_METADATA_UINT64_PTR(mbuf21, f->key_offset);\ + hash_key_buffer20[0] = key20[0] & f->key_mask[0]; \ + hash_key_buffer20[1] = key20[1] & f->key_mask[1]; \ + hash_key_buffer21[0] = key21[0] & f->key_mask[0]; \ + hash_key_buffer21[1] = key21[1] & f->key_mask[1]; \ \ - lookup_key16_cmp(key20, bucket20, pos20); \ - lookup_key16_cmp(key21, bucket21, pos21); \ + lookup_key16_cmp(hash_key_buffer20, bucket20, pos20); \ + lookup_key16_cmp(hash_key_buffer21, bucket21, pos21); \ \ pkt20_mask = (bucket20->signature[pos20] & 1LLU) << pkt20_index;\ pkt21_mask = (bucket21->signature[pos21] & 1LLU) << pkt21_index;\ @@ -1115,3 +1153,4 @@ struct rte_table_ops rte_table_hash_key16_ext_ops = { .f_lookup = rte_table_hash_lookup_key16_ext, .f_stats = rte_table_hash_key16_stats_read, }; +