From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from emea01-db3-obe.outbound.protection.outlook.com (mail-db3on0073.outbound.protection.outlook.com [157.55.234.73]) by dpdk.org (Postfix) with ESMTP id 41E625949 for ; Wed, 22 Jul 2015 09:55:42 +0200 (CEST) Authentication-Results: dpdk.org; dkim=none (message not signed) header.d=none; Received: from zhigangTHINK (124.207.145.166) by AM2PR02MB0804.eurprd02.prod.outlook.com (10.163.146.24) with Microsoft SMTP Server (TLS) id 15.1.219.17; Wed, 22 Jul 2015 07:55:39 +0000 From: Tony Lu To: 'Vladimir Medvedkin' , References: <1434735073-27414-1-git-send-email-medvedkinv@gmail.com> <1435707620-17383-1-git-send-email-medvedkinv@gmail.com> In-Reply-To: <1435707620-17383-1-git-send-email-medvedkinv@gmail.com> Date: Wed, 22 Jul 2015 15:55:22 +0800 Message-ID: <001b01d0c453$cda840f0$68f8c2d0$@com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: AdCzjn7uDtbItbcpT0exYXhkeN5ZqQQw8Qpg Content-Language: zh-cn X-Originating-IP: [124.207.145.166] X-ClientProxiedBy: CY1PR21CA0086.namprd21.prod.outlook.com (25.164.213.12) To AM2PR02MB0804.eurprd02.prod.outlook.com (25.163.146.24) X-Microsoft-Exchange-Diagnostics: 1; AM2PR02MB0804; 2:29c0orDeJBgg7lJ6V8Ehj67OVYrJDTBxynAIPCzFT2Qd+SSSLHzyPb6uPWcTTkxG; 3:duu65uHy5TRot7xlYj4G87vc3Banr4bOw0KgUxu576tEC3CB6JPgCnHfCrtaBPRCQuCHNQjSPPD23EgZGvA+BCgmlaa4om1B1iXysJNftqEqSmNkO2gn/86dw1wC2g+aht7XdPV1M0rCgusOXGv6Yw==; 25:q7VIJJN2Iqdfxo/4J9KQDtJY+v3edEnVHXRf85jZM9K5NM/BbnjQja2FzoQuWu619jcydiQ/IYgz9zGoOwE5tj41nkHe1wdNuKJhakFxSlgrwVJ/Xrtvn5UChHZAwI5l3tdlaHCEd8wC9HOklmgZ1RQFLvL6EnHB/Ir8dfVOiwIfaX/KlXd27mR03gEwibX9b4erLM2L497nvYmRUZS0O6vv0eV320yLdqo4o39lR5gaVMXrONeJzug/nA5ZT6fH/bZkENM64n5OzfkgIp+wAw==; 20:MD1cYPuZLLFNUUpu9h9DxnKn6XhOaBGP9Xxxy6/du2bP8mBpvoIUdkUKxGSF0Bb5gwo9fYzzGoGvbrGWbEsND/y7dbzJc4608bgUtI9R8fny2vPCEs31mWhD3qMVcA7OfQSf1O1M/qjMs267tG5q4KmfZswS4WhamQ79Uhu6NzA= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:AM2PR02MB0804; AM2PR02MB0804: X-MS-Exchange-Organization-RulesExecuted X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(5005006)(3002001); SRVR:AM2PR02MB0804; BCL:0; PCL:0; RULEID:; SRVR:AM2PR02MB0804; X-Microsoft-Exchange-Diagnostics: 1; AM2PR02MB0804; 4:lBMoyufdF4TSQscIQ1iVA8YRXq2Sm6iHI/440eYN98MOprmlVqy/JqUAOGY4kT6/eTKDJWDhUKZSaxQ9rP6w46x6jLZwd6xlKlM2dyFiwnZCKuWH7Cjr1pxFCSA8V5WFbWecAAGJLu+O05gpBayf7DeJMsi9loriDelu1nVDy+/OuBJ6Bj0J51rKrsTkTvaqzuX7tG498+1ACLdNEBRT/MFIMqX1jrqu6pRMNylyldSVsgCj9D+bt8C36I+UmmdowA/vQGWnZNYNZKp5Ve9VtPCMm6qw09eO9pd6Ef5TQ1U= X-Forefront-PRVS: 0645BEB7AA X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(6009001)(377454003)(13464003)(86362001)(2950100001)(107886002)(62966003)(5001960100002)(61296003)(77156002)(77096005)(102836002)(40100003)(46102003)(14726001)(97756001)(87976001)(42186005)(5001770100001)(50986999)(2656002)(84116002)(59696002)(76176999)(575784001)(122386002)(50226001)(33716001)(19580395003)(19580405001)(46406003)(33646002)(189998001)(50466002)(96836002)(92566002)(47776003)(66066001)(23726002); DIR:OUT; SFP:1101; SCL:1; SRVR:AM2PR02MB0804; H:zhigangTHINK; FPR:; SPF:None; MLV:sfv; LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; AM2PR02MB0804; 23:XGCkLiAk+la/7RW82LEmhJm960nURy0574FR29d/N?= =?us-ascii?Q?x0Y4oFzQgfklUoS2yq8wU3cBeV0QzFcnvUja4h7hbtVLcj8IGqVIz2mnlvry?= =?us-ascii?Q?kOkW8t10kk3Tj6Voo8QB+wfq0d5PgTHfExtnVG2aj1yra2wFM3Ome+8UHHmi?= =?us-ascii?Q?EcQ8gCXcBSmeIsAgf4LQWap1PSra9pcAU0TtuROPOOpjh0/BV89YgOanH0uW?= =?us-ascii?Q?07uywg+aA+mVx9JxD1hER3QXnbC4tkKPsh36/27xBtKEeOUOOlk1Y9ITOTcU?= =?us-ascii?Q?XWZn0Y8jMxLAucB7gF4ooOVzZHPLpJPqV6k63P6gQCYHWbwX93I+QA38yHCL?= =?us-ascii?Q?+F17hSpDmRPGn3u8g/wvWdRzJnoAFOWzvmp9F0QTCiygsV1Mh4iHcf3Z/k0o?= =?us-ascii?Q?kGOmmliAE040C7mmBi2SNbNR71+TPrDaiR/if4ACUz/NdXuQCLzh35vaKU69?= =?us-ascii?Q?GAjK4CQCzJNZ/yVkPcsvFLDb2j8yniqxANpTI91/lEdx6KscasHXfz3j3GIr?= =?us-ascii?Q?faHNslZb2Io9fDXdYr2iduCNQkXHs8yGU1tYX+8JDiNuBR8H2UmcOyes9lIs?= =?us-ascii?Q?0xu5SbXq3L+qXJtQw7fekuh+eEDr26q7xQkKKB+prSPp5CyUgQvCBgsO75iu?= =?us-ascii?Q?69NelCnXpjgh1huBPHFC6yglKhSOHmHlS1NzwOudmgETMXmbsO1GXj+8zQ5H?= =?us-ascii?Q?C4YdaO0dmFsDA3Aitz8++5nHbFloKcxAJwPvYdXhvaCtna4enMsgyFkdmZuY?= =?us-ascii?Q?HRMHL+J3TtBA84ut7bPr7Qah0LaLMAFM8fTVWxJPIYAJFawTlt0OEh//G9dn?= =?us-ascii?Q?sC5h1wljOI8Zie/eamOWOJHWVQ78datCvDi2tJw2UOfFBJ/72LQxywSvNKZf?= =?us-ascii?Q?k9h9fPmHzVqkfijMONPdxZuvuCCoWbYt/EPUa77J/xj/gaya8aGQSFvH5Srw?= =?us-ascii?Q?/dfjYeb4efs5snRz577623yNOxdX5009Sz+U4OpdWzId9kfmPfcYC2NnQ/zD?= =?us-ascii?Q?lv1nxMEhsdbLbrT0iMC7+uzZprHMlbdnt5f3mYcI5cq3A=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1; AM2PR02MB0804; 5:0VdCbszTo2iJs+Nr4uffg22V5iR1os/NWjx2ljEeUij/epzWBfEFRh3WTXPgTYEQiTshvwYXEFkijgbU9KcAIEVysdqlcoHSMPBjkfzGy3o1+PRi+UfE824LxCjWpa3RNaGvwW6bKgoAYuATooxBEw==; 24:Why11XVBP81jMh90ppehauOZfXUIBPkWVRUq2WwuVJgx9OO/YFVU0Ff15XoCZu8jq41fBoAKF40zczPmeKbPy6oYL8k3ADBSGgI+MEomM1o=; 20:CnlM8Fi2zFcF9Gjno6RhNP3HDFlmxk3elVbWqVNH9EGggqEvTmOUw02OOLaODroqDiERFxo8J03q5JVXlEs8hg== SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: ezchip.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Jul 2015 07:55:39.0129 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM2PR02MB0804 Subject: Re: [dpdk-dev] [PATCH v6] Add toeplitz hash algorithm used by RSS 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: , X-List-Received-Date: Wed, 22 Jul 2015 07:55:42 -0000 Hi, Vladimir When compiling thash for no-X86 arches, it fails with the following errors. I wonder if it is possible to make the thash library arch-independent? == Build app/test CC test_thash.o In file included from /u/zlu.bjg/git/dpdk.org/app/test/test_thash.c:40: /u/zlu.bjg/git/dpdk.org/tile-tilegx-linuxapp-gcc/include/rte_thash.h:56:22: error: rte_vect.h: No such file or directory In file included from /u/zlu.bjg/git/dpdk.org/app/test/test_thash.c:40: /u/zlu.bjg/git/dpdk.org/tile-tilegx-linuxapp-gcc/include/rte_thash.h:62: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'rte_thash_ipv6_bswap_mask' /u/zlu.bjg/git/dpdk.org/tile-tilegx-linuxapp-gcc/include/rte_thash.h:129: error: requested alignment is not a constant /u/zlu.bjg/git/dpdk.org/tile-tilegx-linuxapp-gcc/include/rte_thash.h: In function 'rte_thash_load_v6_addrs': /u/zlu.bjg/git/dpdk.org/tile-tilegx-linuxapp-gcc/include/rte_thash.h:160: error: '__m128i' undeclared (first use in this function) /u/zlu.bjg/git/dpdk.org/tile-tilegx-linuxapp-gcc/include/rte_thash.h:160: error: (Each undeclared identifier is reported only once /u/zlu.bjg/git/dpdk.org/tile-tilegx-linuxapp-gcc/include/rte_thash.h:160: error: for each function it appears in.) /u/zlu.bjg/git/dpdk.org/tile-tilegx-linuxapp-gcc/include/rte_thash.h:160: error: expected ';' before 'ipv6' /u/zlu.bjg/git/dpdk.org/tile-tilegx-linuxapp-gcc/include/rte_thash.h:161: error: expected expression before ')' token /u/zlu.bjg/git/dpdk.org/tile-tilegx-linuxapp-gcc/include/rte_thash.h:163: error: 'ipv6' undeclared (first use in this function) /u/zlu.bjg/git/dpdk.org/tile-tilegx-linuxapp-gcc/include/rte_thash.h:163: warning: implicit declaration of function '_mm_loadu_si128' /u/zlu.bjg/git/dpdk.org/tile-tilegx-linuxapp-gcc/include/rte_thash.h:163: warning: nested extern declaration of '_mm_loadu_si128' /u/zlu.bjg/git/dpdk.org/tile-tilegx-linuxapp-gcc/include/rte_thash.h:163: error: expected ')' before '__m128i' /u/zlu.bjg/git/dpdk.org/tile-tilegx-linuxapp-gcc/include/rte_thash.h:163: warning: type defaults to 'int' in declaration of 'type name' /u/zlu.bjg/git/dpdk.org/tile-tilegx-linuxapp-gcc/include/rte_thash.h:163: warning: cast from pointer to integer of different size /u/zlu.bjg/git/dpdk.org/tile-tilegx-linuxapp-gcc/include/rte_thash.h:164: error: expected expression before ')' token /u/zlu.bjg/git/dpdk.org/tile-tilegx-linuxapp-gcc/include/rte_thash.h:158: warning: unused parameter 'targ' make[3]: *** [test_thash.o] Error 1 make[2]: *** [test] Error 2 make[1]: *** [app] Error 2 make: *** [all] Error 2 Thanks -Zhigang Lu >-----Original Message----- >From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Vladimir Medvedkin >Sent: Wednesday, July 01, 2015 7:40 AM >To: dev@dpdk.org >Subject: [dpdk-dev] [PATCH v6] Add toeplitz hash algorithm used by RSS > >Software implementation of the Toeplitz hash function used by RSS. >Can be used either for packet distribution on single queue NIC or for simulating >of RSS computation on specific NIC (for example after GRE header >decapsulating). > >v6 changes >- Fix compilation error >- Rename some defines and function > >v5 changes >- Fix errors reported by checkpatch.pl > >v4 changes >- Fix copyright >- rename bswap_mask constant, add rte_ prefix >- change rte_ipv[46]_tuple struct >- change rte_thash_load_v6_addr prototype > >v3 changes >- Rework API to be more generic >- Add sctp_tag into tuple > >v2 changes >- Add ipv6 support >- Various style fixes > >Signed-off-by: Vladimir Medvedkin >--- > lib/librte_hash/Makefile | 1 + > lib/librte_hash/rte_thash.h | 231 >++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 232 insertions(+) > create mode 100644 lib/librte_hash/rte_thash.h > >diff --git a/lib/librte_hash/Makefile b/lib/librte_hash/Makefile index >3696cb1..981230b 100644 >--- a/lib/librte_hash/Makefile >+++ b/lib/librte_hash/Makefile >@@ -49,6 +49,7 @@ SRCS-$(CONFIG_RTE_LIBRTE_HASH) += rte_fbk_hash.c >SYMLINK-$(CONFIG_RTE_LIBRTE_HASH)-include := rte_hash.h >SYMLINK-$(CONFIG_RTE_LIBRTE_HASH)-include += rte_hash_crc.h >SYMLINK-$(CONFIG_RTE_LIBRTE_HASH)-include += rte_jhash.h >+SYMLINK-$(CONFIG_RTE_LIBRTE_HASH)-include += rte_thash.h > SYMLINK-$(CONFIG_RTE_LIBRTE_HASH)-include += rte_fbk_hash.h > > # this lib needs eal >diff --git a/lib/librte_hash/rte_thash.h b/lib/librte_hash/rte_thash.h new file >mode 100644 index 0000000..1808f47 >--- /dev/null >+++ b/lib/librte_hash/rte_thash.h >@@ -0,0 +1,231 @@ >+/*- >+ * BSD LICENSE >+ * >+ * Copyright(c) 2015 Vladimir Medvedkin >+ * All rights reserved. >+ * >+ * Redistribution and use in source and binary forms, with or without >+ * modification, are permitted provided that the following conditions >+ * are met: >+ * >+ * * Redistributions of source code must retain the above copyright >+ * notice, this list of conditions and the following disclaimer. >+ * * Redistributions in binary form must reproduce the above copyright >+ * notice, this list of conditions and the following disclaimer in >+ * the documentation and/or other materials provided with the >+ * distribution. >+ * * Neither the name of Intel Corporation nor the names of its >+ * contributors may be used to endorse or promote products derived >+ * from this software without specific prior written permission. >+ * >+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND >CONTRIBUTORS >+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT >NOT >+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND >FITNESS FOR >+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE >COPYRIGHT >+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, >INCIDENTAL, >+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT >NOT >+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS >OF USE, >+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED >AND ON ANY >+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR >TORT >+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF >THE USE >+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH >DAMAGE. >+ */ >+ >+#ifndef _RTE_THASH_H >+#define _RTE_THASH_H >+ >+/** >+ * @file >+ * >+ * toeplitz hash functions. >+ */ >+ >+#ifdef __cplusplus >+extern "C" { >+#endif >+ >+/** >+ * Software implementation of the Toeplitz hash function used by RSS. >+ * Can be used either for packet distribution on single queue NIC >+ * or for simulating of RSS computation on specific NIC (for example >+ * after GRE header decapsulating) >+ */ >+ >+#include >+#include >+#include >+#include >+ >+/* Byte swap mask used for converting IPv6 address >+ * 4-byte chunks to CPU byte order >+ */ >+static const __m128i rte_thash_ipv6_bswap_mask = { >+ 0x0405060700010203, 0x0C0D0E0F08090A0B}; >+ >+/** >+ * length in dwords of input tuple to >+ * calculate hash of ipv4 header only >+ */ >+#define RTE_THASH_V4_L3_LEN ((sizeof(struct rte_ipv4_tuple) - \ >+ sizeof(((struct rte_ipv4_tuple *)0)->sctp_tag)) / 4) >+ >+/** >+ * length in dwords of input tuple to >+ * calculate hash of ipv4 header + >+ * transport header >+ */ >+#define RTE_THASH_V4_L4_LEN ((sizeof(struct rte_ipv4_tuple)) / 4) >+ >+/** >+ * length in dwords of input tuple to >+ * calculate hash of ipv6 header only >+ */ >+#define RTE_THASH_V6_L3_LEN ((sizeof(struct rte_ipv6_tuple) - \ >+ sizeof(((struct rte_ipv6_tuple *)0)->sctp_tag)) / 4) >+ >+/** >+ * length in dwords of input tuple to >+ * calculate hash of ipv6 header + >+ * transport header >+ */ >+#define RTE_THASH_V6_L4_LEN ((sizeof(struct rte_ipv6_tuple)) / 4) >+ >+/** >+ * IPv4 tuple >+ * addreses and ports/sctp_tag have to be CPU byte order */ struct >+rte_ipv4_tuple { >+ uint32_t src_addr; >+ uint32_t dst_addr; >+ union { >+ struct { >+ uint16_t dport; >+ uint16_t sport; >+ }; >+ uint32_t sctp_tag; >+ }; >+}; >+ >+/** >+ * IPv6 tuple >+ * Addresses have to be filled by rte_thash_load_v6_addr() >+ * ports/sctp_tag have to be CPU byte order */ struct rte_ipv6_tuple { >+ uint8_t src_addr[16]; >+ uint8_t dst_addr[16]; >+ union { >+ struct { >+ uint16_t dport; >+ uint16_t sport; >+ }; >+ uint32_t sctp_tag; >+ }; >+}; >+ >+union rte_thash_tuple { >+ struct rte_ipv4_tuple v4; >+ struct rte_ipv6_tuple v6; >+} __attribute__((aligned(XMM_SIZE))); >+ >+/** >+ * Prepare special converted key to use with rte_softrss_be() >+ * @param orig >+ * pointer to original RSS key >+ * @param targ >+ * pointer to target RSS key >+ * @param len >+ * RSS key length >+ */ >+static inline void >+rte_convert_rss_key(const uint32_t *orig, uint32_t *targ, int len) { >+ int i; >+ >+ for (i = 0; i < (len >> 2); i++) >+ targ[i] = rte_be_to_cpu_32(orig[i]); >+} >+ >+/** >+ * Prepare and load IPv6 addresses (src and dst) >+ * into target tuple >+ * @param orig >+ * Pointer to ipv6 header of the original packet >+ * @param targ >+ * Pointer to rte_ipv6_tuple structure >+ */ >+static inline void >+rte_thash_load_v6_addrs(const struct ipv6_hdr *orig, union >+rte_thash_tuple *targ) { >+ __m128i ipv6 = _mm_loadu_si128((const __m128i *)orig->src_addr); >+ *(__m128i *)targ->v6.src_addr = >+ _mm_shuffle_epi8(ipv6, rte_thash_ipv6_bswap_mask); >+ ipv6 = _mm_loadu_si128((const __m128i *)orig->dst_addr); >+ *(__m128i *)targ->v6.dst_addr = >+ _mm_shuffle_epi8(ipv6, rte_thash_ipv6_bswap_mask); } >+ >+/** >+ * Generic implementation. Can be used with original rss_key >+ * @param input_tuple >+ * Pointer to input tuple >+ * @param input_len >+ * Length of input_tuple in 4-bytes chunks >+ * @param rss_key >+ * Pointer to RSS hash key. >+ * @return >+ * Calculated hash value. >+ */ >+static inline uint32_t >+rte_softrss(uint32_t *input_tuple, uint32_t input_len, >+ const uint8_t *rss_key) >+{ >+ uint32_t i, j, ret = 0; >+ >+ for (j = 0; j < input_len; j++) { >+ for (i = 0; i < 32; i++) { >+ if (input_tuple[j] & (1 << (31 - i))) { >+ ret ^= rte_cpu_to_be_32(((const uint32_t *)rss_key)[j]) << i >| >+ (uint32_t)((uint64_t)(rte_cpu_to_be_32(((const >uint32_t *)rss_key)[j + 1])) >> >+ (32 - i)); >+ } >+ } >+ } >+ return ret; >+} >+ >+/** >+ * Optimized implementation. >+ * If you want the calculated hash value matches NIC RSS value >+ * you have to use special converted key with rte_convert_rss_key() fn. >+ * @param input_tuple >+ * Pointer to input tuple >+ * @param input_len >+ * Length of input_tuple in 4-bytes chunks >+ * @param *rss_key >+ * Pointer to RSS hash key. >+ * @return >+ * Calculated hash value. >+ */ >+static inline uint32_t >+rte_softrss_be(uint32_t *input_tuple, uint32_t input_len, >+ const uint8_t *rss_key) >+{ >+ uint32_t i, j, ret = 0; >+ >+ for (j = 0; j < input_len; j++) { >+ for (i = 0; i < 32; i++) { >+ if (input_tuple[j] & (1 << (31 - i))) { >+ ret ^= ((const uint32_t *)rss_key)[j] << i | >+ (uint32_t)((uint64_t)(((const uint32_t *)rss_key)[j + >1]) >> (32 - i)); >+ } >+ } >+ } >+ return ret; >+} >+ >+#ifdef __cplusplus >+} >+#endif >+ >+#endif /* _RTE_THASH_H */ >-- >1.8.3.2