diff mbox series

[blktests,1/2] common/rc: Check both max_active_zones and max_open_zones

Message ID 20201203082244.268632-2-shinichiro.kawasaki@wdc.com (mailing list archive)
State New, archived
Headers show
Series Support max_open_zones and max_active_zones | expand

Commit Message

Shinichiro Kawasaki Dec. 3, 2020, 8:22 a.m. UTC
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>
---
 common/rc       | 21 +++++++++++++++++----
 tests/block/004 |  2 +-
 tests/zbd/003   |  6 +++---
 3 files changed, 21 insertions(+), 8 deletions(-)

Comments

Johannes Thumshirn Dec. 3, 2020, 9:50 a.m. UTC | #1
On 03/12/2020 09:22, Shin'ichiro Kawasaki wrote:
> -_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 ret=0
> +	local -i maz=0
> +
> +	if [[ -r "${TEST_DEV_SYSFS}/queue/max_open_zones" ]]; then
> +		ret=$(_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
> -	else
> -		echo 0
> +		maz=$(_test_dev_queue_get max_active_zones)
>  	fi
> +
> +	if ((!ret)) || ((maz && maz < ret)); then
> +		ret="${maz}"
> +	fi
> +
> +	echo "${ret}"
>  }

Maybe change $ret to $moz and then

if ((!moz)) || ((maz && maz < moz)); then
	echo ${maz}
else
	echo ${moz}
fi

Otherwise looks good,
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Shinichiro Kawasaki Dec. 4, 2020, 1:45 a.m. UTC | #2
On Dec 03, 2020 / 09:50, Johannes Thumshirn wrote:
> On 03/12/2020 09:22, Shin'ichiro Kawasaki wrote:
> > -_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 ret=0
> > +	local -i maz=0
> > +
> > +	if [[ -r "${TEST_DEV_SYSFS}/queue/max_open_zones" ]]; then
> > +		ret=$(_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
> > -	else
> > -		echo 0
> > +		maz=$(_test_dev_queue_get max_active_zones)
> >  	fi
> > +
> > +	if ((!ret)) || ((maz && maz < ret)); then
> > +		ret="${maz}"
> > +	fi
> > +
> > +	echo "${ret}"
> >  }
> 
> Maybe change $ret to $moz and then
> 
> if ((!moz)) || ((maz && maz < moz)); then
> 	echo ${maz}
> else
> 	echo ${moz}
> fi

Thanks. I agree that your code is easier to understand.
Will reflect this comment and send out v2.

> 
> Otherwise looks good,
> Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
>
diff mbox series

Patch

diff --git a/common/rc b/common/rc
index d396fb5..a14f093 100644
--- a/common/rc
+++ b/common/rc
@@ -280,12 +280,25 @@  _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 ret=0
+	local -i maz=0
+
+	if [[ -r "${TEST_DEV_SYSFS}/queue/max_open_zones" ]]; then
+		ret=$(_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
-	else
-		echo 0
+		maz=$(_test_dev_queue_get max_active_zones)
 	fi
+
+	if ((!ret)) || ((maz && maz < ret)); then
+		ret="${maz}"
+	fi
+
+	echo "${ret}"
 }
 
 _require_test_dev_is_partition() {
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