From nobody Sat Jul 09 05:03:33 2022 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id DD3443E5DC3; Sat, 9 Jul 2022 05:03:34 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Lfyj1603Zz3NBV; Sat, 9 Jul 2022 05:03:33 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1657343013; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=mlQgpRPQav3JI6HW3GDBBpQIuVrCNwM1FmvWWVmv0TE=; b=p5O8Ka3nL8UhszGyG7B/Xov13/gUmod8Fv2Z1QKN7ZNxQT4Mw/bKOnEyjFznBy1L+gBeju ZYmtrm724U9d3togVuFTuSmfoZNzQWB8yhQfiGYNd8YvQq8Ac8ixfHntSliC79+PIAAUvz E4fZSk8ShBQfITe99h0YefW90+rUWskBx+B39aHwbXE/UvGGrGrX+GyzuuU4wzxM9HjtuG VLBS/g8nAlCDbZOIpLTrhH8i9svfbjFwmPf/faIPkQXNASZy/Q6czwarBAOdXL8eqy3MQD tRkiSdMdnualv0rcQW4nAc7TINQC23iqs/CcI4bwzpJ7ILGorxh4Tu4rPU0Kgg== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4Lfyj156FKzZJV; Sat, 9 Jul 2022 05:03:33 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 26953XxH000133; Sat, 9 Jul 2022 05:03:33 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 26953XQ9000132; Sat, 9 Jul 2022 05:03:33 GMT (envelope-from git) Date: Sat, 9 Jul 2022 05:03:33 GMT Message-Id: <202207090503.26953XQ9000132@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Warner Losh Subject: git: 75ad24775b68 - main - stand: Add blake3 support to boot loader List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: imp X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 75ad24775b68c59e95bef0047fd6fc8a01271a03 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1657343013; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=mlQgpRPQav3JI6HW3GDBBpQIuVrCNwM1FmvWWVmv0TE=; b=SJehsHq5Qlg4lcVwp2F/7DXNgqqmr9banHZCDvIsVFa+PP3kT7cWyZ5ZlHbdjsV90z9uli mb7oN/CJANcKqKwzlP3YUmxcixxvX/z2xY/4RP/2xfKOSa+IS/HBkH2oyAoGaNx6SvCTIe 1329TWf+dT/CCrQUKUmtY271JhOnr2IyTn1BGXEKLKwAcLVw6QUIF4L0SdU3QuPiGqJfk/ CZ9iq5x08vQR3Tof7Y6X6gGCPOzmL7AWPg/I/x6zORBTa4NZ79mVY9waFREBMknrQQ1IiA AuQkMzT9fjH/SWCkFwf0VCQApxglT2vvdbuKiZCBDypwkLjb3AwQnWuNSJws1g== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1657343013; a=rsa-sha256; cv=none; b=yqClBlKxF0z5VBQnrnUeAePHQPnrDmHQOF6QSKFwkkOFNcjb2eulXSNLXq4bRaVV0ZFiqO Au3vSLhckvgwj8WGeZ5NfvnwiNhujMpgxgfpnljaUErDxzpshuybtE6KzGUTtAtQ3QiF24 tN9ZNnAq0FW8xsXtjA2GnMMPjrbLcQJsiz984/OwyGcA2izeflYpSyA6EtiX777TgdFkXL LBXCcMKeSnVDGQFWXzu46u7pxyK44y+kI1g+dFNzxbBDGEA69RYOF6E/O2C5Ops4qQXyJX XTMlaUMexOglUGJHjfy9XL7c5ApM8cEGwKyfBQkPAU2gm2wPRVISw7WmN8AzDQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by imp: URL: https://cgit.FreeBSD.org/src/commit/?id=75ad24775b68c59e95bef0047fd6fc8a01271a03 commit 75ad24775b68c59e95bef0047fd6fc8a01271a03 Author: Warner Losh AuthorDate: 2022-07-08 23:35:06 +0000 Commit: Warner Losh CommitDate: 2022-07-09 04:57:59 +0000 stand: Add blake3 support to boot loader Add the necessary glue to get blake3 building for the boot loaded as well as connected to the ZFS system so it is useful. On some platforms, we create references to blake3_sse2_impl and blake3_sse41_impl ops structs to utilize SIMD. These aren't present on x86 (since we dind't ask for them), but are on aarch64 with no implementation. Since we don't want SIMD in the boot loader, have these all return 'unsupported' always. This should be fixed upstream to allow more flexibility in this selection, but for now we use this hack to not modify the sys/contrib/openzfs with difficult to maintain hacks while an upstreamable solution is found. tsoome@ did the implementation bits in sys/cddl/boot, and I did the Makefile work and the aweful blake3_impl_hack.c. Co-author: tsoome@freebsd.org Sponsored by: Netflix Reviewed by: kevans (earlier version) Differential Revision: https://reviews.freebsd.org/D35750 --- stand/libsa/zfs/Makefile.inc | 8 ++++ stand/libsa/zfs/blake3_impl_hack.c | 28 +++++++++++ stand/libsa/zfs/zfsimpl.c | 1 + sys/cddl/boot/zfs/blake3_zfs.c | 97 ++++++++++++++++++++++++++++++++++++++ sys/cddl/boot/zfs/zfsimpl.h | 1 + sys/cddl/boot/zfs/zfssubr.c | 7 ++- 6 files changed, 141 insertions(+), 1 deletion(-) diff --git a/stand/libsa/zfs/Makefile.inc b/stand/libsa/zfs/Makefile.inc index 3f28c39c69da..314f74c903f1 100644 --- a/stand/libsa/zfs/Makefile.inc +++ b/stand/libsa/zfs/Makefile.inc @@ -7,8 +7,10 @@ .PATH: ${OZFS}/module/zstd/lib/common .PATH: ${OZFS}/module/zstd/lib/compress .PATH: ${OZFS}/module/zstd/lib/decompress +.PATH: ${OZFS}/module/icp/algs/blake3 ZFS_SRC= zfs.c nvlist.c skein.c skein_block.c list.c ZFS_SRC+= zfs_zstd.c +ZFS_SRC+= blake3.c blake3_generic.c blake3_impl_hack.c ZSTD_SRC+= entropy_common.c error_private.c ZSTD_SRC+= fse_compress.c fse_decompress.c hist.c ZSTD_SRC+= huf_compress.c huf_decompress.c pool.c xxhash.c @@ -35,6 +37,9 @@ CFLAGS.$i+= -include ${ZFSOSINC}/spl/sys/ccompile.h -Wformat -Wall -I${OZFS}/inc -DNEED_SOLARIS_BOOLEAN .endfor +CFLAGS_EARLY.blake3.c+= ${ZFS_EARLY} +CFLAGS_EARLY.blake3_generic.c+= ${ZFS_EARLY} +CFLAGS_EARLY.blake3_impl_hack.c+= ${ZFS_EARLY} CFLAGS_EARLY.list.c+= ${ZFS_EARLY} CFLAGS_EARLY.zfs_zstd.c+= ${ZFS_EARLY} @@ -58,3 +63,6 @@ CFLAGS.zfs_zstd.c+= -DIN_BASE -DIN_LIBSA # Do not unroll skein loops, reduce code size CFLAGS.skein_block.c+= -DSKEIN_LOOP=111 + +# To puck up blake3_impl.c... +CFLAGS.blake3_impl_hack.c+= -I${OZFS}/module/icp/algs/blake3 diff --git a/stand/libsa/zfs/blake3_impl_hack.c b/stand/libsa/zfs/blake3_impl_hack.c new file mode 100644 index 000000000000..709ce510dad6 --- /dev/null +++ b/stand/libsa/zfs/blake3_impl_hack.c @@ -0,0 +1,28 @@ +/* + * Copyright 2022, Netflix, Inc + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +/* + * Hack for aarch64... There's no way to tell it omit the SIMD + * versions, so we fake it here. + */ +#include "blake3_impl.c" + +static inline boolean_t blake3_is_not_supported(void) +{ + return (B_FALSE); +} + +const blake3_impl_ops_t blake3_sse2_impl = { + .is_supported = blake3_is_not_supported, + .degree = 4, + .name = "fakesse2" +}; + +const blake3_impl_ops_t blake3_sse41_impl = { + .is_supported = blake3_is_not_supported, + .degree = 4, + .name = "fakesse41" +}; diff --git a/stand/libsa/zfs/zfsimpl.c b/stand/libsa/zfs/zfsimpl.c index 865294dafed4..6b961f3110ae 100644 --- a/stand/libsa/zfs/zfsimpl.c +++ b/stand/libsa/zfs/zfsimpl.c @@ -140,6 +140,7 @@ static const char *features_for_read[] = { "org.freebsd:zstd_compress", "com.delphix:bookmark_written", "com.delphix:head_errlog", + "org.openzfs:blake3", NULL }; diff --git a/sys/cddl/boot/zfs/blake3_zfs.c b/sys/cddl/boot/zfs/blake3_zfs.c new file mode 100644 index 000000000000..0b2e1a014f62 --- /dev/null +++ b/sys/cddl/boot/zfs/blake3_zfs.c @@ -0,0 +1,97 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://opensource.org/licenses/CDDL-1.0. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright 2022 Tino Reichardt + */ + +#include + +/* + * Computes a native 256-bit BLAKE3 MAC checksum. Please note that this + * function requires the presence of a ctx_template that should be allocated + * using zio_checksum_blake3_tmpl_init. + */ +static void +zio_checksum_blake3_native(const void *buf, uint64_t size, + const void *ctx_template, zio_cksum_t *zcp) +{ + BLAKE3_CTX ctx; + + ASSERT(ctx_template != 0); + + memcpy(&ctx, ctx_template, sizeof(ctx)); + Blake3_Update(&ctx, buf, size); + Blake3_Final(&ctx, (uint8_t *)zcp); + + memset(&ctx, 0, sizeof (ctx)); +} + +/* + * Byteswapped version of zio_checksum_blake3_native. This just invokes + * the native checksum function and byteswaps the resulting checksum (since + * BLAKE3 is internally endian-insensitive). + */ +static void +zio_checksum_blake3_byteswap(const void *buf, uint64_t size, + const void *ctx_template, zio_cksum_t *zcp) +{ + zio_cksum_t tmp; + + ASSERT(ctx_template != 0); + + zio_checksum_blake3_native(buf, size, ctx_template, &tmp); + zcp->zc_word[0] = BSWAP_64(tmp.zc_word[0]); + zcp->zc_word[1] = BSWAP_64(tmp.zc_word[1]); + zcp->zc_word[2] = BSWAP_64(tmp.zc_word[2]); + zcp->zc_word[3] = BSWAP_64(tmp.zc_word[3]); +} + +/* + * Allocates a BLAKE3 MAC template suitable for using in BLAKE3 MAC checksum + * computations and returns a pointer to it. + */ +static void * +zio_checksum_blake3_tmpl_init(const zio_cksum_salt_t *salt) +{ + BLAKE3_CTX *ctx; + + ASSERT(sizeof (salt->zcs_bytes) == 32); + + /* init reference object */ + ctx = calloc(1, sizeof(*ctx)); + Blake3_InitKeyed(ctx, salt->zcs_bytes); + + return (ctx); +} + +/* + * Frees a BLAKE3 context template previously allocated using + * zio_checksum_blake3_tmpl_init. + */ +static void +zio_checksum_blake3_tmpl_free(void *ctx_template) +{ + BLAKE3_CTX *ctx = ctx_template; + + memset(ctx, 0, sizeof(*ctx)); + free(ctx); +} diff --git a/sys/cddl/boot/zfs/zfsimpl.h b/sys/cddl/boot/zfs/zfsimpl.h index 9b09b3436c8e..d6e8900f6a97 100644 --- a/sys/cddl/boot/zfs/zfsimpl.h +++ b/sys/cddl/boot/zfs/zfsimpl.h @@ -602,6 +602,7 @@ enum zio_checksum { ZIO_CHECKSUM_SHA512, ZIO_CHECKSUM_SKEIN, ZIO_CHECKSUM_EDONR, + ZIO_CHECKSUM_BLAKE3, ZIO_CHECKSUM_FUNCTIONS }; diff --git a/sys/cddl/boot/zfs/zfssubr.c b/sys/cddl/boot/zfs/zfssubr.c index 2e309fc10be4..c5ee4fda4579 100644 --- a/sys/cddl/boot/zfs/zfssubr.c +++ b/sys/cddl/boot/zfs/zfssubr.c @@ -102,6 +102,7 @@ typedef struct zio_checksum_info { #include "blkptr.c" #include "fletcher.c" +#include "blake3_zfs.c" #include "sha256.c" #include "skein_zfs.c" @@ -140,7 +141,11 @@ static zio_checksum_info_t zio_checksum_table[ZIO_CHECKSUM_FUNCTIONS] = { ZCHECKSUM_FLAG_SALTED | ZCHECKSUM_FLAG_NOPWRITE, "skein"}, /* no edonr for now */ {{NULL, NULL}, NULL, NULL, ZCHECKSUM_FLAG_METADATA | - ZCHECKSUM_FLAG_SALTED | ZCHECKSUM_FLAG_NOPWRITE, "edonr"} + ZCHECKSUM_FLAG_SALTED | ZCHECKSUM_FLAG_NOPWRITE, "edonr"}, + {{zio_checksum_blake3_native, zio_checksum_blake3_byteswap}, + zio_checksum_blake3_tmpl_init, zio_checksum_blake3_tmpl_free, + ZCHECKSUM_FLAG_METADATA | ZCHECKSUM_FLAG_DEDUP | + ZCHECKSUM_FLAG_SALTED | ZCHECKSUM_FLAG_NOPWRITE, "blake3"} }; /*