selftests/damon: test debugfs file reads/writes with huge count

commit b4a002889d upstream.

DAMON debugfs interface users were able to trigger warning by writing
some files with arbitrarily large 'count' parameter.  The issue is fixed
with commit db7a347b26 ("mm/damon/dbgfs: use '__GFP_NOWARN' for
user-specified size buffer allocation").  This commit adds a test case
for the issue in DAMON selftests to avoid future regressions.

Link: https://lkml.kernel.org/r/20211201150440.1088-11-sj@kernel.org
Signed-off-by: SeongJae Park <sj@kernel.org>
Cc: Brendan Higgins <brendanhiggins@google.com>
Cc: Shuah Khan <shuah@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
SeongJae Park
2021-12-10 14:46:55 -08:00
committed by Greg Kroah-Hartman
parent a272f990cb
commit 581b097951
4 changed files with 61 additions and 0 deletions

View File

@@ -0,0 +1,2 @@
# SPDX-License-Identifier: GPL-2.0-only
huge_count_read_write

View File

@@ -1,6 +1,8 @@
# SPDX-License-Identifier: GPL-2.0
# Makefile for damon selftests
TEST_GEN_FILES += huge_count_read_write
TEST_FILES = _chk_dependency.sh
TEST_PROGS = debugfs_attrs.sh

View File

@@ -72,4 +72,22 @@ test_write_succ "$file" "" "$orig_content" "empty input"
test_content "$file" "$orig_content" "" "empty input written"
echo "$orig_content" > "$file"
# Test huge count read write
# ==========================
dmesg -C
for file in "$DBGFS/"*
do
./huge_count_read_write "$file"
done
if dmesg | grep -q WARNING
then
dmesg
exit 1
else
exit 0
fi
echo "PASS"

View File

@@ -0,0 +1,39 @@
// SPDX-License-Identifier: GPL-2.0
/*
* Author: SeongJae Park <sj@kernel.org>
*/
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
void write_read_with_huge_count(char *file)
{
int filedesc = open(file, O_RDWR);
char buf[25];
int ret;
printf("%s %s\n", __func__, file);
if (filedesc < 0) {
fprintf(stderr, "failed opening %s\n", file);
exit(1);
}
write(filedesc, "", 0xfffffffful);
perror("after write: ");
ret = read(filedesc, buf, 0xfffffffful);
perror("after read: ");
close(filedesc);
}
int main(int argc, char *argv[])
{
if (argc != 2) {
fprintf(stderr, "Usage: %s <file>\n", argv[0]);
exit(1);
}
write_read_with_huge_count(argv[1]);
return 0;
}