# Set WITH_EC_ISA_PLUGIN early so it's available when processing common/options
# This must be set before add_subdirectory(common) is called
-if(HAVE_NASM_X64_AVX2 OR HAVE_ARMV8_SIMD OR HAS_ALTIVEC)
+if(HAVE_NASM_X64_AVX2 OR HAVE_ARMV8_SIMD OR HAS_ALTIVEC OR HAVE_RISCV_RVV)
set(WITH_EC_ISA_PLUGIN TRUE CACHE BOOL "")
endif()
#include <sys/syscall.h>
#include <unistd.h>
+int ceph_arch_riscv_rvv = 0;
int ceph_arch_riscv_zbc = 0;
int ceph_arch_riscv_zvbc = 0;
+#ifndef RISCV_HWPROBE_IMA_V
+#define RISCV_HWPROBE_IMA_V (1ULL << 2)
+#endif
+
#ifndef RISCV_HWPROBE_EXT_ZBC
#define RISCV_HWPROBE_EXT_ZBC (1ULL << 7)
#endif
if (do_hwprobe(pairs, 1) == 0) {
unsigned long long ext = pairs[0].value;
+ ceph_arch_riscv_rvv = (ext & RISCV_HWPROBE_IMA_V);
ceph_arch_riscv_zbc = (ext & RISCV_HWPROBE_EXT_ZBC);
ceph_arch_riscv_zvbc = (ext & RISCV_HWPROBE_EXT_ZVBC);
}
extern "C" {
#endif
+extern int ceph_arch_riscv_rvv;
extern int ceph_arch_riscv_zbc;
extern int ceph_arch_riscv_zvbc;
COMPILE_DEFINITIONS "__ASSEMBLY__"
INCLUDE_DIRECTORIES "${PROJECT_SOURCE_DIR}/src/isa-l/igzip;${PROJECT_SOURCE_DIR}/src/isa-l/igzip/aarch64"
)
+elseif(HAVE_RISCV_RVV)
+ set(zlib_asm_sources
+ ${CMAKE_SOURCE_DIR}/src/isa-l/igzip/riscv64/igzip_multibinary_riscv64.S
+ ${CMAKE_SOURCE_DIR}/src/isa-l/igzip/riscv64/igzip_isal_adler32_rvv.S
+ ${CMAKE_SOURCE_DIR}/src/isa-l/igzip/riscv64/igzip_isal_adler32_rvv128.S
+ )
+ set(zlib_sources
+ CompressionPluginZlib.cc
+ ZlibCompressor.cc
+ ${CMAKE_SOURCE_DIR}/src/isa-l/igzip/igzip.c
+ ${CMAKE_SOURCE_DIR}/src/isa-l/igzip/hufftables_c.c
+ ${CMAKE_SOURCE_DIR}/src/isa-l/igzip/igzip_base.c
+ ${CMAKE_SOURCE_DIR}/src/isa-l/igzip/igzip_icf_base.c
+ ${CMAKE_SOURCE_DIR}/src/isa-l/igzip/adler32_base.c
+ ${CMAKE_SOURCE_DIR}/src/isa-l/igzip/flatten_ll.c
+ ${CMAKE_SOURCE_DIR}/src/isa-l/igzip/encode_df.c
+ ${CMAKE_SOURCE_DIR}/src/isa-l/igzip/igzip_icf_body.c
+ ${CMAKE_SOURCE_DIR}/src/isa-l/igzip/igzip_inflate.c
+ ${CMAKE_SOURCE_DIR}/src/isa-l/igzip/huff_codes.c
+ ${CMAKE_SOURCE_DIR}/src/isa-l/igzip/proc_heap_base.c
+ ${CMAKE_SOURCE_DIR}/src/isa-l/igzip/riscv64/igzip_multibinary_riscv64_dispatcher.c
+ ${CMAKE_SOURCE_DIR}/src/isa-l/crc/crc_base_aliases.c
+ ${CMAKE_SOURCE_DIR}/src/isa-l/crc/crc_base.c
+ ${CMAKE_SOURCE_DIR}/src/isa-l/crc/crc64_base.c
+ ${zlib_asm_sources}
+ )
+ set_source_files_properties(${zlib_asm_sources} PROPERTIES
+ COMPILE_DEFINITIONS "__ASSEMBLY__"
+ INCLUDE_DIRECTORIES "${PROJECT_SOURCE_DIR}/src/isa-l/igzip;${PROJECT_SOURCE_DIR}/src/isa-l/igzip/riscv64"
+ )
else()
set(zlib_sources
CompressionPluginZlib.cc
#include "arch/probe.h"
#include "arch/intel.h"
#include "arch/arm.h"
+#include "arch/riscv.h"
#include "common/ceph_context.h"
#include "compressor/CompressionPlugin.h"
#include "ZlibCompressor.h"
ceph_arch_probe();
isal = (ceph_arch_aarch64_pmull && ceph_arch_neon);
}
+#elif defined(HAVE_RISCV_RVV)
+ if (cct->_conf->compressor_zlib_isal) {
+ ceph_arch_probe();
+ isal = ceph_arch_riscv_rvv;
+ }
#endif
if (compressor == 0 || has_isal != isal) {
compressor = std::make_shared<ZlibCompressor>(cct, isal);
#if (__x86_64__ && defined(HAVE_NASM_X64_AVX2))
#elif defined(__aarch64__)
+#elif defined(HAVE_RISCV_RVV)
#else
if (isal_enabled) {
derr << "WARN: ISA-L enabled (compressor_zlib_isal=true) but not supported"
return 0;
}
-#if (__x86_64__ && defined(HAVE_NASM_X64_AVX2)) || defined(__aarch64__)
+#if (__x86_64__ && defined(HAVE_NASM_X64_AVX2)) || defined(__aarch64__) || defined(HAVE_RISCV_RVV)
int ZlibCompressor::isal_compress(const bufferlist &in, bufferlist &out, std::optional<int32_t> &compressor_message)
{
int ret;
if (uadk_enabled)
return uadk_accel.compress(in, out);
#endif
-#if (__x86_64__ && defined(HAVE_NASM_X64_AVX2)) || defined(__aarch64__)
+#if (__x86_64__ && defined(HAVE_NASM_X64_AVX2)) || defined(__aarch64__) || defined(HAVE_RISCV_RVV)
if (isal_enabled)
return isal_compress(in, out, compressor_message);
else
#ifdef HAVE_LZ4
"lz4",
#endif
-#if defined(__x86_64__) || defined(__aarch64__)
+#if defined(__x86_64__) || defined(__aarch64__) || defined(HAVE_RISCV_RVV)
"zlib/isal",
#endif
"zlib/noisal",
#endif
"zstd"));
-#if defined(__x86_64__) || defined(__aarch64__)
+#if defined(__x86_64__) || defined(__aarch64__) || defined(HAVE_RISCV_RVV)
TEST(ZlibCompressor, zlib_isal_compatibility)
{
}
}
-#if defined(__x86_64__) || defined(__aarch64__)
+#if defined(__x86_64__) || defined(__aarch64__) || defined(HAVE_RISCV_RVV)
TEST(ZlibCompressor, isal_compress_zlib_decompress_random)
{