#! /bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (c) 2021 Oracle, Inc. All Rights Reserved. # # FS QA Test No. 650 # # Run an all-writes fsstress run with multiple threads while exercising CPU # hotplugging to shake out bugs in the write path. # . ./common/preamble _begin_fstest auto rw stress soak [ "$FSTYP" = "xfs" ] && _fixed_by_kernel_commit ecd49f7a36fb \ "xfs: fix per-cpu CIL structure aggregation racing with dying cpus" # Override the default cleanup function. _cleanup() { cd / rm -f $tmp.* $KILLALL_PROG -9 fsstress > /dev/null 2>&1 wait # for exercise_cpu_hotplug subprocess for i in "$sysfs_cpu_dir/"cpu*/online; do echo 1 > "$i" 2>/dev/null done test -n "$stress_dir" && rm -r -f "$stress_dir" } exercise_cpu_hotplug() { while [ -e $sentinel_file ]; do local idx=$(( RANDOM % nr_hotplug_cpus )) local cpu="${hotplug_cpus[idx]}" local action=$(( RANDOM % 2 )) echo "$action" > "$sysfs_cpu_dir/cpu$cpu/online" 2>/dev/null sleep 0.5 done } _supported_fs generic _require_test _require_command "$KILLALL_PROG" "killall" sysfs_cpu_dir="/sys/devices/system/cpu" # Figure out which CPU(s) support hotplug. nrcpus=$(getconf _NPROCESSORS_CONF) hotplug_cpus=() for ((i = 0; i < nrcpus; i++ )); do test -e "$sysfs_cpu_dir/cpu$i/online" && hotplug_cpus+=("$i") done nr_hotplug_cpus="${#hotplug_cpus[@]}" test "$nr_hotplug_cpus" -gt 0 || _notrun "CPU hotplugging not supported" stress_dir="$TEST_DIR/$seq" rm -r -f "$stress_dir" mkdir -p "$stress_dir" echo "Silence is golden." sentinel_file=$tmp.hotplug touch $sentinel_file exercise_cpu_hotplug & fsstress_args=(-w -d $stress_dir) # Cap the number of fsstress threads at one per hotpluggable CPU if we exceed # 1024 IO threads, per maintainer request. nr_cpus=$((LOAD_FACTOR * nr_hotplug_cpus)) test "$nr_cpus" -gt 1024 && nr_cpus="$nr_hotplug_cpus" fsstress_args+=(-p $nr_cpus) if [ -n "$SOAK_DURATION" ]; then test "$SOAK_DURATION" -lt 10 && SOAK_DURATION=10 fsstress_args+=(--duration="$((SOAK_DURATION / 10))") fi nr_ops=$((2500 * TIME_FACTOR)) fsstress_args+=(-n $nr_ops) for ((i = 0; i < 10; i++)); do $FSSTRESS_PROG $FSSTRESS_AVOID -w "${fsstress_args[@]}" >> $seqres.full _test_cycle_mount done rm -f $sentinel_file # success, all done status=0 exit