1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3 4source _common.sh 5 6# Kselftest framework requirement - SKIP code is 4. 7ksft_skip=4 8 9ensure_write_succ() 10{ 11 file=$1 12 content=$2 13 reason=$3 14 15 if ! echo "$content" > "$file" 16 then 17 echo "writing $content to $file failed" 18 echo "expected success because $reason" 19 exit 1 20 fi 21} 22 23ensure_write_fail() 24{ 25 file=$1 26 content=$2 27 reason=$3 28 29 if (echo "$content" > "$file") 2> /dev/null 30 then 31 echo "writing $content to $file succeeded ($reason)" 32 echo "expected failure because $reason" 33 exit 1 34 fi 35} 36 37ensure_dir() 38{ 39 dir=$1 40 to_ensure=$2 41 if [ "$to_ensure" = "exist" ] && [ ! -d "$dir" ] 42 then 43 echo "$dir dir is expected but not found" 44 exit 1 45 elif [ "$to_ensure" = "not_exist" ] && [ -d "$dir" ] 46 then 47 echo "$dir dir is not expected but found" 48 exit 1 49 fi 50} 51 52ensure_file() 53{ 54 file=$1 55 to_ensure=$2 56 permission=$3 57 if [ "$to_ensure" = "exist" ] 58 then 59 if [ ! -f "$file" ] 60 then 61 echo "$file is expected but not found" 62 exit 1 63 fi 64 perm=$(stat -c "%a" "$file") 65 if [ ! "$perm" = "$permission" ] 66 then 67 echo "$file permission: expected $permission but $perm" 68 exit 1 69 fi 70 elif [ "$to_ensure" = "not_exist" ] && [ -f "$file" ] 71 then 72 echo "$file is not expected but found" 73 exit 1 74 fi 75} 76 77test_range() 78{ 79 range_dir=$1 80 ensure_dir "$range_dir" "exist" 81 ensure_file "$range_dir/min" "exist" 600 82 ensure_file "$range_dir/max" "exist" 600 83} 84 85test_tried_regions() 86{ 87 tried_regions_dir=$1 88 ensure_dir "$tried_regions_dir" "exist" 89 ensure_file "$tried_regions_dir/total_bytes" "exist" "400" 90} 91 92test_stats() 93{ 94 stats_dir=$1 95 ensure_dir "$stats_dir" "exist" 96 for f in nr_tried sz_tried nr_applied sz_applied qt_exceeds 97 do 98 ensure_file "$stats_dir/$f" "exist" "400" 99 done 100} 101 102test_dest() 103{ 104 dest_dir=$1 105 ensure_file "$dest_dir/id" "exist" "600" 106 ensure_file "$dest_dir/weight" "exist" "600" 107} 108 109test_dests() 110{ 111 dests_dir=$1 112 ensure_file "$dests_dir/nr_dests" "exist" "600" 113 ensure_write_succ "$dests_dir/nr_dests" "1" "valid input" 114 test_dest "$dests_dir/0" 115 116 ensure_write_succ "$dests_dir/nr_dests" "2" "valid input" 117 test_dest "$dests_dir/0" 118 test_dest "$dests_dir/1" 119 120 ensure_write_succ "$dests_dir/nr_dests" "0" "valid input" 121 ensure_dir "$dests_dir/0" "not_exist" 122 ensure_dir "$dests_dir/1" "not_exist" 123} 124 125test_filter() 126{ 127 filter_dir=$1 128 ensure_file "$filter_dir/type" "exist" "600" 129 130 local dir_name=$(basename "$(dirname "$filter_dir")") 131 if [ "$dir_name" = "filters" ] || [ "$dir_name" = "ops_filters" ] 132 then 133 ensure_write_succ "$filter_dir/type" "anon" "valid input" 134 ensure_write_succ "$filter_dir/type" "memcg" "valid input" 135 fi 136 if [ "$dir_name" = "filters" ] || [ "$dir_name" = "core_filters" ] 137 then 138 ensure_write_succ "$filter_dir/type" "addr" "valid input" 139 ensure_write_succ "$filter_dir/type" "target" "valid input" 140 fi 141 if [ "$dir_name" = "core_filters" ] 142 then 143 ensure_write_fail "$filter_dir/type" "anon" "ops type" 144 ensure_write_fail "$filter_dir/type" "memcg" "ops type" 145 fi 146 if [ "$dir_name" = "ops_filters" ] 147 then 148 ensure_write_fail "$filter_dir/type" "addr" "core type" 149 ensure_write_fail "$filter_dir/type" "target" "core type" 150 fi 151 ensure_write_fail "$filter_dir/type" "foo" "invalid input" 152 ensure_file "$filter_dir/matching" "exist" "600" 153 ensure_file "$filter_dir/memcg_path" "exist" "600" 154 ensure_file "$filter_dir/addr_start" "exist" "600" 155 ensure_file "$filter_dir/addr_end" "exist" "600" 156 ensure_file "$filter_dir/damon_target_idx" "exist" "600" 157} 158 159test_filters() 160{ 161 filters_dir=$1 162 ensure_dir "$filters_dir" "exist" 163 ensure_file "$filters_dir/nr_filters" "exist" "600" 164 ensure_write_succ "$filters_dir/nr_filters" "1" "valid input" 165 test_filter "$filters_dir/0" 166 167 ensure_write_succ "$filters_dir/nr_filters" "2" "valid input" 168 test_filter "$filters_dir/0" 169 test_filter "$filters_dir/1" 170 171 ensure_write_succ "$filters_dir/nr_filters" "0" "valid input" 172 ensure_dir "$filters_dir/0" "not_exist" 173 ensure_dir "$filters_dir/1" "not_exist" 174} 175 176test_watermarks() 177{ 178 watermarks_dir=$1 179 ensure_dir "$watermarks_dir" "exist" 180 ensure_file "$watermarks_dir/metric" "exist" "600" 181 ensure_file "$watermarks_dir/interval_us" "exist" "600" 182 ensure_file "$watermarks_dir/high" "exist" "600" 183 ensure_file "$watermarks_dir/mid" "exist" "600" 184 ensure_file "$watermarks_dir/low" "exist" "600" 185} 186 187test_weights() 188{ 189 weights_dir=$1 190 ensure_dir "$weights_dir" "exist" 191 ensure_file "$weights_dir/sz_permil" "exist" "600" 192 ensure_file "$weights_dir/nr_accesses_permil" "exist" "600" 193 ensure_file "$weights_dir/age_permil" "exist" "600" 194} 195 196test_goal() 197{ 198 goal_dir=$1 199 ensure_dir "$goal_dir" "exist" 200 ensure_file "$goal_dir/target_value" "exist" "600" 201 ensure_file "$goal_dir/current_value" "exist" "600" 202 ensure_file "$goal_dir/target_metric" "exist" "600" 203 local fpath="$goal_dir/target_metric" 204 ensure_write_succ "$fpath" "user_input" "valid input" 205 ensure_write_succ "$fpath" "some_mem_psi_us" "valid input" 206 ensure_write_succ "$fpath" "node_mem_used_bp" "valid input" 207 ensure_write_succ "$fpath" "node_mem_free_bp" "valid input" 208 ensure_write_succ "$fpath" "node_memcg_used_bp" "valid input" 209 ensure_write_succ "$fpath" "node_memcg_free_bp" "valid input" 210 ensure_write_succ "$fpath" "active_mem_bp" "valid input" 211 ensure_write_succ "$fpath" "inactive_mem_bp" "valid input" 212 ensure_write_succ "$fpath" "node_eligible_mem_bp" "valid input" 213 ensure_write_fail "$fpath" "foo" "invalid input" 214 ensure_file "$goal_dir/nid" "exist" "600" 215 ensure_file "$goal_dir/path" "exist" "600" 216} 217 218test_goals() 219{ 220 goals_dir=$1 221 ensure_dir "$goals_dir" "exist" 222 ensure_file "$goals_dir/nr_goals" "exist" "600" 223 224 ensure_write_succ "$goals_dir/nr_goals" "1" "valid input" 225 test_goal "$goals_dir/0" 226 227 ensure_write_succ "$goals_dir/nr_goals" "2" "valid input" 228 test_goal "$goals_dir/0" 229 test_goal "$goals_dir/1" 230 231 ensure_write_succ "$goals_dir/nr_goals" "0" "valid input" 232 ensure_dir "$goals_dir/0" "not_exist" 233 ensure_dir "$goals_dir/1" "not_exist" 234} 235 236test_quotas() 237{ 238 quotas_dir=$1 239 ensure_dir "$quotas_dir" "exist" 240 ensure_file "$quotas_dir/ms" "exist" 600 241 ensure_file "$quotas_dir/bytes" "exist" 600 242 ensure_file "$quotas_dir/reset_interval_ms" "exist" 600 243 test_weights "$quotas_dir/weights" 244 test_goals "$quotas_dir/goals" 245} 246 247test_access_pattern() 248{ 249 access_pattern_dir=$1 250 ensure_dir "$access_pattern_dir" "exist" 251 test_range "$access_pattern_dir/age" 252 test_range "$access_pattern_dir/nr_accesses" 253 test_range "$access_pattern_dir/sz" 254} 255 256test_scheme() 257{ 258 scheme_dir=$1 259 ensure_dir "$scheme_dir" "exist" 260 ensure_file "$scheme_dir/action" "exist" "600" 261 test_access_pattern "$scheme_dir/access_pattern" 262 ensure_file "$scheme_dir/apply_interval_us" "exist" "600" 263 test_quotas "$scheme_dir/quotas" 264 test_watermarks "$scheme_dir/watermarks" 265 test_dests "$scheme_dir/dests" 266 test_filters "$scheme_dir/filters" 267 test_filters "$scheme_dir/core_filters" 268 test_filters "$scheme_dir/ops_filters" 269 test_stats "$scheme_dir/stats" 270 test_tried_regions "$scheme_dir/tried_regions" 271} 272 273test_schemes() 274{ 275 schemes_dir=$1 276 ensure_dir "$schemes_dir" "exist" 277 ensure_file "$schemes_dir/nr_schemes" "exist" 600 278 279 ensure_write_succ "$schemes_dir/nr_schemes" "1" "valid input" 280 test_scheme "$schemes_dir/0" 281 282 ensure_write_succ "$schemes_dir/nr_schemes" "2" "valid input" 283 test_scheme "$schemes_dir/0" 284 test_scheme "$schemes_dir/1" 285 286 ensure_write_succ "$schemes_dir/nr_schemes" "0" "valid input" 287 ensure_dir "$schemes_dir/0" "not_exist" 288 ensure_dir "$schemes_dir/1" "not_exist" 289} 290 291test_region() 292{ 293 region_dir=$1 294 ensure_dir "$region_dir" "exist" 295 ensure_file "$region_dir/start" "exist" 600 296 ensure_file "$region_dir/end" "exist" 600 297} 298 299test_regions() 300{ 301 regions_dir=$1 302 ensure_dir "$regions_dir" "exist" 303 ensure_file "$regions_dir/nr_regions" "exist" 600 304 305 ensure_write_succ "$regions_dir/nr_regions" "1" "valid input" 306 test_region "$regions_dir/0" 307 308 ensure_write_succ "$regions_dir/nr_regions" "2" "valid input" 309 test_region "$regions_dir/0" 310 test_region "$regions_dir/1" 311 312 ensure_write_succ "$regions_dir/nr_regions" "0" "valid input" 313 ensure_dir "$regions_dir/0" "not_exist" 314 ensure_dir "$regions_dir/1" "not_exist" 315} 316 317test_target() 318{ 319 target_dir=$1 320 ensure_dir "$target_dir" "exist" 321 ensure_file "$target_dir/pid_target" "exist" "600" 322 test_regions "$target_dir/regions" 323} 324 325test_targets() 326{ 327 targets_dir=$1 328 ensure_dir "$targets_dir" "exist" 329 ensure_file "$targets_dir/nr_targets" "exist" 600 330 331 ensure_write_succ "$targets_dir/nr_targets" "1" "valid input" 332 test_target "$targets_dir/0" 333 334 ensure_write_succ "$targets_dir/nr_targets" "2" "valid input" 335 test_target "$targets_dir/0" 336 test_target "$targets_dir/1" 337 338 ensure_write_succ "$targets_dir/nr_targets" "0" "valid input" 339 ensure_dir "$targets_dir/0" "not_exist" 340 ensure_dir "$targets_dir/1" "not_exist" 341} 342 343 344test_intervals_goal() 345{ 346 goal_dir=$1 347 ensure_dir "$goal_dir" "exist" 348 ensure_file "$goal_dir/access_bp" "exist" "600" 349 ensure_file "$goal_dir/aggrs" "exist" "600" 350 ensure_file "$goal_dir/min_sample_us" "exist" "600" 351 ensure_file "$goal_dir/max_sample_us" "exist" "600" 352} 353 354test_intervals() 355{ 356 intervals_dir=$1 357 ensure_dir "$intervals_dir" "exist" 358 ensure_file "$intervals_dir/aggr_us" "exist" "600" 359 ensure_file "$intervals_dir/sample_us" "exist" "600" 360 ensure_file "$intervals_dir/update_us" "exist" "600" 361 test_intervals_goal "$intervals_dir/intervals_goal" 362} 363 364test_damon_filter() 365{ 366 damon_filter_dir=$1 367 ensure_file "$damon_filter_dir/type" "exist" "600" 368 ensure_write_succ "$damon_filter_dir/type" "anon" "valid input" 369 ensure_write_fail "$damon_filter_dir/type" "foo" "invalid input" 370 ensure_file "$damon_filter_dir/matching" "exist" "600" 371 ensure_file "$damon_filter_dir/allow" "exist" "600" 372} 373 374test_damon_filters() 375{ 376 filters_dir=$1 377 ensure_dir "$filters_dir" "exist" 378 ensure_file "$filters_dir/nr_filters" "exist" "600" 379 ensure_write_succ "$filters_dir/nr_filters" "1" "valid input" 380 test_damon_filter "$filters_dir/0" 381 382 ensure_write_succ "$filters_dir/nr_filters" "2" "valid input" 383 test_damon_filter "$filters_dir/0" 384 test_damon_filter "$filters_dir/1" 385 386 ensure_write_succ "$filters_dir/nr_filters" "0" "valid input" 387 ensure_dir "$filters_dir/0" "not_exist" 388 ensure_dir "$filters_dir/1" "not_exist" 389} 390 391test_probe() 392{ 393 probe_dir=$1 394 ensure_dir "$probe_dir" "exist" 395 test_damon_filters "$probe_dir/filters" 396} 397 398test_probes() 399{ 400 probes_dir=$1 401 ensure_dir "$probes_dir" "exist" 402 ensure_file "$probes_dir/nr_probes" "exist" "600" 403 404 ensure_write_succ "$probes_dir/nr_probes" "1" "valid input" 405 test_probe "$probes_dir/0" 406 407 ensure_write_succ "$probes_dir/nr_probes" "2" "valid input" 408 test_probe "$probes_dir/0" 409 test_probe "$probes_dir/1" 410 411 ensure_write_succ "$probes_dir/nr_probes" "0" "valid input" 412 ensure_dir "$probes_dir/0" "not_exist" 413 ensure_dir "$probes_dir/1" "not_exist" 414} 415 416test_monitoring_attrs() 417{ 418 monitoring_attrs_dir=$1 419 ensure_dir "$monitoring_attrs_dir" "exist" 420 test_intervals "$monitoring_attrs_dir/intervals" 421 test_probes "$monitoring_attrs_dir/probes" 422 test_range "$monitoring_attrs_dir/nr_regions" 423} 424 425test_context() 426{ 427 context_dir=$1 428 ensure_dir "$context_dir" "exist" 429 ensure_file "$context_dir/avail_operations" "exist" 400 430 ensure_file "$context_dir/operations" "exist" 600 431 ensure_file "$context_dir/addr_unit" "exist" 600 432 ensure_file "$context_dir/pause" "exist" 600 433 test_monitoring_attrs "$context_dir/monitoring_attrs" 434 test_targets "$context_dir/targets" 435 test_schemes "$context_dir/schemes" 436} 437 438test_contexts() 439{ 440 contexts_dir=$1 441 ensure_dir "$contexts_dir" "exist" 442 ensure_file "$contexts_dir/nr_contexts" "exist" 600 443 444 ensure_write_succ "$contexts_dir/nr_contexts" "1" "valid input" 445 test_context "$contexts_dir/0" 446 447 ensure_write_fail "$contexts_dir/nr_contexts" "2" "only 0/1 are supported" 448 test_context "$contexts_dir/0" 449 450 ensure_write_succ "$contexts_dir/nr_contexts" "0" "valid input" 451 ensure_dir "$contexts_dir/0" "not_exist" 452} 453 454test_kdamond() 455{ 456 kdamond_dir=$1 457 ensure_dir "$kdamond_dir" "exist" 458 ensure_file "$kdamond_dir/state" "exist" "600" 459 ensure_file "$kdamond_dir/pid" "exist" 400 460 test_contexts "$kdamond_dir/contexts" 461} 462 463test_kdamonds() 464{ 465 kdamonds_dir=$1 466 ensure_dir "$kdamonds_dir" "exist" 467 468 ensure_file "$kdamonds_dir/nr_kdamonds" "exist" "600" 469 470 ensure_write_succ "$kdamonds_dir/nr_kdamonds" "1" "valid input" 471 test_kdamond "$kdamonds_dir/0" 472 473 ensure_write_succ "$kdamonds_dir/nr_kdamonds" "2" "valid input" 474 test_kdamond "$kdamonds_dir/0" 475 test_kdamond "$kdamonds_dir/1" 476 477 ensure_write_succ "$kdamonds_dir/nr_kdamonds" "0" "valid input" 478 ensure_dir "$kdamonds_dir/0" "not_exist" 479 ensure_dir "$kdamonds_dir/1" "not_exist" 480} 481 482test_damon_sysfs() 483{ 484 damon_sysfs=$1 485 if [ ! -d "$damon_sysfs" ] 486 then 487 echo "$damon_sysfs not found" 488 exit $ksft_skip 489 fi 490 491 test_kdamonds "$damon_sysfs/kdamonds" 492} 493 494check_dependencies 495test_damon_sysfs "/sys/kernel/mm/damon/admin" 496