mirror_zfs/module/zstd
Yann Collet 776441152e zstd: Refactor prefetching for the decoding loop
Following facebook/zstd#2545, I noticed that one field in `seq_t` is
optional, and only used in combination with prefetching. (This may have
contributed to static analyzer failure to detect correct
initialization).

I then wondered if it would be possible to rewrite the code so that this
optional part is handled directly by the prefetching code rather than
delegated as an option into `ZSTD_decodeSequence()`.

This resulted into this refactoring exercise where the prefetching
responsibility is better isolated into its own function and
`ZSTD_decodeSequence()` is streamlined to contain strictly Sequence
decoding operations.  Incidently, due to better code locality, it
reduces the need to send information around, leading to simplified
interface, and smaller state structures.

Port of facebook/zstd@f5434663ea

Reported-by: Coverity (CID 1462271)
Reviewed-by: Damian Szuberski <szuberskidamian@gmail.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Tino Reichardt <milky-zfs@mcmilk.de>
Ported-by: Richard Yao <richard.yao@alumni.stonybrook.edu>
Closes #14212
2022-11-29 10:05:30 -08:00
..
include linux: module: weld all but spl.ko into zfs.ko 2022-04-20 13:28:24 -07:00
lib zstd: Refactor prefetching for the decoding loop 2022-11-29 10:05:30 -08:00
README.md linux: module: weld all but spl.ko into zfs.ko 2022-04-20 13:28:24 -07:00
zfs_zstd.c Cleanup: Specify unsignedness on things that should not be signed 2022-09-27 16:42:41 -07:00
zstd_sparc.c Fix cross-endian interoperability of zstd 2021-08-30 14:13:46 -07:00
zstd-in.c Import ZStandard v1.4.5 2020-08-20 10:30:06 -07:00

ZSTD-On-ZFS Library Manual

Introduction

This subtree contains the ZSTD library used in ZFS. It is heavily cut-down by dropping any unneeded files, and combined into a single file, but otherwise is intentionally unmodified. Please do not alter the file containing the zstd library, besides upgrading to a newer ZSTD release.

Tree structure:

  • zfs_zstd.c are the actual zfs kernel module hooks.
  • lib/ contains the unmodified version of the Zstandard library
  • zstd-in.c is our template file for generating the single-file library
  • include/: This directory contains supplemental includes for platform compatibility, which are not expected to be used by ZFS elsewhere in the future. Thus we keep them private to ZSTD.

Updating ZSTD

To update ZSTD the following steps need to be taken:

  1. Grab the latest release of ZSTD.
  2. Copy the files output by the following script to module/zstd/lib/: grep include [path to zstd]/contrib/single_file_libs/zstd-in.c | awk '{ print $2 }'
  3. Remove debug.c, threading.c, and zstdmt_compress.c.
  4. Update Makefiles with resulting file lists.
  5. Follow symbol renaming notes in include/zstd_compat_wrapper.h

Altering ZSTD and breaking changes

If ZSTD made changes that break compatibility or you need to make breaking changes to the way we handle ZSTD, it is required to maintain backwards compatibility.

We already save the ZSTD version number within the block header to be used to add future compatibility checks and/or fixes. However, currently it is not actually used in such a way.