mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-25 11:47:43 +03:00
Cleanup: Specify unsignedness on things that should not be signed
In #13871, zfs_vdev_aggregation_limit_non_rotating and zfs_vdev_aggregation_limit being signed was pointed out as a possible reason not to eliminate an unnecessary MAX(unsigned, 0) since the unsigned value was assigned from them. There is no reason for these module parameters to be signed and upon inspection, it was found that there are a number of other module parameters that are signed, but should not be, so we make them unsigned. Making them unsigned made it clear that some other variables in the code should also be unsigned, so we also make those unsigned. This prevents users from setting negative values that could potentially cause bad behaviors. It also makes the code slightly easier to understand. Mostly module parameters that deal with timeouts, limits, bitshifts and percentages are made unsigned by this. Any that are boolean are left signed, since whether booleans should be considered signed or unsigned does not matter. Making zfs_arc_lotsfree_percent unsigned caused a `zfs_arc_lotsfree_percent >= 0` check to become redundant, so it was removed. Removing the check was also necessary to prevent a compiler error from -Werror=type-limits. Several end of line comments had to be moved to their own lines because replacing int with uint_t caused us to exceed the 80 character limit enforced by cstyle.pl. The following were kept signed because they are passed to taskq_create(), which expects signed values and modifying the OpenSolaris/Illumos DDI is out of scope of this patch: * metaslab_load_pct * zfs_sync_taskq_batch_pct * zfs_zil_clean_taskq_nthr_pct * zfs_zil_clean_taskq_minalloc * zfs_zil_clean_taskq_maxalloc * zfs_arc_prune_task_threads Also, negative values in those parameters was found to be harmless. The following were left signed because either negative values make sense, or more analysis was needed to determine whether negative values should be disallowed: * zfs_metaslab_switch_threshold * zfs_pd_bytes_max * zfs_livelist_min_percent_shared zfs_multihost_history was made static to be consistent with other parameters. A number of module parameters were marked as signed, but in reality referenced unsigned variables. upgrade_errlog_limit is one of the numerous examples. In the case of zfs_vdev_async_read_max_active, it was already uint32_t, but zdb had an extern int declaration for it. Interestingly, the documentation in zfs.4 was right for upgrade_errlog_limit despite the module parameter being wrongly marked, while the documentation for zfs_vdev_async_read_max_active (and friends) was wrong. It was also wrong for zstd_abort_size, which was unsigned, but was documented as signed. Also, the documentation in zfs.4 incorrectly described the following parameters as ulong when they were int: * zfs_arc_meta_adjust_restarts * zfs_override_estimate_recordsize They are now uint_t as of this patch and thus the man page has been updated to describe them as uint. dbuf_state_index was left alone since it does nothing and perhaps should be removed in another patch. If any module parameters were missed, they were not found by `grep -r 'ZFS_MODULE_PARAM' | grep ', INT'`. I did find a few that grep missed, but only because they were in files that had hits. This patch intentionally did not attempt to address whether some of these module parameters should be elevated to 64-bit parameters, because the length of a long on 32-bit is 32-bit. Lastly, it was pointed out during review that uint_t is a better match for these variables than uint32_t because FreeBSD kernel parameter definitions are designed for uint_t, whose bit width can change in future memory models. As a result, we change the existing parameters that are uint32_t to use uint_t. Reviewed-by: Alexander Motin <mav@FreeBSD.org> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Neal Gompa <ngompa@datto.com> Signed-off-by: Richard Yao <richard.yao@alumni.stonybrook.edu> Closes #13875
This commit is contained in:
+40
-24
@@ -128,7 +128,7 @@ static void scan_ds_queue_remove(dsl_scan_t *scn, uint64_t dsobj);
|
||||
static void scan_ds_queue_sync(dsl_scan_t *scn, dmu_tx_t *tx);
|
||||
static uint64_t dsl_scan_count_data_disks(vdev_t *vd);
|
||||
|
||||
extern int zfs_vdev_async_write_active_min_dirty_percent;
|
||||
extern uint_t zfs_vdev_async_write_active_min_dirty_percent;
|
||||
static int zfs_scan_blkstats = 0;
|
||||
|
||||
/*
|
||||
@@ -149,8 +149,10 @@ static int zfs_scan_strict_mem_lim = B_FALSE;
|
||||
*/
|
||||
static unsigned long zfs_scan_vdev_limit = 4 << 20;
|
||||
|
||||
static int zfs_scan_issue_strategy = 0;
|
||||
static int zfs_scan_legacy = B_FALSE; /* don't queue & sort zios, go direct */
|
||||
static uint_t zfs_scan_issue_strategy = 0;
|
||||
|
||||
/* don't queue & sort zios, go direct */
|
||||
static int zfs_scan_legacy = B_FALSE;
|
||||
static unsigned long zfs_scan_max_ext_gap = 2 << 20; /* in bytes */
|
||||
|
||||
/*
|
||||
@@ -158,20 +160,33 @@ static unsigned long zfs_scan_max_ext_gap = 2 << 20; /* in bytes */
|
||||
* zfs_scan_fill_weight. Runtime adjustments to zfs_scan_fill_weight would
|
||||
* break queue sorting.
|
||||
*/
|
||||
static int zfs_scan_fill_weight = 3;
|
||||
static uint_t zfs_scan_fill_weight = 3;
|
||||
static uint64_t fill_weight;
|
||||
|
||||
/* See dsl_scan_should_clear() for details on the memory limit tunables */
|
||||
static const uint64_t zfs_scan_mem_lim_min = 16 << 20; /* bytes */
|
||||
static const uint64_t zfs_scan_mem_lim_soft_max = 128 << 20; /* bytes */
|
||||
static int zfs_scan_mem_lim_fact = 20; /* fraction of physmem */
|
||||
static int zfs_scan_mem_lim_soft_fact = 20; /* fraction of mem lim above */
|
||||
|
||||
static int zfs_scrub_min_time_ms = 1000; /* min millis to scrub per txg */
|
||||
static int zfs_obsolete_min_time_ms = 500; /* min millis to obsolete per txg */
|
||||
static int zfs_free_min_time_ms = 1000; /* min millis to free per txg */
|
||||
static int zfs_resilver_min_time_ms = 3000; /* min millis to resilver per txg */
|
||||
static int zfs_scan_checkpoint_intval = 7200; /* in seconds */
|
||||
|
||||
/* fraction of physmem */
|
||||
static uint_t zfs_scan_mem_lim_fact = 20;
|
||||
|
||||
/* fraction of mem lim above */
|
||||
static uint_t zfs_scan_mem_lim_soft_fact = 20;
|
||||
|
||||
/* minimum milliseconds to scrub per txg */
|
||||
static uint_t zfs_scrub_min_time_ms = 1000;
|
||||
|
||||
/* minimum milliseconds to obsolete per txg */
|
||||
static uint_t zfs_obsolete_min_time_ms = 500;
|
||||
|
||||
/* minimum milliseconds to free per txg */
|
||||
static uint_t zfs_free_min_time_ms = 1000;
|
||||
|
||||
/* minimum milliseconds to resilver per txg */
|
||||
static uint_t zfs_resilver_min_time_ms = 3000;
|
||||
|
||||
static uint_t zfs_scan_checkpoint_intval = 7200; /* in seconds */
|
||||
int zfs_scan_suspend_progress = 0; /* set to prevent scans from progressing */
|
||||
static int zfs_no_scrub_io = B_FALSE; /* set to disable scrub i/o */
|
||||
static int zfs_no_scrub_prefetch = B_FALSE; /* set to disable scrub prefetch */
|
||||
@@ -1350,7 +1365,7 @@ dsl_scan_check_suspend(dsl_scan_t *scn, const zbookmark_phys_t *zb)
|
||||
scn->scn_dp->dp_spa->spa_sync_starttime;
|
||||
uint64_t dirty_min_bytes = zfs_dirty_data_max *
|
||||
zfs_vdev_async_write_active_min_dirty_percent / 100;
|
||||
int mintime = (scn->scn_phys.scn_func == POOL_SCAN_RESILVER) ?
|
||||
uint_t mintime = (scn->scn_phys.scn_func == POOL_SCAN_RESILVER) ?
|
||||
zfs_resilver_min_time_ms : zfs_scrub_min_time_ms;
|
||||
|
||||
if ((NSEC2MSEC(scan_time_ns) > mintime &&
|
||||
@@ -2840,7 +2855,7 @@ scan_io_queue_check_suspend(dsl_scan_t *scn)
|
||||
scn->scn_dp->dp_spa->spa_sync_starttime;
|
||||
uint64_t dirty_min_bytes = zfs_dirty_data_max *
|
||||
zfs_vdev_async_write_active_min_dirty_percent / 100;
|
||||
int mintime = (scn->scn_phys.scn_func == POOL_SCAN_RESILVER) ?
|
||||
uint_t mintime = (scn->scn_phys.scn_func == POOL_SCAN_RESILVER) ?
|
||||
zfs_resilver_min_time_ms : zfs_scrub_min_time_ms;
|
||||
|
||||
return ((NSEC2MSEC(scan_time_ns) > mintime &&
|
||||
@@ -3622,8 +3637,9 @@ dsl_scan_sync(dsl_pool_t *dp, dmu_tx_t *tx)
|
||||
*/
|
||||
if (zfs_scan_suspend_progress) {
|
||||
uint64_t scan_time_ns = gethrtime() - scn->scn_sync_start_time;
|
||||
int mintime = (scn->scn_phys.scn_func == POOL_SCAN_RESILVER) ?
|
||||
zfs_resilver_min_time_ms : zfs_scrub_min_time_ms;
|
||||
uint_t mintime = (scn->scn_phys.scn_func ==
|
||||
POOL_SCAN_RESILVER) ? zfs_resilver_min_time_ms :
|
||||
zfs_scrub_min_time_ms;
|
||||
|
||||
while (zfs_scan_suspend_progress &&
|
||||
!txg_sync_waiting(scn->scn_dp) &&
|
||||
@@ -4433,16 +4449,16 @@ dsl_scan_assess_vdev(dsl_pool_t *dp, vdev_t *vd)
|
||||
ZFS_MODULE_PARAM(zfs, zfs_, scan_vdev_limit, ULONG, ZMOD_RW,
|
||||
"Max bytes in flight per leaf vdev for scrubs and resilvers");
|
||||
|
||||
ZFS_MODULE_PARAM(zfs, zfs_, scrub_min_time_ms, INT, ZMOD_RW,
|
||||
ZFS_MODULE_PARAM(zfs, zfs_, scrub_min_time_ms, UINT, ZMOD_RW,
|
||||
"Min millisecs to scrub per txg");
|
||||
|
||||
ZFS_MODULE_PARAM(zfs, zfs_, obsolete_min_time_ms, INT, ZMOD_RW,
|
||||
ZFS_MODULE_PARAM(zfs, zfs_, obsolete_min_time_ms, UINT, ZMOD_RW,
|
||||
"Min millisecs to obsolete per txg");
|
||||
|
||||
ZFS_MODULE_PARAM(zfs, zfs_, free_min_time_ms, INT, ZMOD_RW,
|
||||
ZFS_MODULE_PARAM(zfs, zfs_, free_min_time_ms, UINT, ZMOD_RW,
|
||||
"Min millisecs to free per txg");
|
||||
|
||||
ZFS_MODULE_PARAM(zfs, zfs_, resilver_min_time_ms, INT, ZMOD_RW,
|
||||
ZFS_MODULE_PARAM(zfs, zfs_, resilver_min_time_ms, UINT, ZMOD_RW,
|
||||
"Min millisecs to resilver per txg");
|
||||
|
||||
ZFS_MODULE_PARAM(zfs, zfs_, scan_suspend_progress, INT, ZMOD_RW,
|
||||
@@ -4466,28 +4482,28 @@ ZFS_MODULE_PARAM(zfs, zfs_, free_bpobj_enabled, INT, ZMOD_RW,
|
||||
ZFS_MODULE_PARAM(zfs, zfs_, scan_blkstats, INT, ZMOD_RW,
|
||||
"Enable block statistics calculation during scrub");
|
||||
|
||||
ZFS_MODULE_PARAM(zfs, zfs_, scan_mem_lim_fact, INT, ZMOD_RW,
|
||||
ZFS_MODULE_PARAM(zfs, zfs_, scan_mem_lim_fact, UINT, ZMOD_RW,
|
||||
"Fraction of RAM for scan hard limit");
|
||||
|
||||
ZFS_MODULE_PARAM(zfs, zfs_, scan_issue_strategy, INT, ZMOD_RW,
|
||||
ZFS_MODULE_PARAM(zfs, zfs_, scan_issue_strategy, UINT, ZMOD_RW,
|
||||
"IO issuing strategy during scrubbing. 0 = default, 1 = LBA, 2 = size");
|
||||
|
||||
ZFS_MODULE_PARAM(zfs, zfs_, scan_legacy, INT, ZMOD_RW,
|
||||
"Scrub using legacy non-sequential method");
|
||||
|
||||
ZFS_MODULE_PARAM(zfs, zfs_, scan_checkpoint_intval, INT, ZMOD_RW,
|
||||
ZFS_MODULE_PARAM(zfs, zfs_, scan_checkpoint_intval, UINT, ZMOD_RW,
|
||||
"Scan progress on-disk checkpointing interval");
|
||||
|
||||
ZFS_MODULE_PARAM(zfs, zfs_, scan_max_ext_gap, ULONG, ZMOD_RW,
|
||||
"Max gap in bytes between sequential scrub / resilver I/Os");
|
||||
|
||||
ZFS_MODULE_PARAM(zfs, zfs_, scan_mem_lim_soft_fact, INT, ZMOD_RW,
|
||||
ZFS_MODULE_PARAM(zfs, zfs_, scan_mem_lim_soft_fact, UINT, ZMOD_RW,
|
||||
"Fraction of hard limit used as soft limit");
|
||||
|
||||
ZFS_MODULE_PARAM(zfs, zfs_, scan_strict_mem_lim, INT, ZMOD_RW,
|
||||
"Tunable to attempt to reduce lock contention");
|
||||
|
||||
ZFS_MODULE_PARAM(zfs, zfs_, scan_fill_weight, INT, ZMOD_RW,
|
||||
ZFS_MODULE_PARAM(zfs, zfs_, scan_fill_weight, UINT, ZMOD_RW,
|
||||
"Tunable to adjust bias towards more filled segments during scans");
|
||||
|
||||
ZFS_MODULE_PARAM(zfs, zfs_, resilver_disable_defer, INT, ZMOD_RW,
|
||||
|
||||
Reference in New Issue
Block a user