mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 00:34:52 +00:00

In addition to keeping the kernel's copy of zstd up to date, this update was requested by Intel to expose upstream's APIs that allow QAT to accelerate the LZ match finding stage of Zstd. This patch is imported from the upstream tag v1.5.7-kernel [0], which is signed with upstream's signing key EF8FE99528B52FFD [1]. It was imported from upstream using this command: export ZSTD=/path/to/repo/zstd/ export LINUX=/path/to/repo/linux/ cd "$ZSTD/contrib/linux-kernel" git checkout v1.5.7-kernel make import LINUX="$LINUX" This patch has been tested on x86-64, and has been boot tested with a zstd compressed kernel & initramfs on i386 and aarch64. I benchmarked the patch on x86-64 with gcc-14.2.1 on an Intel i9-9900K by measruing the performance of compressed filesystem reads and writes. Component, Level, Size delta, C. time delta, D. time delta Btrfs , 1, +0.00%, -6.1%, +1.4% Btrfs , 3, +0.00%, -9.8%, +3.0% Btrfs , 5, +0.00%, +1.7%, +1.4% Btrfs , 7, +0.00%, -1.9%, +2.7% Btrfs , 9, +0.00%, -3.4%, +3.7% Btrfs , 15, +0.00%, -0.3%, +3.6% SquashFS , 1, +0.00%, N/A, +1.9% The major changes that impact the kernel use cases for each version are: v1.5.7: https://github.com/facebook/zstd/releases/tag/v1.5.7 * Add zstd_compress_sequences_and_literals() for use by Intel's QAT driver to implement Zstd compression acceleration in the kernel. * Fix an underflow bug in 32-bit builds that can cause data corruption when processing more than 4GB of data with a single `ZSTD_CCtx` object, when an input crosses the 4GB boundry. I don't believe this impacts any current kernel use cases, because the `ZSTD_CCtx` is typically reconstructed between compressions. * Levels 1-4 see 5-10% compression speed improvements for inputs smaller than 128KB. v1.5.6: https://github.com/facebook/zstd/releases/tag/v1.5.6 * Improved compression ratio for the highest compression levels. I don't expect these see much use however, due to their slow speeds. v1.5.5: https://github.com/facebook/zstd/releases/tag/v1.5.5 * Fix a rare corruption bug that can trigger on levels 13 and above. * Improve compression speed of levels 5-11 on incompressible data. v1.5.4: https://github.com/facebook/zstd/releases/tag/v1.5.4 * Improve copmression speed of levels 5-11 on ARM. * Improve dictionary compression speed. Signed-off-by: Nick Terrell <terrelln@fb.com>
110 lines
4.3 KiB
C
110 lines
4.3 KiB
C
/* SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause */
|
|
/*
|
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under both the BSD-style license (found in the
|
|
* LICENSE file in the root directory of this source tree) and the GPLv2 (found
|
|
* in the COPYING file in the root directory of this source tree).
|
|
* You may select, at your option, one of the above-listed licenses.
|
|
*/
|
|
|
|
#ifndef ZSTD_LDM_H
|
|
#define ZSTD_LDM_H
|
|
|
|
#include "zstd_compress_internal.h" /* ldmParams_t, U32 */
|
|
#include <linux/zstd.h> /* ZSTD_CCtx, size_t */
|
|
|
|
/*-*************************************
|
|
* Long distance matching
|
|
***************************************/
|
|
|
|
#define ZSTD_LDM_DEFAULT_WINDOW_LOG ZSTD_WINDOWLOG_LIMIT_DEFAULT
|
|
|
|
void ZSTD_ldm_fillHashTable(
|
|
ldmState_t* state, const BYTE* ip,
|
|
const BYTE* iend, ldmParams_t const* params);
|
|
|
|
/*
|
|
* ZSTD_ldm_generateSequences():
|
|
*
|
|
* Generates the sequences using the long distance match finder.
|
|
* Generates long range matching sequences in `sequences`, which parse a prefix
|
|
* of the source. `sequences` must be large enough to store every sequence,
|
|
* which can be checked with `ZSTD_ldm_getMaxNbSeq()`.
|
|
* @returns 0 or an error code.
|
|
*
|
|
* NOTE: The user must have called ZSTD_window_update() for all of the input
|
|
* they have, even if they pass it to ZSTD_ldm_generateSequences() in chunks.
|
|
* NOTE: This function returns an error if it runs out of space to store
|
|
* sequences.
|
|
*/
|
|
size_t ZSTD_ldm_generateSequences(
|
|
ldmState_t* ldms, RawSeqStore_t* sequences,
|
|
ldmParams_t const* params, void const* src, size_t srcSize);
|
|
|
|
/*
|
|
* ZSTD_ldm_blockCompress():
|
|
*
|
|
* Compresses a block using the predefined sequences, along with a secondary
|
|
* block compressor. The literals section of every sequence is passed to the
|
|
* secondary block compressor, and those sequences are interspersed with the
|
|
* predefined sequences. Returns the length of the last literals.
|
|
* Updates `rawSeqStore.pos` to indicate how many sequences have been consumed.
|
|
* `rawSeqStore.seq` may also be updated to split the last sequence between two
|
|
* blocks.
|
|
* @return The length of the last literals.
|
|
*
|
|
* NOTE: The source must be at most the maximum block size, but the predefined
|
|
* sequences can be any size, and may be longer than the block. In the case that
|
|
* they are longer than the block, the last sequences may need to be split into
|
|
* two. We handle that case correctly, and update `rawSeqStore` appropriately.
|
|
* NOTE: This function does not return any errors.
|
|
*/
|
|
size_t ZSTD_ldm_blockCompress(RawSeqStore_t* rawSeqStore,
|
|
ZSTD_MatchState_t* ms, SeqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
|
|
ZSTD_ParamSwitch_e useRowMatchFinder,
|
|
void const* src, size_t srcSize);
|
|
|
|
/*
|
|
* ZSTD_ldm_skipSequences():
|
|
*
|
|
* Skip past `srcSize` bytes worth of sequences in `rawSeqStore`.
|
|
* Avoids emitting matches less than `minMatch` bytes.
|
|
* Must be called for data that is not passed to ZSTD_ldm_blockCompress().
|
|
*/
|
|
void ZSTD_ldm_skipSequences(RawSeqStore_t* rawSeqStore, size_t srcSize,
|
|
U32 const minMatch);
|
|
|
|
/* ZSTD_ldm_skipRawSeqStoreBytes():
|
|
* Moves forward in rawSeqStore by nbBytes, updating fields 'pos' and 'posInSequence'.
|
|
* Not to be used in conjunction with ZSTD_ldm_skipSequences().
|
|
* Must be called for data with is not passed to ZSTD_ldm_blockCompress().
|
|
*/
|
|
void ZSTD_ldm_skipRawSeqStoreBytes(RawSeqStore_t* rawSeqStore, size_t nbBytes);
|
|
|
|
/* ZSTD_ldm_getTableSize() :
|
|
* Estimate the space needed for long distance matching tables or 0 if LDM is
|
|
* disabled.
|
|
*/
|
|
size_t ZSTD_ldm_getTableSize(ldmParams_t params);
|
|
|
|
/* ZSTD_ldm_getSeqSpace() :
|
|
* Return an upper bound on the number of sequences that can be produced by
|
|
* the long distance matcher, or 0 if LDM is disabled.
|
|
*/
|
|
size_t ZSTD_ldm_getMaxNbSeq(ldmParams_t params, size_t maxChunkSize);
|
|
|
|
/* ZSTD_ldm_adjustParameters() :
|
|
* If the params->hashRateLog is not set, set it to its default value based on
|
|
* windowLog and params->hashLog.
|
|
*
|
|
* Ensures that params->bucketSizeLog is <= params->hashLog (setting it to
|
|
* params->hashLog if it is not).
|
|
*
|
|
* Ensures that the minMatchLength >= targetLength during optimal parsing.
|
|
*/
|
|
void ZSTD_ldm_adjustParameters(ldmParams_t* params,
|
|
ZSTD_compressionParameters const* cParams);
|
|
|
|
#endif /* ZSTD_FAST_H */
|