Skip to content
Snippets Groups Projects
Commit 0b7623bd authored by SeongJae Park's avatar SeongJae Park Committed by Andrew Morton
Browse files

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 8468b486 ("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/20221201170834.62823-1-sj@kernel.org


Signed-off-by: default avatarSeongJae Park <sj@kernel.org>
Cc: Shuah Khan <shuah@kernel.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent c8c7016f
No related branches found
No related tags found
No related merge requests found
......@@ -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
#!/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% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment