]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
[linux] Opt out of row based match finder for the kernel
authorNick Terrell <terrelln@meta.com>
Tue, 11 Mar 2025 18:53:20 +0000 (11:53 -0700)
committerNick Terrell <nickrterrell@gmail.com>
Tue, 11 Mar 2025 20:18:59 +0000 (16:18 -0400)
The row based match finder is slower without SIMD. We used to detect the
presence of SIMD to set the lower bound to 17, but that breaks
determinism. Instead, specifically opt into it for the kernel, because
it is one of the rare cases that doesn't have SIMD support.

lib/compress/zstd_compress.c

index d928b1d3ee33a5cb968ffd3a730f5080ea647a8a..c8f6b28658066939138f47101ca6bc8236ac2213 100644 (file)
@@ -237,10 +237,18 @@ static int ZSTD_rowMatchFinderUsed(const ZSTD_strategy strategy, const ZSTD_Para
 /* Returns row matchfinder usage given an initial mode and cParams */
 static ZSTD_ParamSwitch_e ZSTD_resolveRowMatchFinderMode(ZSTD_ParamSwitch_e mode,
                                                          const ZSTD_compressionParameters* const cParams) {
+#ifdef ZSTD_LINUX_KERNEL
+    /* The Linux Kernel does not use SIMD, and 128KB is a very common size, e.g. in BtrFS.
+     * The row match finder is slower for this size without SIMD, so disable it.
+     */
+    const unsigned kWindowLogLowerBound = 17;
+#else
+    const unsigned kWindowLogLowerBound = 14;
+#endif
     if (mode != ZSTD_ps_auto) return mode; /* if requested enabled, but no SIMD, we still will use row matchfinder */
     mode = ZSTD_ps_disable;
     if (!ZSTD_rowMatchFinderSupported(cParams->strategy)) return mode;
-    if (cParams->windowLog > 14) mode = ZSTD_ps_enable;
+    if (cParams->windowLog > kWindowLogLowerBound) mode = ZSTD_ps_enable;
     return mode;
 }