* Called during module initialization and periodically thereafter to * apply reasonable changes to the exposed performance tunings. Can also be * called explicitly by param_set_arc_*() functions when ARC tunables are * updated manually. Non-zero zfs_* values which differ from the currently set * values will be applied. */
| 7348 | * values will be applied. |
| 7349 | */ |
| 7350 | void |
| 7351 | arc_tuning_update(boolean_t verbose) |
| 7352 | { |
| 7353 | uint64_t allmem = arc_all_memory(); |
| 7354 | unsigned long limit; |
| 7355 | |
| 7356 | /* Valid range: 32M - <arc_c_max> */ |
| 7357 | if ((zfs_arc_min) && (zfs_arc_min != arc_c_min) && |
| 7358 | (zfs_arc_min >= 2ULL << SPA_MAXBLOCKSHIFT) && |
| 7359 | (zfs_arc_min <= arc_c_max)) { |
| 7360 | arc_c_min = zfs_arc_min; |
| 7361 | arc_c = MAX(arc_c, arc_c_min); |
| 7362 | } |
| 7363 | WARN_IF_TUNING_IGNORED(zfs_arc_min, arc_c_min, verbose); |
| 7364 | |
| 7365 | /* Valid range: 64M - <all physical memory> */ |
| 7366 | if ((zfs_arc_max) && (zfs_arc_max != arc_c_max) && |
| 7367 | (zfs_arc_max >= 64 << 20) && (zfs_arc_max < allmem) && |
| 7368 | (zfs_arc_max > arc_c_min)) { |
| 7369 | arc_c_max = zfs_arc_max; |
| 7370 | arc_c = MIN(arc_c, arc_c_max); |
| 7371 | arc_p = (arc_c >> 1); |
| 7372 | if (arc_meta_limit > arc_c_max) |
| 7373 | arc_meta_limit = arc_c_max; |
| 7374 | if (arc_dnode_size_limit > arc_meta_limit) |
| 7375 | arc_dnode_size_limit = arc_meta_limit; |
| 7376 | } |
| 7377 | WARN_IF_TUNING_IGNORED(zfs_arc_max, arc_c_max, verbose); |
| 7378 | |
| 7379 | /* Valid range: 16M - <arc_c_max> */ |
| 7380 | if ((zfs_arc_meta_min) && (zfs_arc_meta_min != arc_meta_min) && |
| 7381 | (zfs_arc_meta_min >= 1ULL << SPA_MAXBLOCKSHIFT) && |
| 7382 | (zfs_arc_meta_min <= arc_c_max)) { |
| 7383 | arc_meta_min = zfs_arc_meta_min; |
| 7384 | if (arc_meta_limit < arc_meta_min) |
| 7385 | arc_meta_limit = arc_meta_min; |
| 7386 | if (arc_dnode_size_limit < arc_meta_min) |
| 7387 | arc_dnode_size_limit = arc_meta_min; |
| 7388 | } |
| 7389 | WARN_IF_TUNING_IGNORED(zfs_arc_meta_min, arc_meta_min, verbose); |
| 7390 | |
| 7391 | /* Valid range: <arc_meta_min> - <arc_c_max> */ |
| 7392 | limit = zfs_arc_meta_limit ? zfs_arc_meta_limit : |
| 7393 | MIN(zfs_arc_meta_limit_percent, 100) * arc_c_max / 100; |
| 7394 | if ((limit != arc_meta_limit) && |
| 7395 | (limit >= arc_meta_min) && |
| 7396 | (limit <= arc_c_max)) |
| 7397 | arc_meta_limit = limit; |
| 7398 | WARN_IF_TUNING_IGNORED(zfs_arc_meta_limit, arc_meta_limit, verbose); |
| 7399 | |
| 7400 | /* Valid range: <arc_meta_min> - <arc_meta_limit> */ |
| 7401 | limit = zfs_arc_dnode_limit ? zfs_arc_dnode_limit : |
| 7402 | MIN(zfs_arc_dnode_limit_percent, 100) * arc_meta_limit / 100; |
| 7403 | if ((limit != arc_dnode_size_limit) && |
| 7404 | (limit >= arc_meta_min) && |
| 7405 | (limit <= arc_meta_limit)) |
| 7406 | arc_dnode_size_limit = limit; |
| 7407 | WARN_IF_TUNING_IGNORED(zfs_arc_dnode_limit, arc_dnode_size_limit, |
no test coverage detected