Skip to content

Commit

Permalink
sys-fs/zfs-kmod: disable zfs_dmu_offset_next_sync tunable by default
Browse files Browse the repository at this point in the history
As a mitigation until more is understood and fixes are tested & reviewed, change
the default of zfs_dmu_offset_next_sync from 1 to 0, as it was before
05b3eb6d232009db247882a39d518e7282630753 upstream.

There are no reported cases of The Bug being hit with zfs_dmu_offset_next_sync=1:
that does not mean this is a cure or a real fix, but it _appears_ to be at least
effective in reducing the chances of it happening. By itself, it's a safe change
anyway, so it feels worth us doing while we wait.

Note that The Bug has been reproduced on 2.1.x as well, hence we do it for both
2.1.13 and 2.2.1.

Bug: openzfs/zfs#11900
Bug: openzfs/zfs#15526
Bug: https://bugs.gentoo.org/917224
Signed-off-by: Sam James <[email protected]>
  • Loading branch information
thesamesam committed Nov 24, 2023
1 parent 3d1dfd2 commit 02fdf2e
Show file tree
Hide file tree
Showing 5 changed files with 480 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
From 2b266bd36980caefe353411bd56b2487c44aeb6e Mon Sep 17 00:00:00 2001
From: Sam James <[email protected]>
Date: Fri, 24 Nov 2023 21:38:06 +0000
Subject: [PATCH] Disable zfs_dmu_offset_next_sync tunable by default

As a mitigation until more is understood and fixes are tested & reviewed, change
the default of zfs_dmu_offset_next_sync from 1 to 0, as it was before
05b3eb6d232009db247882a39d518e7282630753.

There are no reported cases of The Bug being hit with zfs_dmu_offset_next_sync=1:
that does not mean this is a cure or a real fix, but it _appears_ to be at least
effective in reducing the chances of it happening. By itself, it's a safe change
anyway, so it feels worth us doing while we wait.

Bug: https://github.com/openzfs/zfs/issues/11900
Bug: https://github.com/openzfs/zfs/issues/15526
Bug: https://bugs.gentoo.org/917224
Signed-off-by: Sam James <[email protected]>
--- a/man/man4/zfs.4
+++ b/man/man4/zfs.4
@@ -1646,7 +1646,7 @@ Allow no-operation writes.
The occurrence of nopwrites will further depend on other pool properties
.Pq i.a. the checksumming and compression algorithms .
.
-.It Sy zfs_dmu_offset_next_sync Ns = Ns Sy 1 Ns | Ns 0 Pq int
+.It Sy zfs_dmu_offset_next_sync Ns = Ns Sy 0 Ns | Ns 1 Pq int
Enable forcing TXG sync to find holes.
When enabled forces ZFS to sync data when
.Sy SEEK_HOLE No or Sy SEEK_DATA
--- a/module/zfs/dmu.c
+++ b/module/zfs/dmu.c
@@ -80,7 +80,7 @@ unsigned long zfs_per_txg_dirty_frees_percent = 30;
* Disabling this option will result in holes never being reported in dirty
* files which is always safe.
*/
-int zfs_dmu_offset_next_sync = 1;
+int zfs_dmu_offset_next_sync = 0;

