forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 8
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
selftests/damon: test removed scheme sysfs dir access bug
A DAMON sysfs user could start DAMON with a scheme, remove the sysfs directory for the scheme, and then ask stats or schemes tried regions update. The related logic were not aware of the already removed directory situation, so it was able to results in invalid memory accesses. The fix has made with commit 8468b48 ("mm/damon/sysfs-schemes: skip stats update if the scheme directory is removed"), though. Add a selftest to prevent such kinds of bugs from being introduced again. Link: https://lkml.kernel.org/r/[email protected] Signed-off-by: SeongJae Park <[email protected]> Cc: Shuah Khan <[email protected]> Signed-off-by: Andrew Morton <[email protected]>
- Loading branch information
Showing
2 changed files
with
59 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
58 changes: 58 additions & 0 deletions
58
tools/testing/selftests/damon/sysfs_update_removed_scheme_dir.sh
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
#!/bin/bash | ||
# SPDX-License-Identifier: GPL-2.0 | ||
|
||
# Kselftest framework requirement - SKIP code is 4. | ||
ksft_skip=4 | ||
|
||
if [ $EUID -ne 0 ] | ||
then | ||
echo "Run as root" | ||
exit $ksft_skip | ||
fi | ||
|
||
damon_sysfs="/sys/kernel/mm/damon/admin" | ||
if [ ! -d "$damon_sysfs" ] | ||
then | ||
echo "damon sysfs not found" | ||
exit $ksft_skip | ||
fi | ||
|
||
# clear log | ||
dmesg -C | ||
|
||
# start DAMON with a scheme | ||
echo 1 > "$damon_sysfs/kdamonds/nr_kdamonds" | ||
echo 1 > "$damon_sysfs/kdamonds/0/contexts/nr_contexts" | ||
echo "vaddr" > "$damon_sysfs/kdamonds/0/contexts/0/operations" | ||
echo 1 > "$damon_sysfs/kdamonds/0/contexts/0/targets/nr_targets" | ||
echo $$ > "$damon_sysfs/kdamonds/0/contexts/0/targets/0/pid_target" | ||
echo 1 > "$damon_sysfs/kdamonds/0/contexts/0/schemes/nr_schemes" | ||
scheme_dir="$damon_sysfs/kdamonds/0/contexts/0/schemes/0" | ||
echo 4096000 > "$scheme_dir/access_pattern/sz/max" | ||
echo 20 > "$scheme_dir/access_pattern/nr_accesses/max" | ||
echo 1024 > "$scheme_dir/access_pattern/age/max" | ||
echo "on" > "$damon_sysfs/kdamonds/0/state" | ||
sleep 0.3 | ||
|
||
# remove scheme sysfs dir | ||
echo 0 > "$damon_sysfs/kdamonds/0/contexts/0/schemes/nr_schemes" | ||
|
||
# try to update stat of already removed scheme sysfs dir | ||
echo "update_schemes_stats" > "$damon_sysfs/kdamonds/0/state" | ||
if dmesg | grep -q BUG | ||
then | ||
echo "update_schemes_stats triggers a kernel bug" | ||
dmesg | ||
exit 1 | ||
fi | ||
|
||
# try to update tried regions of already removed scheme sysfs dir | ||
echo "update_schemes_tried_regions" > "$damon_sysfs/kdamonds/0/state" | ||
if dmesg | grep -q BUG | ||
then | ||
echo "update_schemes_tried_regions triggers a kernel bug" | ||
dmesg | ||
exit 1 | ||
fi | ||
|
||
echo "off" > "$damon_sysfs/kdamonds/0/state" |