From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id BB1D4430C3; Mon, 21 Aug 2023 18:11:55 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 98C57432B1; Mon, 21 Aug 2023 18:10:16 +0200 (CEST) Received: from mail-pl1-f174.google.com (mail-pl1-f174.google.com [209.85.214.174]) by mails.dpdk.org (Postfix) with ESMTP id 4B08A4329C for ; Mon, 21 Aug 2023 18:10:11 +0200 (CEST) Received: by mail-pl1-f174.google.com with SMTP id d9443c01a7336-1bf55a81eeaso10526995ad.0 for ; Mon, 21 Aug 2023 09:10:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=networkplumber-org.20221208.gappssmtp.com; s=20221208; t=1692634210; x=1693239010; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=29zSp5QQZDR8i9eDwDM8kGdPdjyl1/FORyCUzyk7YZE=; b=F6uDdcML1aV8Fedahmz9KHXRWEsdvE4PyxkRNSRENu6uzOXY0GcQGJMRo9ZKOMsJgU rHLwo+ipPiitlxrWBJbzdjj/UzmfmVHok3u39KSZ+r66vWILgJL6NC4ZrHhJXdvw4bP8 vbi7Bd/F84btbam98LGe4Mqdl63pd5NI3zX52OxIiSDQiAl0PU4gigAKHJ5chYfuarR1 Oq7MNpgmaI57GgGqsOMS0x7ULcVsw6f4VFmpKWUcEjKlOb63YesFEyqZ0wLSwscbEjZv uM+lmXpq7QTmcygWvaKPmBqt42VdeT5DhTm23h9nwIPazXHiNXmfQ2UuSYrMnptopePe Aopg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1692634210; x=1693239010; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=29zSp5QQZDR8i9eDwDM8kGdPdjyl1/FORyCUzyk7YZE=; b=Y32qZ58yANbJ2Ggt463KUdExlKYghwKPBGyG1xIqNOfQ9s8RvcPdc1omGGpY7rN/Jh B9AkCqRhe5KWRKl/+mPPOvpNFThc0Gy4k5iKXfDvb5hVcXXEV9J6vHCHxjSFJT4o3c29 ViA8Gz5xBbnbEo2JPyNOdMNnVv5pE6ny1z19t8K/eEbAOAUMnMcA12SYtLe4jr1lwtIS +e3FxOdqv8dU7H9G4BWROu8Jby7qv4OoQ+l8/fIHP3/D3cZ+OS0HixTSEDe8dRsAEog4 nYek9ue6E5W5+li0e436iCxWgINjp9sTCE5nxF5wISyaFmAJ9HkFzE6xu1QB7NM46P+e 4edg== X-Gm-Message-State: AOJu0YxMZooE7ZV8SSZoW68RUX12B2IKHd0rR1jtSp1nFKD+DuheKkvu cOF7l8dtuec6Y2eCwiU7ZmupHtAcGiYxZ3rjmAiDRhD9 X-Google-Smtp-Source: AGHT+IEAdm157KNsBdMBhgUtmxqq90O5+oGsQcoNmURSr206Dmq8kZuEi/Z5w9J+EKMOyo6OM7ndpw== X-Received: by 2002:a17:902:eccd:b0:1b8:5b70:2988 with SMTP id a13-20020a170902eccd00b001b85b702988mr5104162plh.30.1692634210221; Mon, 21 Aug 2023 09:10:10 -0700 (PDT) Received: from hermes.local (204-195-127-207.wavecable.com. [204.195.127.207]) by smtp.gmail.com with ESMTPSA id i1-20020a17090332c100b001bf2dcfe352sm7208159plr.234.2023.08.21.09.10.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 21 Aug 2023 09:10:09 -0700 (PDT) From: Stephen Hemminger To: dev@dpdk.org Cc: Stephen Hemminger , Ruifeng Wang , Yipeng Wang , Sameh Gobriel , Bruce Richardson , Vladimir Medvedkin Subject: [PATCH v13 17/21] hash: move rte_hash_set_alg out header Date: Mon, 21 Aug 2023 09:09:17 -0700 Message-Id: <20230821160921.383832-18-stephen@networkplumber.org> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230821160921.383832-1-stephen@networkplumber.org> References: <20230329234049.11071-1-stephen@networkplumber.org> <20230821160921.383832-1-stephen@networkplumber.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org The code for setting algorithm for hash is not at all perf sensitive, and doing it inline has a couple of problems. First, it means that if multiple files include the header, then the initialization gets done multiple times. But also, it makes it harder to fix usage of RTE_LOG(). Despite what the checking script say. This is not an ABI change, the previous version inlined the same code; therefore both old and new code will work the same. Signed-off-by: Stephen Hemminger Acked-by: Ruifeng Wang --- lib/hash/meson.build | 1 + lib/hash/rte_crc_arm64.h | 8 ++--- lib/hash/rte_crc_x86.h | 10 +++--- lib/hash/rte_hash_crc.c | 68 ++++++++++++++++++++++++++++++++++++++++ lib/hash/rte_hash_crc.h | 48 ++-------------------------- lib/hash/version.map | 7 +++++ 6 files changed, 88 insertions(+), 54 deletions(-) create mode 100644 lib/hash/rte_hash_crc.c diff --git a/lib/hash/meson.build b/lib/hash/meson.build index e56ee8572564..c345c6f561fc 100644 --- a/lib/hash/meson.build +++ b/lib/hash/meson.build @@ -19,6 +19,7 @@ indirect_headers += files( sources = files( 'rte_cuckoo_hash.c', + 'rte_hash_crc.c', 'rte_fbk_hash.c', 'rte_thash.c', 'rte_thash_gfni.c' diff --git a/lib/hash/rte_crc_arm64.h b/lib/hash/rte_crc_arm64.h index c9f52510871b..414fe065caa8 100644 --- a/lib/hash/rte_crc_arm64.h +++ b/lib/hash/rte_crc_arm64.h @@ -53,7 +53,7 @@ crc32c_arm64_u64(uint64_t data, uint32_t init_val) static inline uint32_t rte_hash_crc_1byte(uint8_t data, uint32_t init_val) { - if (likely(crc32_alg & CRC32_ARM64)) + if (likely(rte_hash_crc32_alg & CRC32_ARM64)) return crc32c_arm64_u8(data, init_val); return crc32c_1byte(data, init_val); @@ -67,7 +67,7 @@ rte_hash_crc_1byte(uint8_t data, uint32_t init_val) static inline uint32_t rte_hash_crc_2byte(uint16_t data, uint32_t init_val) { - if (likely(crc32_alg & CRC32_ARM64)) + if (likely(rte_hash_crc32_alg & CRC32_ARM64)) return crc32c_arm64_u16(data, init_val); return crc32c_2bytes(data, init_val); @@ -81,7 +81,7 @@ rte_hash_crc_2byte(uint16_t data, uint32_t init_val) static inline uint32_t rte_hash_crc_4byte(uint32_t data, uint32_t init_val) { - if (likely(crc32_alg & CRC32_ARM64)) + if (likely(rte_hash_crc32_alg & CRC32_ARM64)) return crc32c_arm64_u32(data, init_val); return crc32c_1word(data, init_val); @@ -95,7 +95,7 @@ rte_hash_crc_4byte(uint32_t data, uint32_t init_val) static inline uint32_t rte_hash_crc_8byte(uint64_t data, uint32_t init_val) { - if (likely(crc32_alg & CRC32_ARM64)) + if (likely(rte_hash_crc32_alg & CRC32_ARM64)) return crc32c_arm64_u64(data, init_val); return crc32c_2words(data, init_val); diff --git a/lib/hash/rte_crc_x86.h b/lib/hash/rte_crc_x86.h index 205bc182be77..3b865e251db2 100644 --- a/lib/hash/rte_crc_x86.h +++ b/lib/hash/rte_crc_x86.h @@ -67,7 +67,7 @@ crc32c_sse42_u64(uint64_t data, uint64_t init_val) static inline uint32_t rte_hash_crc_1byte(uint8_t data, uint32_t init_val) { - if (likely(crc32_alg & CRC32_SSE42)) + if (likely(rte_hash_crc32_alg & CRC32_SSE42)) return crc32c_sse42_u8(data, init_val); return crc32c_1byte(data, init_val); @@ -81,7 +81,7 @@ rte_hash_crc_1byte(uint8_t data, uint32_t init_val) static inline uint32_t rte_hash_crc_2byte(uint16_t data, uint32_t init_val) { - if (likely(crc32_alg & CRC32_SSE42)) + if (likely(rte_hash_crc32_alg & CRC32_SSE42)) return crc32c_sse42_u16(data, init_val); return crc32c_2bytes(data, init_val); @@ -95,7 +95,7 @@ rte_hash_crc_2byte(uint16_t data, uint32_t init_val) static inline uint32_t rte_hash_crc_4byte(uint32_t data, uint32_t init_val) { - if (likely(crc32_alg & CRC32_SSE42)) + if (likely(rte_hash_crc32_alg & CRC32_SSE42)) return crc32c_sse42_u32(data, init_val); return crc32c_1word(data, init_val); @@ -110,11 +110,11 @@ static inline uint32_t rte_hash_crc_8byte(uint64_t data, uint32_t init_val) { #ifdef RTE_ARCH_X86_64 - if (likely(crc32_alg == CRC32_SSE42_x64)) + if (likely(rte_hash_crc32_alg == CRC32_SSE42_x64)) return crc32c_sse42_u64(data, init_val); #endif - if (likely(crc32_alg & CRC32_SSE42)) + if (likely(rte_hash_crc32_alg & CRC32_SSE42)) return crc32c_sse42_u64_mimic(data, init_val); return crc32c_2words(data, init_val); diff --git a/lib/hash/rte_hash_crc.c b/lib/hash/rte_hash_crc.c new file mode 100644 index 000000000000..1439d8a71f6a --- /dev/null +++ b/lib/hash/rte_hash_crc.c @@ -0,0 +1,68 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2010-2014 Intel Corporation + */ + +#include +#include + +#include "rte_hash_crc.h" + +RTE_LOG_REGISTER_SUFFIX(hash_crc_logtype, crc, INFO); +#define RTE_LOGTYPE_HASH_CRC hash_crc_logtype + +uint8_t rte_hash_crc32_alg = CRC32_SW; + +/** + * Allow or disallow use of SSE4.2/ARMv8 intrinsics for CRC32 hash + * calculation. + * + * @param alg + * An OR of following flags: + * - (CRC32_SW) Don't use SSE4.2/ARMv8 intrinsics (default non-[x86/ARMv8]) + * - (CRC32_SSE42) Use SSE4.2 intrinsics if available + * - (CRC32_SSE42_x64) Use 64-bit SSE4.2 intrinsic if available (default x86) + * - (CRC32_ARM64) Use ARMv8 CRC intrinsic if available (default ARMv8) + * + */ +void +rte_hash_crc_set_alg(uint8_t alg) +{ + rte_hash_crc32_alg = CRC32_SW; + + if (alg == CRC32_SW) + return; + +#if defined RTE_ARCH_X86 + if (!(alg & CRC32_SSE42_x64)) + RTE_LOG(WARNING, HASH_CRC, + "Unsupported CRC32 algorithm requested using CRC32_x64/CRC32_SSE42\n"); + if (!rte_cpu_get_flag_enabled(RTE_CPUFLAG_EM64T) || alg == CRC32_SSE42) + rte_hash_crc32_alg = CRC32_SSE42; + else + rte_hash_crc32_alg = CRC32_SSE42_x64; +#endif + +#if defined RTE_ARCH_ARM64 + if (!(alg & CRC32_ARM64)) + RTE_LOG(WARNING, HASH_CRC, + "Unsupported CRC32 algorithm requested using CRC32_ARM64\n"); + if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_CRC32)) + rte_hash_crc32_alg = CRC32_ARM64; +#endif + + if (rte_hash_crc32_alg == CRC32_SW) + RTE_LOG(WARNING, HASH_CRC, + "Unsupported CRC32 algorithm requested using CRC32_SW\n"); +} + +/* Setting the best available algorithm */ +RTE_INIT(rte_hash_crc_init_alg) +{ +#if defined(RTE_ARCH_X86) + rte_hash_crc_set_alg(CRC32_SSE42_x64); +#elif defined(RTE_ARCH_ARM64) && defined(__ARM_FEATURE_CRC32) + rte_hash_crc_set_alg(CRC32_ARM64); +#else + rte_hash_crc_set_alg(CRC32_SW); +#endif +} diff --git a/lib/hash/rte_hash_crc.h b/lib/hash/rte_hash_crc.h index 60bf42ce1d97..8ad2422ec333 100644 --- a/lib/hash/rte_hash_crc.h +++ b/lib/hash/rte_hash_crc.h @@ -20,8 +20,6 @@ extern "C" { #include #include #include -#include -#include #include "rte_crc_sw.h" @@ -31,7 +29,7 @@ extern "C" { #define CRC32_SSE42_x64 (CRC32_x64|CRC32_SSE42) #define CRC32_ARM64 (1U << 3) -static uint8_t crc32_alg = CRC32_SW; +extern uint8_t rte_hash_crc32_alg; #if defined(RTE_ARCH_ARM64) && defined(__ARM_FEATURE_CRC32) #include "rte_crc_arm64.h" @@ -52,48 +50,8 @@ static uint8_t crc32_alg = CRC32_SW; * - (CRC32_SSE42_x64) Use 64-bit SSE4.2 intrinsic if available (default x86) * - (CRC32_ARM64) Use ARMv8 CRC intrinsic if available (default ARMv8) */ -static inline void -rte_hash_crc_set_alg(uint8_t alg) -{ - crc32_alg = CRC32_SW; - - if (alg == CRC32_SW) - return; - -#if defined RTE_ARCH_X86 - if (!(alg & CRC32_SSE42_x64)) - RTE_LOG(WARNING, HASH, - "Unsupported CRC32 algorithm requested using CRC32_x64/CRC32_SSE42\n"); - if (!rte_cpu_get_flag_enabled(RTE_CPUFLAG_EM64T) || alg == CRC32_SSE42) - crc32_alg = CRC32_SSE42; - else - crc32_alg = CRC32_SSE42_x64; -#endif - -#if defined RTE_ARCH_ARM64 - if (!(alg & CRC32_ARM64)) - RTE_LOG(WARNING, HASH, - "Unsupported CRC32 algorithm requested using CRC32_ARM64\n"); - if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_CRC32)) - crc32_alg = CRC32_ARM64; -#endif - - if (crc32_alg == CRC32_SW) - RTE_LOG(WARNING, HASH, - "Unsupported CRC32 algorithm requested using CRC32_SW\n"); -} - -/* Setting the best available algorithm */ -RTE_INIT(rte_hash_crc_init_alg) -{ -#if defined(RTE_ARCH_X86) - rte_hash_crc_set_alg(CRC32_SSE42_x64); -#elif defined(RTE_ARCH_ARM64) && defined(__ARM_FEATURE_CRC32) - rte_hash_crc_set_alg(CRC32_ARM64); -#else - rte_hash_crc_set_alg(CRC32_SW); -#endif -} +void +rte_hash_crc_set_alg(uint8_t alg); #ifdef __DOXYGEN__ diff --git a/lib/hash/version.map b/lib/hash/version.map index 8288c6e7967e..a1e68036c5b8 100644 --- a/lib/hash/version.map +++ b/lib/hash/version.map @@ -9,6 +9,7 @@ DPDK_24 { rte_hash_add_key_with_hash; rte_hash_add_key_with_hash_data; rte_hash_count; + rte_hash_crc_set_alg; rte_hash_create; rte_hash_del_key; rte_hash_del_key_with_hash; @@ -56,3 +57,9 @@ EXPERIMENTAL { rte_thash_gfni; rte_thash_gfni_bulk; }; + +INTERNAL { + global: + + rte_hash_crc32_alg; +}; -- 2.39.2