From: Luis Chamberlain <mcgrof@kernel.org>
To: patches@lists.linux.dev, fstests@vger.kernel.org, linux-mm@kvack.org
Cc: linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org,
oliver.sang@intel.com, hannes@cmpxchg.org, willy@infradead.org,
jack@suse.cz, apopple@nvidia.com, brauner@kernel.org,
hare@suse.de, oe-lkp@lists.linux.dev, lkp@intel.com,
john.g.garry@oracle.com, p.raghav@samsung.com,
da.gomez@samsung.com, dave@stgolabs.net, riel@surriel.com,
krisman@suse.de, boris@bur.io, jackmanb@google.com,
gost.dev@samsung.com, mcgrof@kernel.org
Subject: [PATCH] generic/764: fsstress + migrate_pages() test
Date: Wed, 26 Mar 2025 11:50:55 -0700 [thread overview]
Message-ID: <20250326185101.2237319-1-mcgrof@kernel.org> (raw)
0-day reported a page migration kernel warning with folios which happen
to be buffer-heads [0]. I'm having a terribly hard time reproducing the bug
and so I wrote this test to force page migration filesystems.
It turns out we have have no tests for page migration on fstests or ltp,
and its no surprise, other than compaction covered by generic/750 there
is no easy way to trigger page migration right now unless you have a
numa system.
We should evaluate if we want to help stress test page migration
artificially by later implementing a way to do page migration on simple
systems to an artificial target.
So far, this doesn't trigger any kernel splats, not even warnings for me.
Reported-by: kernel test robot <oliver.sang@intel.com>
Link: https://lore.kernel.org/r/202503101536.27099c77-lkp@intel.com # [0]
Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
---
common/config | 2 +
common/rc | 8 ++++
tests/generic/764 | 94 +++++++++++++++++++++++++++++++++++++++++++
tests/generic/764.out | 2 +
4 files changed, 106 insertions(+)
create mode 100755 tests/generic/764
create mode 100644 tests/generic/764.out
diff --git a/common/config b/common/config
index 2afbda141746..93b50f113b44 100644
--- a/common/config
+++ b/common/config
@@ -239,6 +239,8 @@ export BTRFS_MAP_LOGICAL_PROG=$(type -P btrfs-map-logical)
export PARTED_PROG="$(type -P parted)"
export XFS_PROPERTY_PROG="$(type -P xfs_property)"
export FSCRYPTCTL_PROG="$(type -P fscryptctl)"
+export NUMACTL_PROG="$(type -P numactl)"
+export MIGRATEPAGES_PROG="$(type -P migratepages)"
# udev wait functions.
#
diff --git a/common/rc b/common/rc
index e51686389a78..ed9613a9bf28 100644
--- a/common/rc
+++ b/common/rc
@@ -281,6 +281,14 @@ _require_vm_compaction()
fi
}
+_require_numa_nodes()
+{
+ readarray -t QUEUE < <($NUMACTL_PROG --show | awk '/^membind:/ {for (i=2; i<=NF; i++) print $i}')
+ if (( ${#QUEUE[@]} < 2 )); then
+ _notrun "You need a system with at least two numa nodes to run this test"
+ fi
+}
+
# Requires CONFIG_DEBUGFS and truncation knobs
_require_split_huge_pages_knob()
{
diff --git a/tests/generic/764 b/tests/generic/764
new file mode 100755
index 000000000000..91d9fb7e08da
--- /dev/null
+++ b/tests/generic/764
@@ -0,0 +1,94 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2024 Luis Chamberlain. All Rights Reserved.
+#
+# FS QA Test 764
+#
+# fsstress + migrate_pages() test
+#
+. ./common/preamble
+_begin_fstest auto rw long_rw stress soak smoketest
+
+_cleanup()
+{
+ cd /
+ rm -f $runfile
+ rm -f $tmp.*
+ kill -9 $run_migration_pid > /dev/null 2>&1
+ kill -9 $stress_pid > /dev/null 2>&1
+
+ wait > /dev/null 2>&1
+}
+
+_require_scratch
+_require_command "$NUMACTL_PROG" "numactl"
+_require_command "$MIGRATEPAGES_PROG" "migratepages"
+_require_numa_nodes
+
+readarray -t QUEUE < <($NUMACTL_PROG --show | awk '/^membind:/ {for (i=2; i<=NF; i++) print $i}')
+if (( ${#QUEUE[@]} < 2 )); then
+ echo "Not enough NUMA nodes to pick two different ones."
+ exit 1
+fi
+
+echo "Silence is golden"
+
+_scratch_mkfs > $seqres.full 2>&1
+_scratch_mount >> $seqres.full 2>&1
+
+nr_cpus=$((LOAD_FACTOR * 4))
+nr_ops=$((25000 * nr_cpus * TIME_FACTOR))
+fsstress_args=(-w -d $SCRATCH_MNT -n $nr_ops -p $nr_cpus)
+test -n "$SOAK_DURATION" && fsstress_args+=(--duration="$SOAK_DURATION")
+
+runfile="$tmp.migratepages"
+pidfile="$tmp.stress.pid"
+
+run_stress_fs()
+{
+ $FSSTRESS_PROG $FSSTRESS_AVOID "${fsstress_args[@]}" &
+ stress_pid=$!
+ echo $stress_pid > $pidfile
+ wait $stress_pid
+ rm -f $runfile
+ rm -f $pidfile
+}
+
+run_stress_fs &
+touch $runfile
+
+stress_pid=$(cat $pidfile)
+
+while [ -e $runfile ]; do
+ readarray -t QUEUE < <(numactl --show | awk '/^membind:/ {for (i=2; i<=NF; i++) print $i}')
+ # Proper Fisher–Yates shuffle
+ for ((i=${#QUEUE[@]} - 1; i > 0; i--)); do
+ j=$((RANDOM % (i + 1)))
+ var=${QUEUE[i]}
+ QUEUE[i]=${QUEUE[j]}
+ QUEUE[j]=$var
+ done
+
+ RANDOM_NODE_1=${QUEUE[0]}
+ RANDOM_NODE_2=${QUEUE[1]}
+
+ if [[ -f $pidfile ]]; then
+ echo "migrating parent fsstress process:" >> $seqres.full
+ echo -en "\t$MIGRATEPAGES_PROG $pid $RANDOM_NODE_1 $RANDOM_NODE_2 ..." >> $seqres.full
+ $MIGRATEPAGES_PROG $stress_pid $RANDOM_NODE_1 $RANDOM_NODE_2
+ echo " $?" >> $seqres.full
+ echo "migrating child fsstress processes ..." >> $seqres.full
+ for pid in $(ps --ppid "$stress_pid" -o pid=); do
+ echo -en "\tmigratepages $pid $RANDOM_NODE_1 $RANDOM_NODE_2 ..." >> $seqres.full
+ $MIGRATEPAGES_PROG $pid $RANDOM_NODE_1 $RANDOM_NODE_2
+ echo " $?" >> $seqres.full
+ done
+ fi
+ sleep 2
+done &
+run_migration_pid=$!
+
+wait > /dev/null 2>&1
+
+status=0
+exit
diff --git a/tests/generic/764.out b/tests/generic/764.out
new file mode 100644
index 000000000000..bb58e5b8957f
--- /dev/null
+++ b/tests/generic/764.out
@@ -0,0 +1,2 @@
+QA output created by 764
+Silence is golden
--
2.47.2
next reply other threads:[~2025-03-26 18:51 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-03-26 18:50 Luis Chamberlain [this message]
2025-03-26 21:10 ` Dave Chinner
2025-03-27 11:53 ` Jan Kara
2025-03-27 20:22 ` Dave Chinner
2025-03-27 21:35 ` Luis Chamberlain
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250326185101.2237319-1-mcgrof@kernel.org \
--to=mcgrof@kernel.org \
--cc=apopple@nvidia.com \
--cc=boris@bur.io \
--cc=brauner@kernel.org \
--cc=da.gomez@samsung.com \
--cc=dave@stgolabs.net \
--cc=fstests@vger.kernel.org \
--cc=gost.dev@samsung.com \
--cc=hannes@cmpxchg.org \
--cc=hare@suse.de \
--cc=jack@suse.cz \
--cc=jackmanb@google.com \
--cc=john.g.garry@oracle.com \
--cc=krisman@suse.de \
--cc=linux-block@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=lkp@intel.com \
--cc=oe-lkp@lists.linux.dev \
--cc=oliver.sang@intel.com \
--cc=p.raghav@samsung.com \
--cc=patches@lists.linux.dev \
--cc=riel@surriel.com \
--cc=willy@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox