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 "$dir" ] 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_filter() 103{ 104 filter_dir=$1 105 ensure_file "$filter_dir/type" "exist" "600" 106 107 local dir_name=$(basename "$(dirname "$filter_dir")") 108 if [ "$dir_name" = "filters" ] || [ "$dir_name" = "ops_filters" ] 109 then 110 ensure_write_succ "$filter_dir/type" "anon" "valid input" 111 ensure_write_succ "$filter_dir/type" "memcg" "valid input" 112 fi 113 if [ "$dir_name" = "filters" ] || [ "$dir_name" = "core_filters" ] 114 then 115 ensure_write_succ "$filter_dir/type" "addr" "valid input" 116 ensure_write_succ "$filter_dir/type" "target" "valid input" 117 fi 118 if [ "$dir_name" = "core_filters" ] 119 then 120 ensure_write_fail "$filter_dir/type" "anon" "ops type" 121 ensure_write_fail "$filter_dir/type" "memcg" "ops type" 122 fi 123 if [ "$dir_name" = "ops_filters" ] 124 then 125 ensure_write_fail "$filter_dir/type" "addr" "core type" 126 ensure_write_fail "$filter_dir/type" "target" "core type" 127 fi 128 ensure_write_fail "$filter_dir/type" "foo" "invalid input" 129 ensure_file "$filter_dir/matching" "exist" "600" 130 ensure_file "$filter_dir/memcg_path" "exist" "600" 131 ensure_file "$filter_dir/addr_start" "exist" "600" 132 ensure_file "$filter_dir/addr_end" "exist" "600" 133 ensure_file "$filter_dir/damon_target_idx" "exist" "600" 134} 135 136test_filters() 137{ 138 filters_dir=$1 139 ensure_dir "$filters_dir" "exist" 140 ensure_file "$filters_dir/nr_filters" "exist" "600" 141 ensure_write_succ "$filters_dir/nr_filters" "1" "valid input" 142 test_filter "$filters_dir/0" 143 144 ensure_write_succ "$filters_dir/nr_filters" "2" "valid input" 145 test_filter "$filters_dir/0" 146 test_filter "$filters_dir/1" 147 148 ensure_write_succ "$filters_dir/nr_filters" "0" "valid input" 149 ensure_dir "$filters_dir/0" "not_exist" 150 ensure_dir "$filters_dir/1" "not_exist" 151} 152 153test_watermarks() 154{ 155 watermarks_dir=$1 156 ensure_dir "$watermarks_dir" "exist" 157 ensure_file "$watermarks_dir/metric" "exist" "600" 158 ensure_file "$watermarks_dir/interval_us" "exist" "600" 159 ensure_file "$watermarks_dir/high" "exist" "600" 160 ensure_file "$watermarks_dir/mid" "exist" "600" 161 ensure_file "$watermarks_dir/low" "exist" "600" 162} 163 164test_weights() 165{ 166 weights_dir=$1 167 ensure_dir "$weights_dir" "exist" 168 ensure_file "$weights_dir/sz_permil" "exist" "600" 169 ensure_file "$weights_dir/nr_accesses_permil" "exist" "600" 170 ensure_file "$weights_dir/age_permil" "exist" "600" 171} 172 173test_goal() 174{ 175 goal_dir=$1 176 ensure_dir "$goal_dir" "exist" 177 ensure_file "$goal_dir/target_value" "exist" "600" 178 ensure_file "$goal_dir/current_value" "exist" "600" 179} 180 181test_goals() 182{ 183 goals_dir=$1 184 ensure_dir "$goals_dir" "exist" 185 ensure_file "$goals_dir/nr_goals" "exist" "600" 186 187 ensure_write_succ "$goals_dir/nr_goals" "1" "valid input" 188 test_goal "$goals_dir/0" 189 190 ensure_write_succ "$goals_dir/nr_goals" "2" "valid input" 191 test_goal "$goals_dir/0" 192 test_goal "$goals_dir/1" 193 194 ensure_write_succ "$goals_dir/nr_goals" "0" "valid input" 195 ensure_dir "$goals_dir/0" "not_exist" 196 ensure_dir "$goals_dir/1" "not_exist" 197} 198 199test_quotas() 200{ 201 quotas_dir=$1 202 ensure_dir "$quotas_dir" "exist" 203 ensure_file "$quotas_dir/ms" "exist" 600 204 ensure_file "$quotas_dir/bytes" "exist" 600 205 ensure_file "$quotas_dir/reset_interval_ms" "exist" 600 206 test_weights "$quotas_dir/weights" 207 test_goals "$quotas_dir/goals" 208} 209 210test_access_pattern() 211{ 212 access_pattern_dir=$1 213 ensure_dir "$access_pattern_dir" "exist" 214 test_range "$access_pattern_dir/age" 215 test_range "$access_pattern_dir/nr_accesses" 216 test_range "$access_pattern_dir/sz" 217} 218 219test_scheme() 220{ 221 scheme_dir=$1 222 ensure_dir "$scheme_dir" "exist" 223 ensure_file "$scheme_dir/action" "exist" "600" 224 test_access_pattern "$scheme_dir/access_pattern" 225 ensure_file "$scheme_dir/apply_interval_us" "exist" "600" 226 test_quotas "$scheme_dir/quotas" 227 test_watermarks "$scheme_dir/watermarks" 228 test_filters "$scheme_dir/filters" 229 test_filters "$scheme_dir/core_filters" 230 test_filters "$scheme_dir/ops_filters" 231 test_stats "$scheme_dir/stats" 232 test_tried_regions "$scheme_dir/tried_regions" 233} 234 235test_schemes() 236{ 237 schemes_dir=$1 238 ensure_dir "$schemes_dir" "exist" 239 ensure_file "$schemes_dir/nr_schemes" "exist" 600 240 241 ensure_write_succ "$schemes_dir/nr_schemes" "1" "valid input" 242 test_scheme "$schemes_dir/0" 243 244 ensure_write_succ "$schemes_dir/nr_schemes" "2" "valid input" 245 test_scheme "$schemes_dir/0" 246 test_scheme "$schemes_dir/1" 247 248 ensure_write_succ "$schemes_dir/nr_schemes" "0" "valid input" 249 ensure_dir "$schemes_dir/0" "not_exist" 250 ensure_dir "$schemes_dir/1" "not_exist" 251} 252 253test_region() 254{ 255 region_dir=$1 256 ensure_dir "$region_dir" "exist" 257 ensure_file "$region_dir/start" "exist" 600 258 ensure_file "$region_dir/end" "exist" 600 259} 260 261test_regions() 262{ 263 regions_dir=$1 264 ensure_dir "$regions_dir" "exist" 265 ensure_file "$regions_dir/nr_regions" "exist" 600 266 267 ensure_write_succ "$regions_dir/nr_regions" "1" "valid input" 268 test_region "$regions_dir/0" 269 270 ensure_write_succ "$regions_dir/nr_regions" "2" "valid input" 271 test_region "$regions_dir/0" 272 test_region "$regions_dir/1" 273 274 ensure_write_succ "$regions_dir/nr_regions" "0" "valid input" 275 ensure_dir "$regions_dir/0" "not_exist" 276 ensure_dir "$regions_dir/1" "not_exist" 277} 278 279test_target() 280{ 281 target_dir=$1 282 ensure_dir "$target_dir" "exist" 283 ensure_file "$target_dir/pid_target" "exist" "600" 284 test_regions "$target_dir/regions" 285} 286 287test_targets() 288{ 289 targets_dir=$1 290 ensure_dir "$targets_dir" "exist" 291 ensure_file "$targets_dir/nr_targets" "exist" 600 292 293 ensure_write_succ "$targets_dir/nr_targets" "1" "valid input" 294 test_target "$targets_dir/0" 295 296 ensure_write_succ "$targets_dir/nr_targets" "2" "valid input" 297 test_target "$targets_dir/0" 298 test_target "$targets_dir/1" 299 300 ensure_write_succ "$targets_dir/nr_targets" "0" "valid input" 301 ensure_dir "$targets_dir/0" "not_exist" 302 ensure_dir "$targets_dir/1" "not_exist" 303} 304 305 306test_intervals_goal() 307{ 308 goal_dir=$1 309 ensure_dir "$goal_dir" "exist" 310 ensure_file "$goal_dir/access_bp" "exist" "600" 311 ensure_file "$goal_dir/aggrs" "exist" "600" 312 ensure_file "$goal_dir/min_sample_us" "exist" "600" 313 ensure_file "$goal_dir/max_sample_us" "exist" "600" 314} 315 316test_intervals() 317{ 318 intervals_dir=$1 319 ensure_dir "$intervals_dir" "exist" 320 ensure_file "$intervals_dir/aggr_us" "exist" "600" 321 ensure_file "$intervals_dir/sample_us" "exist" "600" 322 ensure_file "$intervals_dir/update_us" "exist" "600" 323 test_intervals_goal "$intervals_dir/intervals_goal" 324} 325 326test_damon_filter() 327{ 328 damon_filter_dir=$1 329 ensure_file "$damon_filter_dir/type" "exist" "600" 330 ensure_write_succ "$damon_filter_dir/type" "anon" "valid input" 331 ensure_write_fail "$damon_filter_dir/type" "foo" "invalid input" 332 ensure_file "$damon_filter_dir/matching" "exist" "600" 333 ensure_file "$damon_filter_dir/allow" "exist" "600" 334} 335 336test_damon_filters() 337{ 338 filters_dir=$1 339 ensure_dir "$filters_dir" "exist" 340 ensure_file "$filters_dir/nr_filters" "exist" "600" 341 ensure_write_succ "$filters_dir/nr_filters" "1" "valid input" 342 test_damon_filter "$filters_dir/0" 343 344 ensure_write_succ "$filters_dir/nr_filters" "2" "valid input" 345 test_damon_filter "$filters_dir/0" 346 test_damon_filter "$filters_dir/1" 347 348 ensure_write_succ "$filters_dir/nr_filters" "0" "valid input" 349 ensure_dir "$filters_dir/0" "not_exist" 350 ensure_dir "$filters_dir/1" "not_exist" 351} 352 353test_probe() 354{ 355 probe_dir=$1 356 ensure_dir "$probe_dir" "exist" 357 test_damon_filters "$probe_dir/filters" 358} 359 360test_probes() 361{ 362 probes_dir=$1 363 ensure_dir "$probes_dir" "exist" 364 ensure_file "$probes_dir/nr_probes" "exist" "600" 365 366 ensure_write_succ "$probes_dir/nr_probes" "1" "valid input" 367 test_probe "$probes_dir/0" 368 369 ensure_write_succ "$probes_dir/nr_probes" "2" "valid input" 370 test_probe "$probes_dir/0" 371 test_probe "$probes_dir/1" 372 373 ensure_write_succ "$probes_dir/nr_probes" "0" "valid input" 374 ensure_dir "$probes_dir/0" "not_exist" 375 ensure_dir "$probes_dir/1" "not_exist" 376} 377 378test_monitoring_attrs() 379{ 380 monitoring_attrs_dir=$1 381 ensure_dir "$monitoring_attrs_dir" "exist" 382 test_intervals "$monitoring_attrs_dir/intervals" 383 test_probes "$monitoring_attrs_dir/probes" 384 test_range "$monitoring_attrs_dir/nr_regions" 385} 386 387test_context() 388{ 389 context_dir=$1 390 ensure_dir "$context_dir" "exist" 391 ensure_file "$context_dir/avail_operations" "exist" 400 392 ensure_file "$context_dir/operations" "exist" 600 393 ensure_file "$context_dir/addr_unit" "exist" 600 394 ensure_file "$context_dir/pause" "exist" 600 395 test_monitoring_attrs "$context_dir/monitoring_attrs" 396 test_targets "$context_dir/targets" 397 test_schemes "$context_dir/schemes" 398} 399 400test_contexts() 401{ 402 contexts_dir=$1 403 ensure_dir "$contexts_dir" "exist" 404 ensure_file "$contexts_dir/nr_contexts" "exist" 600 405 406 ensure_write_succ "$contexts_dir/nr_contexts" "1" "valid input" 407 test_context "$contexts_dir/0" 408 409 ensure_write_fail "$contexts_dir/nr_contexts" "2" "only 0/1 are supported" 410 test_context "$contexts_dir/0" 411 412 ensure_write_succ "$contexts_dir/nr_contexts" "0" "valid input" 413 ensure_dir "$contexts_dir/0" "not_exist" 414} 415 416test_kdamond() 417{ 418 kdamond_dir=$1 419 ensure_dir "$kdamond_dir" "exist" 420 ensure_file "$kdamond_dir/state" "exist" "600" 421 ensure_file "$kdamond_dir/pid" "exist" 400 422 test_contexts "$kdamond_dir/contexts" 423} 424 425test_kdamonds() 426{ 427 kdamonds_dir=$1 428 ensure_dir "$kdamonds_dir" "exist" 429 430 ensure_file "$kdamonds_dir/nr_kdamonds" "exist" "600" 431 432 ensure_write_succ "$kdamonds_dir/nr_kdamonds" "1" "valid input" 433 test_kdamond "$kdamonds_dir/0" 434 435 ensure_write_succ "$kdamonds_dir/nr_kdamonds" "2" "valid input" 436 test_kdamond "$kdamonds_dir/0" 437 test_kdamond "$kdamonds_dir/1" 438 439 ensure_write_succ "$kdamonds_dir/nr_kdamonds" "0" "valid input" 440 ensure_dir "$kdamonds_dir/0" "not_exist" 441 ensure_dir "$kdamonds_dir/1" "not_exist" 442} 443 444test_damon_sysfs() 445{ 446 damon_sysfs=$1 447 if [ ! -d "$damon_sysfs" ] 448 then 449 echo "$damon_sysfs not found" 450 exit $ksft_skip 451 fi 452 453 test_kdamonds "$damon_sysfs/kdamonds" 454} 455 456check_dependencies 457test_damon_sysfs "/sys/kernel/mm/damon/admin" 458