Message ID | 20201204024235.273924-2-shinichiro.kawasaki@wdc.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Support max_open_zones and max_active_zones | expand |
On 12/3/20 18:42, Shin'ichiro Kawasaki wrote: > Linux kernel 5.9 introduced new sysfs attributes max_active_zones and > max_open_zones for zoned block devices. Max_open_zones is the limit of > number of zones in open status. Max_active_zones is the limit of number > of zones in open or closed status. Currently, the helper function > _test_dev_max_active_zones() checks only max_active_zones, but it is not > enough. When the device has max_open_zones, check for max_active_zones > can not avoid the errors for write operations. > > To avoid the error, improve the function _test_dev_max_active_zones() to > check the limits both. Rename it to _test_dev_max_open_active_zones(). > When one of the limits is available for the test target device, return > it. If both limits are available, return smaller limit. > > Also modify block/004 and zbd/003 to call the renamed helper function > and update comment description. > > Fixes: e6981bb2d9ce ("common/rc: Add _test_dev_max_active_zones() helper function") > Signed-off-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com> > Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> > --- > common/rc | 19 ++++++++++++++++--- > tests/block/004 | 2 +- > tests/zbd/003 | 6 +++--- > 3 files changed, 20 insertions(+), 7 deletions(-) > > diff --git a/common/rc b/common/rc > index d396fb5..a837542 100644 > --- a/common/rc > +++ b/common/rc > @@ -280,11 +280,24 @@ _test_dev_is_partition() { > [[ -n ${TEST_DEV_PART_SYSFS} ]] > } > > -_test_dev_max_active_zones() { > +# Return max open zones or max active zones of the test target device. > +# If the device has both, return smaller value. > +_test_dev_max_open_active_zones() { > + local -i moz=0 > + local -i maz=0 > + > + if [[ -r "${TEST_DEV_SYSFS}/queue/max_open_zones" ]]; then > + moz=$(_test_dev_queue_get max_open_zones) > + fi > + > if [[ -r "${TEST_DEV_SYSFS}/queue/max_active_zones" ]]; then > - _test_dev_queue_get max_active_zones > + maz=$(_test_dev_queue_get max_active_zones) > + fi > + > + if ((!moz)) || ((maz && maz < moz)); then > + echo "${maz}" > else > - echo 0 > + echo "${moz}" > fi > } > > diff --git a/tests/block/004 b/tests/block/004 > index 6eff6ce..a7cec95 100755 > --- a/tests/block/004 > +++ b/tests/block/004 > @@ -26,7 +26,7 @@ test_device() { > if _test_dev_is_zoned; then > _test_dev_queue_set scheduler deadline > opts+=("--direct=1" "--zonemode=zbd") > - opts+=("--max_open_zones=$(_test_dev_max_active_zones)") > + opts+=("--max_open_zones=$(_test_dev_max_open_active_zones)") > fi > > FIO_PERF_FIELDS=("write iops") > diff --git a/tests/zbd/003 b/tests/zbd/003 > index 1e92e81..7f4fa2c 100755 > --- a/tests/zbd/003 > +++ b/tests/zbd/003 > @@ -30,10 +30,10 @@ test_device() { > > echo "Running ${TEST_NAME}" > > - # When the test device has max_active_zone limit, reset all zones. This > - # ensures the write operations in this test case do not open zones > + # When the test device has max_open/active_zones limit, reset all zones. > + # This ensures the write operations in this test case do not open zones > # beyond the limit. > - (($(_test_dev_max_active_zones))) && blkzone reset "${TEST_DEV}" > + (($(_test_dev_max_open_active_zones))) && blkzone reset "${TEST_DEV}" > > # Get physical block size as dd block size to meet zoned block device > # requirement Looks good. Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
diff --git a/common/rc b/common/rc index d396fb5..a837542 100644 --- a/common/rc +++ b/common/rc @@ -280,11 +280,24 @@ _test_dev_is_partition() { [[ -n ${TEST_DEV_PART_SYSFS} ]] } -_test_dev_max_active_zones() { +# Return max open zones or max active zones of the test target device. +# If the device has both, return smaller value. +_test_dev_max_open_active_zones() { + local -i moz=0 + local -i maz=0 + + if [[ -r "${TEST_DEV_SYSFS}/queue/max_open_zones" ]]; then + moz=$(_test_dev_queue_get max_open_zones) + fi + if [[ -r "${TEST_DEV_SYSFS}/queue/max_active_zones" ]]; then - _test_dev_queue_get max_active_zones + maz=$(_test_dev_queue_get max_active_zones) + fi + + if ((!moz)) || ((maz && maz < moz)); then + echo "${maz}" else - echo 0 + echo "${moz}" fi } diff --git a/tests/block/004 b/tests/block/004 index 6eff6ce..a7cec95 100755 --- a/tests/block/004 +++ b/tests/block/004 @@ -26,7 +26,7 @@ test_device() { if _test_dev_is_zoned; then _test_dev_queue_set scheduler deadline opts+=("--direct=1" "--zonemode=zbd") - opts+=("--max_open_zones=$(_test_dev_max_active_zones)") + opts+=("--max_open_zones=$(_test_dev_max_open_active_zones)") fi FIO_PERF_FIELDS=("write iops") diff --git a/tests/zbd/003 b/tests/zbd/003 index 1e92e81..7f4fa2c 100755 --- a/tests/zbd/003 +++ b/tests/zbd/003 @@ -30,10 +30,10 @@ test_device() { echo "Running ${TEST_NAME}" - # When the test device has max_active_zone limit, reset all zones. This - # ensures the write operations in this test case do not open zones + # When the test device has max_open/active_zones limit, reset all zones. + # This ensures the write operations in this test case do not open zones # beyond the limit. - (($(_test_dev_max_active_zones))) && blkzone reset "${TEST_DEV}" + (($(_test_dev_max_open_active_zones))) && blkzone reset "${TEST_DEV}" # Get physical block size as dd block size to meet zoned block device # requirement