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 285test_intervals() 286{ 287 intervals_dir=$1 288 ensure_dir "$intervals_dir" "exist" 289 ensure_file "$intervals_dir/aggr_us" "exist" "600" 290 ensure_file "$intervals_dir/sample_us" "exist" "600" 291 ensure_file "$intervals_dir/update_us" "exist" "600" 292} 293 294test_monitoring_attrs() 295{ 296 monitoring_attrs_dir=$1 297 ensure_dir "$monitoring_attrs_dir" "exist" 298 test_intervals "$monitoring_attrs_dir/intervals" 299 test_range "$monitoring_attrs_dir/nr_regions" 300} 301 302test_context() 303{ 304 context_dir=$1 305 ensure_dir "$context_dir" "exist" 306 ensure_file "$context_dir/avail_operations" "exit" 400 307 ensure_file "$context_dir/operations" "exist" 600 308 test_monitoring_attrs "$context_dir/monitoring_attrs" 309 test_targets "$context_dir/targets" 310 test_schemes "$context_dir/schemes" 311} 312 313test_contexts() 314{ 315 contexts_dir=$1 316 ensure_dir "$contexts_dir" "exist" 317 ensure_file "$contexts_dir/nr_contexts" "exist" 600 318 319 ensure_write_succ "$contexts_dir/nr_contexts" "1" "valid input" 320 test_context "$contexts_dir/0" 321 322 ensure_write_fail "$contexts_dir/nr_contexts" "2" "only 0/1 are supported" 323 test_context "$contexts_dir/0" 324 325 ensure_write_succ "$contexts_dir/nr_contexts" "0" "valid input" 326 ensure_dir "$contexts_dir/0" "not_exist" 327} 328 329test_kdamond() 330{ 331 kdamond_dir=$1 332 ensure_dir "$kdamond_dir" "exist" 333 ensure_file "$kdamond_dir/state" "exist" "600" 334 ensure_file "$kdamond_dir/pid" "exist" 400 335 test_contexts "$kdamond_dir/contexts" 336} 337 338test_kdamonds() 339{ 340 kdamonds_dir=$1 341 ensure_dir "$kdamonds_dir" "exist" 342 343 ensure_file "$kdamonds_dir/nr_kdamonds" "exist" "600" 344 345 ensure_write_succ "$kdamonds_dir/nr_kdamonds" "1" "valid input" 346 test_kdamond "$kdamonds_dir/0" 347 348 ensure_write_succ "$kdamonds_dir/nr_kdamonds" "2" "valid input" 349 test_kdamond "$kdamonds_dir/0" 350 test_kdamond "$kdamonds_dir/1" 351 352 ensure_write_succ "$kdamonds_dir/nr_kdamonds" "0" "valid input" 353 ensure_dir "$kdamonds_dir/0" "not_exist" 354 ensure_dir "$kdamonds_dir/1" "not_exist" 355} 356 357test_damon_sysfs() 358{ 359 damon_sysfs=$1 360 if [ ! -d "$damon_sysfs" ] 361 then 362 echo "$damon_sysfs not found" 363 exit $ksft_skip 364 fi 365 366 test_kdamonds "$damon_sysfs/kdamonds" 367} 368 369check_dependencies 370test_damon_sysfs "/sys/kernel/mm/damon/admin" 371