Skip to content

Commit

Permalink
selftests/damon: test removed scheme sysfs dir access bug
Browse files Browse the repository at this point in the history
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
sjp38 authored and akpm00 committed Dec 12, 2022
1 parent c8c7016 commit 0b7623b
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 1 deletion.
2 changes: 1 addition & 1 deletion tools/testing/selftests/damon/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ TEST_PROGS = debugfs_attrs.sh debugfs_schemes.sh debugfs_target_ids.sh
TEST_PROGS += debugfs_empty_targets.sh debugfs_huge_count_read_write.sh
TEST_PROGS += debugfs_duplicate_context_creation.sh
TEST_PROGS += debugfs_rm_non_contexts.sh
TEST_PROGS += sysfs.sh
TEST_PROGS += sysfs.sh sysfs_update_removed_scheme_dir.sh
TEST_PROGS += reclaim.sh lru_sort.sh

include ../lib.mk
58 changes: 58 additions & 0 deletions tools/testing/selftests/damon/sysfs_update_removed_scheme_dir.sh
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"

0 comments on commit 0b7623b

Please sign in to comment.