Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add BLAKE3 hash support and chksum benchmarking to OpenZFS #12918

Merged
merged 10 commits into from
Jun 8, 2022

Commits on Jun 7, 2022

  1. Add new files for BLAKE3

    This commit adds the cryptographic hash function BLAKE3 to the icp
    module.
    
    The code for this hash was put into public domain - so I could use the
    CDDL for all files.
    
    Homepage of BLAKE3: https://github.com/BLAKE3-team/BLAKE3
    Wikipedia: https://en.wikipedia.org/wiki/BLAKE_(hash_function)#BLAKE3
    
    Short description of Wikipedia:
    BLAKE3 is a cryptographic hash function based on Bao and BLAKE2,
    created by Jack O'Connor, Jean-Philippe Aumasson, Samuel Neves, and
    Zooko Wilcox-O'Hearn. It was announced on January 9, 2020, at Real
    World Crypto. BLAKE3 is a single algorithm with many desirable
    features (parallelism, XOF, KDF, PRF and MAC), in contrast to BLAKE
    and BLAKE2, which are algorithm families with multiple variants.
    BLAKE3 has a binary tree structure, so it supports a practically
    unlimited degree of parallelism (both SIMD and multithreading) given
    enough input. The official Rust and C implementations are
    dual-licensed as public domain (CC0) and the Apache License.
    
    The new code is mainly splitted into these parts:
    - 1x cross platform generic c variant: blake3_generic.c
    - 4x assembly for X86-64 (SSE2, SSE4.1, AVX2, AVX512)
    - 2x assembly for ARMv8 (NEON converted from SSE2)
    - 2x assembly for PPC64-LE (POWER8 converted from SSE2)
    - one file for switching between the implementations
    
    Signed-off-by: Tino Reichardt <milky-zfs@mcmilk.de>
    Co-authored-by: Rich Ercolani <rincebrain@gmail.com>
    
    Closes openzfs#10058
    mcmilk committed Jun 7, 2022
    Configuration menu
    Copy the full SHA
    5096511 View commit details
    Browse the repository at this point in the history
  2. Add zfs_vsx_available() for PowerPC

    Add zfs_vsx_available() and update the kfpu_begin() / kfpu_end()
    calls for PowerPC.
    
    Signed-off-by: Tino Reichardt <milky-zfs@mcmilk.de>
    Co-authored-by: Rich Ercolani <rincebrain@gmail.com>
    mcmilk and rincebrain committed Jun 7, 2022
    Configuration menu
    Copy the full SHA
    e8c7db6 View commit details
    Browse the repository at this point in the history
  3. Put checksum benchmarking and BLAKE3 into OpenZFS

    This commit adds the BLAKE3 hash into the OpenZFS infrastructure and
    introduces a new benchmarking file called chksum_bench within the kstat
    interface. It could be used for other checksum hashes as well.
    
    On Linux you can check the speeds of the checksum functions in this file
    now: /proc/spl/kstat/zfs/chksum_bench
    
    On FreeBSD via: sysctl kstat.zfs.misc.chksum_bench
    
    This is an example output of an i3-1005G1 test system with Debian 11:
    
    implementation      1k      4k     16k     64k    256k      1m      4m
    edonr-generic     1196    1602    1761    1749    1762    1759    1751
    skein-generic      546     591     608     615     619     612     616
    sha256-generic     240     300     316     314     304     285     276
    sha512-generic     353     441     467     476     472     467     426
    blake3-generic     308     313     313     313     312     313     312
    blake3-sse2        402    1289    1423    1446    1432    1458    1413
    blake3-sse41       427    1470    1625    1704    1679    1607    1629
    blake3-avx2        428    1920    3095    3343    3356    3318    3204
    blake3-avx512      473    2687    4905    5836    5844    5643    5374
    
    Output on Debian 5.10.0-10-amd64 system: (Ryzen 7 5800X)
    
    implementation      1k      4k     16k     64k    256k      1m      4m
    edonr-generic     1840    2458    2665    2719    2711    2723    2693
    skein-generic      870     966     996     992    1003    1005    1009
    sha256-generic     415     442     453     455     457     457     457
    sha512-generic     608     690     711     718     719     720     721
    blake3-generic     301     313     311     309     309     310     310
    blake3-sse2        343    1865    2124    2188    2180    2181    2186
    blake3-sse41       364    2091    2396    2509    2463    2482    2488
    blake3-avx2        365    2590    4399    4971    4915    4802    4764
    
    Output on Debian 5.10.0-9-powerpc64le system: (POWER 9)
    
    implementation      1k      4k     16k     64k    256k      1m      4m
    edonr-generic     1213    1703    1889    1918    1957    1902    1907
    skein-generic      434     492     520     522     511     525     525
    sha256-generic     167     183     187     188     188     187     188
    sha512-generic     186     216     222     221     225     224     224
    blake3-generic     153     152     154     153     151     153     153
    blake3-sse2        391    1170    1366    1406    1428    1426    1414
    blake3-sse41       352    1049    1212    1174    1262    1258    1259
    
    Output on Debian 5.10.0-11-arm64 system: (Pi400)
    
    implementation      1k      4k     16k     64k    256k      1m      4m
    edonr-generic      487     603     629     639     643     641     641
    skein-generic      271     299     303     308     309     309     307
    sha256-generic     117     127     128     130     130     129     130
    sha512-generic     145     165     170     172     173     174     175
    blake3-generic      81      29      71      89      89      89      89
    blake3-sse2        112     323     368     379     380     371     374
    blake3-sse41       101     315     357     368     369     364     360
    
    Signed-off-by: Tino Reichardt <milky-zfs@mcmilk.de>
    mcmilk committed Jun 7, 2022
    Configuration menu
    Copy the full SHA
    3de61e4 View commit details
    Browse the repository at this point in the history
  4. Introduce BLAKE3 as new feature for OpenZFS

    This commit puts BLAKE3 into the needed structures.
    
    Signed-off-by: Tino Reichardt <milky-zfs@mcmilk.de>
    mcmilk committed Jun 7, 2022
    Configuration menu
    Copy the full SHA
    348c40e View commit details
    Browse the repository at this point in the history
  5. Fix compiling on FreeBSD

    This commit fixes this compiling error:
    
    error: unexpected token in argument list
    typedef int bool_t;
                ^
    typedef int enum_t;
                ^
    *** Error code 1
    
    Signed-off-by: Tino Reichardt <milky-zfs@mcmilk.de>
    mcmilk committed Jun 7, 2022
    Configuration menu
    Copy the full SHA
    a9819d6 View commit details
    Browse the repository at this point in the history
  6. Document BLAKE3 in the manpages

    Add some notes about BLAKE3 with the manpages.
    
    I would also change the OpenZFS documentation located here:
    https://openzfs.github.io/openzfs-docs/Basic%20Concepts/Checksums.html
    
    Signed-off-by: Tino Reichardt <milky-zfs@mcmilk.de>
    Co-authored-by: Rich Ercolani <rincebrain@gmail.com>
    mcmilk and rincebrain committed Jun 7, 2022
    Configuration menu
    Copy the full SHA
    662e0ac View commit details
    Browse the repository at this point in the history
  7. Add BLAKE3 to the ztest command

    Add the new cryptographic hash function BLAKE3 to the ztest command.
    The generic implementation is used for reference.
    
    Signed-off-by: Tino Reichardt <milky-zfs@mcmilk.de>
    mcmilk committed Jun 7, 2022
    Configuration menu
    Copy the full SHA
    d27c879 View commit details
    Browse the repository at this point in the history
  8. Add BLAKE3 to the tests of zfs-tests/tests/functional/checksum

    Add the needed files for testing the new hash variant within the
    functional tests.
    
    All supported implementations off the current system get tested
    against the test vectors of this site:
    https://github.com/BLAKE3-team/BLAKE3/tree/master/test_vectors
    
    Signed-off-by: Tino Reichardt <milky-zfs@mcmilk.de>
    mcmilk committed Jun 7, 2022
    Configuration menu
    Copy the full SHA
    6a4bdd4 View commit details
    Browse the repository at this point in the history
  9. Modify the ABI to match the new properties

    Change libzfs.abi a bit to match the new structure properties.
    It also adds me to the AUTHORS file.
    
    Signed-off-by: Tino Reichardt <milky-zfs@mcmilk.de>
    mcmilk committed Jun 7, 2022
    Configuration menu
    Copy the full SHA
    b0737cf View commit details
    Browse the repository at this point in the history
  10. Drop #ifdef #undef #endif _KERNEL for checksum/*_test.c

    Dropping the defines does not cause any issues and isn't needed
    anymore.
    
    Signed-off-by: Tino Reichardt <milky-zfs@mcmilk.de>
    mcmilk committed Jun 7, 2022
    Configuration menu
    Copy the full SHA
    3b6ae50 View commit details
    Browse the repository at this point in the history