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