/*
* Limit the amount we can prefetch with one call to this amount. This
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
From 2b266bd36980caefe353411bd56b2487c44aeb6e Mon Sep 17 00:00:00 2001
From: Sam James <[email protected]>
Date: Fri, 24 Nov 2023 21:38:06 +0000
Subject: [PATCH] Disable zfs_dmu_offset_next_sync tunable by default

As a mitigation until more is understood and fixes are tested & reviewed, change
the default of zfs_dmu_offset_next_sync from 1 to 0, as it was before
05b3eb6d232009db247882a39d518e7282630753.

There are no reported cases of The Bug being hit with zfs_dmu_offset_next_sync=1:
that does not mean this is a cure or a real fix, but it _appears_ to be at least
effective in reducing the chances of it happening. By itself, it's a safe change
anyway, so it feels worth us doing while we wait.

Bug: https://github.com/openzfs/zfs/issues/11900
Bug: https://github.com/openzfs/zfs/issues/15526
Bug: https://bugs.gentoo.org/917224
Signed-off-by: Sam James <[email protected]>
--- a/man/man4/zfs.4
+++ b/man/man4/zfs.4
@@ -1677,7 +1677,7 @@ Allow no-operation writes.
The occurrence of nopwrites will further depend on other pool properties
.Pq i.a. the checksumming and compression algorithms .
.
-.It Sy zfs_dmu_offset_next_sync Ns = Ns Sy 1 Ns | Ns 0 Pq int
+.It Sy zfs_dmu_offset_next_sync Ns = Ns Sy 0 Ns | Ns 1 Pq int
Enable forcing TXG sync to find holes.
When enabled forces ZFS to sync data when
.Sy SEEK_HOLE No or Sy SEEK_DATA
--- a/module/zfs/dmu.c
+++ b/module/zfs/dmu.c
@@ -82,7 +82,7 @@ static uint_t zfs_per_txg_dirty_frees_percent = 30;
* Disabling this option will result in holes never being reported in dirty
* files which is always safe.
*/
-static int zfs_dmu_offset_next_sync = 1;
+static int zfs_dmu_offset_next_sync = 0;

