#!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Kselftest frmework requirement - SKIP code is 4. ksft_skip=4 ensure_write_succ() { file=$1 content=$2 reason=$3 if ! echo "$content" > "$file" then echo "writing $content to $file failed" echo "expected success because $reason" exit 1 fi } ensure_write_fail() { file=$1 content=$2 reason=$3 if echo "$content" > "$file" then echo "writing $content to $file succeed ($fail_reason)" echo "expected failure because $reason" exit 1 fi } ensure_dir() { dir=$1 to_ensure=$2 if [ "$to_ensure" = "exist" ] && [ ! -d "$dir" ] then echo "$dir dir is expected but not found" exit 1 elif [ "$to_ensure" = "not_exist" ] && [ -d "$dir" ] then echo "$dir dir is not expected but found" exit 1 fi } ensure_file() { file=$1 to_ensure=$2 permission=$3 if [ "$to_ensure" = "exist" ] then if [ ! -f "$file" ] then echo "$file is expected but not found" exit 1 fi perm=$(stat -c "%a" "$file") if [ ! "$perm" = "$permission" ] then echo "$file permission: expected $permission but $perm" exit 1 fi elif [ "$to_ensure" = "not_exist" ] && [ -f "$dir" ] then echo "$file is not expected but found" exit 1 fi } test_range() { range_dir=$1 ensure_dir "$range_dir" "exist" ensure_file "$range_dir/min" "exist" 600 ensure_file "$range_dir/max" "exist" 600 } test_stats() { stats_dir=$1 ensure_dir "$stats_dir" "exist" for f in nr_tried sz_tried nr_applied sz_applied qt_exceeds do ensure_file "$stats_dir/$f" "exist" "400" done } test_watermarks() { watermarks_dir=$1 ensure_dir "$watermarks_dir" "exist" ensure_file "$watermarks_dir/metric" "exist" "600" ensure_file "$watermarks_dir/interval_us" "exist" "600" ensure_file "$watermarks_dir/high" "exist" "600" ensure_file "$watermarks_dir/mid" "exist" "600" ensure_file "$watermarks_dir/low" "exist" "600" } test_weights() { weights_dir=$1 ensure_dir "$weights_dir" "exist" ensure_file "$weights_dir/sz_permil" "exist" "600" ensure_file "$weights_dir/nr_accesses_permil" "exist" "600" ensure_file "$weights_dir/age_permil" "exist" "600" } test_quotas() { quotas_dir=$1 ensure_dir "$quotas_dir" "exist" ensure_file "$quotas_dir/ms" "exist" 600 ensure_file "$quotas_dir/bytes" "exist" 600 ensure_file "$quotas_dir/reset_interval_ms" "exist" 600 test_weights "$quotas_dir/weights" } test_access_pattern() { access_pattern_dir=$1 ensure_dir "$access_pattern_dir" "exist" test_range "$access_pattern_dir/age" test_range "$access_pattern_dir/nr_accesses" test_range "$access_pattern_dir/sz" } test_scheme() { scheme_dir=$1 ensure_dir "$scheme_dir" "exist" ensure_file "$scheme_dir/action" "exist" "600" test_access_pattern "$scheme_dir/access_pattern" test_quotas "$scheme_dir/quotas" test_watermarks "$scheme_dir/watermarks" test_stats "$scheme_dir/stats" } test_schemes() { schemes_dir=$1 ensure_dir "$schemes_dir" "exist" ensure_file "$schemes_dir/nr_schemes" "exist" 600 ensure_write_succ "$schemes_dir/nr_schemes" "1" "valid input" test_scheme "$schemes_dir/0" ensure_write_succ "$schemes_dir/nr_schemes" "2" "valid input" test_scheme "$schemes_dir/0" test_scheme "$schemes_dir/1" ensure_write_succ "$schemes_dir/nr_schemes" "0" "valid input" ensure_dir "$schemes_dir/0" "not_exist" ensure_dir "$schemes_dir/1" "not_exist" } test_region() { region_dir=$1 ensure_dir "$region_dir" "exist" ensure_file "$region_dir/start" "exist" 600 ensure_file "$region_dir/end" "exist" 600 } test_regions() { regions_dir=$1 ensure_dir "$regions_dir" "exist" ensure_file "$regions_dir/nr_regions" "exist" 600 ensure_write_succ "$regions_dir/nr_regions" "1" "valid input" test_region "$regions_dir/0" ensure_write_succ "$regions_dir/nr_regions" "2" "valid input" test_region "$regions_dir/0" test_region "$regions_dir/1" ensure_write_succ "$regions_dir/nr_regions" "0" "valid input" ensure_dir "$regions_dir/0" "not_exist" ensure_dir "$regions_dir/1" "not_exist" } test_target() { target_dir=$1 ensure_dir "$target_dir" "exist" ensure_file "$target_dir/pid_target" "exist" "600" test_regions "$target_dir/regions" } test_targets() { targets_dir=$1 ensure_dir "$targets_dir" "exist" ensure_file "$targets_dir/nr_targets" "exist" 600 ensure_write_succ "$targets_dir/nr_targets" "1" "valid input" test_target "$targets_dir/0" ensure_write_succ "$targets_dir/nr_targets" "2" "valid input" test_target "$targets_dir/0" test_target "$targets_dir/1" ensure_write_succ "$targets_dir/nr_targets" "0" "valid input" ensure_dir "$targets_dir/0" "not_exist" ensure_dir "$targets_dir/1" "not_exist" } test_intervals() { intervals_dir=$1 ensure_dir "$intervals_dir" "exist" ensure_file "$intervals_dir/aggr_us" "exist" "600" ensure_file "$intervals_dir/sample_us" "exist" "600" ensure_file "$intervals_dir/update_us" "exist" "600" } test_monitoring_attrs() { monitoring_attrs_dir=$1 ensure_dir "$monitoring_attrs_dir" "exist" test_intervals "$monitoring_attrs_dir/intervals" test_range "$monitoring_attrs_dir/nr_regions" } test_context() { context_dir=$1 ensure_dir "$context_dir" "exist" ensure_file "$context_dir/operations" "exist" 600 test_monitoring_attrs "$context_dir/monitoring_attrs" test_targets "$context_dir/targets" test_schemes "$context_dir/schemes" } test_contexts() { contexts_dir=$1 ensure_dir "$contexts_dir" "exist" ensure_file "$contexts_dir/nr_contexts" "exist" 600 ensure_write_succ "$contexts_dir/nr_contexts" "1" "valid input" test_context "$contexts_dir/0" ensure_write_fail "$contexts_dir/nr_contexts" "2" "only 0/1 are supported" test_context "$contexts_dir/0" ensure_write_succ "$contexts_dir/nr_contexts" "0" "valid input" ensure_dir "$contexts_dir/0" "not_exist" } test_kdamond() { kdamond_dir=$1 ensure_dir "$kdamond_dir" "exist" ensure_file "$kdamond_dir/state" "exist" "600" ensure_file "$kdamond_dir/pid" "exist" 400 test_contexts "$kdamond_dir/contexts" } test_kdamonds() { kdamonds_dir=$1 ensure_dir "$kdamonds_dir" "exist" ensure_file "$kdamonds_dir/nr_kdamonds" "exist" "600" ensure_write_succ "$kdamonds_dir/nr_kdamonds" "1" "valid input" test_kdamond "$kdamonds_dir/0" ensure_write_succ "$kdamonds_dir/nr_kdamonds" "2" "valid input" test_kdamond "$kdamonds_dir/0" test_kdamond "$kdamonds_dir/1" ensure_write_succ "$kdamonds_dir/nr_kdamonds" "0" "valid input" ensure_dir "$kdamonds_dir/0" "not_exist" ensure_dir "$kdamonds_dir/1" "not_exist" } test_damon_sysfs() { damon_sysfs=$1 if [ ! -d "$damon_sysfs" ] then echo "$damon_sysfs not found" exit $ksft_skip fi test_kdamonds "$damon_sysfs/kdamonds" } check_dependencies() { if [ $EUID -ne 0 ] then echo "Run as root" exit $ksft_skip fi } check_dependencies test_damon_sysfs "/sys/kernel/mm/damon/admin"