/*
* Limit the amount we can prefetch with one call to this amount. This
--
2.43.0

178 changes: 178 additions & 0 deletions sys-fs/zfs-kmod/zfs-kmod-2.1.13-r1.ebuild
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
# Copyright 1999-2023 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8

inherit autotools dist-kernel-utils flag-o-matic linux-mod-r1 multiprocessing

DESCRIPTION="Linux ZFS kernel module for sys-fs/zfs"
HOMEPAGE="https://github.com/openzfs/zfs"

MODULES_KERNEL_MAX=6.5
MODULES_KERNEL_MIN=3.10

if [[ ${PV} == 9999 ]] ; then
EGIT_REPO_URI="https://github.com/openzfs/zfs.git"
inherit git-r3
unset MODULES_KERNEL_MAX
else
VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/openzfs.asc
inherit verify-sig

MY_PV=${PV/_rc/-rc}
SRC_URI="https://github.com/openzfs/zfs/releases/download/zfs-${MY_PV}/zfs-${MY_PV}.tar.gz"
SRC_URI+=" verify-sig? ( https://github.com/openzfs/zfs/releases/download/zfs-${MY_PV}/zfs-${MY_PV}.tar.gz.asc )"
S="${WORKDIR}/zfs-${PV%_rc?}"

ZFS_KERNEL_COMPAT="${MODULES_KERNEL_MAX}"
# Increments minor eg 5.14 -> 5.15, and still supports override.
ZFS_KERNEL_DEP="${ZFS_KERNEL_COMPAT_OVERRIDE:-${ZFS_KERNEL_COMPAT}}"
ZFS_KERNEL_DEP="${ZFS_KERNEL_DEP%%.*}.$(( ${ZFS_KERNEL_DEP##*.} + 1))"

if [[ ${PV} != *_rc* ]] ; then
KEYWORDS="~amd64 ~arm64 ~ppc64 ~riscv ~sparc"
fi
fi

LICENSE="CDDL MIT debug? ( GPL-2+ )"
SLOT="0/${PVR}"
IUSE="custom-cflags debug +rootfs"
RESTRICT="test"

BDEPEND="
dev-lang/perl
app-alternatives/awk
"

if [[ ${PV} != 9999 ]] ; then
BDEPEND+=" verify-sig? ( sec-keys/openpgp-keys-openzfs )"

IUSE+=" +dist-kernel-cap"
RDEPEND="
dist-kernel-cap? ( dist-kernel? (
<virtual/dist-kernel-${ZFS_KERNEL_DEP}
) )
"
fi

# Used to suggest matching USE, but without suggesting to disable
PDEPEND="dist-kernel? ( ~sys-fs/zfs-${PV}[dist-kernel] )"

PATCHES=(
"${FILESDIR}"/${PN}-2.1.11-gentoo.patch
"${FILESDIR}"/${PN}-2.1.13-Disable-zfs_dmu_offset_next_sync-tunable-by-default.patch
)

pkg_pretend() {
use rootfs || return 0

if has_version virtual/dist-kernel && ! use dist-kernel; then
ewarn "You have virtual/dist-kernel installed, but"
ewarn "USE=\"dist-kernel\" is not enabled for ${CATEGORY}/${PN}"
ewarn "It's recommended to globally enable dist-kernel USE flag"
ewarn "to auto-trigger initrd rebuilds with kernel updates"
fi
}

pkg_setup() {
local CONFIG_CHECK="
EFI_PARTITION
ZLIB_DEFLATE
ZLIB_INFLATE
!DEBUG_LOCK_ALLOC
!PAX_KERNEXEC_PLUGIN_METHOD_OR
"
use debug && CONFIG_CHECK+="
DEBUG_INFO
FRAME_POINTER
!DEBUG_INFO_REDUCED
"
use rootfs && CONFIG_CHECK+="
BLK_DEV_INITRD
DEVTMPFS
"

kernel_is -lt 5 && CONFIG_CHECK+=" IOSCHED_NOOP"

if [[ ${PV} != 9999 ]] ; then
local kv_major_max kv_minor_max zcompat
zcompat="${ZFS_KERNEL_COMPAT_OVERRIDE:-${ZFS_KERNEL_COMPAT}}"
kv_major_max="${zcompat%%.*}"
zcompat="${zcompat#*.}"
kv_minor_max="${zcompat%%.*}"
kernel_is -le "${kv_major_max}" "${kv_minor_max}" || die \
"Linux ${kv_major_max}.${kv_minor_max} is the latest supported version"
fi

linux-mod-r1_pkg_setup
}

src_prepare() {
default

# Run unconditionally (bug #792627)
eautoreconf

if [[ ${PV} != 9999 ]] ; then
# Set module revision number
sed -Ei "s/(Release:.*)1/\1${PR}-gentoo/" META || die
fi
}

src_configure() {
use custom-cflags || strip-flags
filter-ldflags -Wl,*

local myconf=(
--bindir="${EPREFIX}"/bin
--sbindir="${EPREFIX}"/sbin
--with-config=kernel
--with-linux="${KV_DIR}"
--with-linux-obj="${KV_OUT_DIR}"
$(use_enable debug)

# See gentoo.patch
GENTOO_MAKEARGS_EVAL="${MODULES_MAKEARGS[*]@Q}"
TEST_JOBS="$(makeopts_jobs)"
)

econf "${myconf[@]}"
}

src_compile() {
emake "${MODULES_MAKEARGS[@]}"
}

src_install() {
emake "${MODULES_MAKEARGS[@]}" DESTDIR="${ED}" install
modules_post_process

dodoc AUTHORS COPYRIGHT META README.md
}

pkg_postinst() {
linux-mod-r1_pkg_postinst

if [[ -z ${ROOT} ]] && use dist-kernel ; then
dist-kernel_reinstall_initramfs "${KV_DIR}" "${KV_FULL}"
fi

if use x86 || use arm ; then
ewarn "32-bit kernels will likely require increasing vmalloc to"
ewarn "at least 256M and decreasing zfs_arc_max to some value less than that."
fi

if has_version sys-boot/grub ; then
ewarn "This version of OpenZFS includes support for new feature flags"
ewarn "that are incompatible with previous versions. GRUB2 support for"
ewarn "/boot with the new feature flags is not yet available."
ewarn "Do *NOT* upgrade root pools to use the new feature flags."
ewarn "Any new pools will be created with the new feature flags by default"
ewarn "and will not be compatible with older versions of OpenZFS. To"
ewarn "create a new pool that is backward compatible wih GRUB2, use "
ewarn
ewarn "zpool create -o compatibility=grub2 ..."
ewarn
ewarn "Refer to /usr/share/zfs/compatibility.d/grub2 for list of features."
fi
}
Loading

0 comments on commit 02fdf2e

Please sign in to comment.