diff mbox series

[V2] ublk: zoned: support REQ_OP_ZONE_RESET_ALL

Message ID 20230810124326.321472-1-ming.lei@redhat.com (mailing list archive)
State New, archived
Headers show
Series [V2] ublk: zoned: support REQ_OP_ZONE_RESET_ALL | expand

Commit Message

Ming Lei Aug. 10, 2023, 12:43 p.m. UTC
There isn't any reason to not support REQ_OP_ZONE_RESET_ALL given everything
is actually handled in userspace, not mention it is pretty easy to support
RESET_ALL.

So enable REQ_OP_ZONE_RESET_ALL and let userspace handle it.

Verified by 'tools/zbc_reset_zone -all /dev/ublkb0' in libzbc[1] with
libublk-rs based ublk-zoned target prototype[2], follows command line
for creating ublk-zoned:

	cargo run --example zoned -- add -1 1024	# add $dev_id $DEV_SIZE

[1] https://github.com/westerndigitalcorporation/libzbc
[2] https://github.com/ming1/libublk-rs/tree/zoned.v2

Cc: Niklas Cassel <Niklas.Cassel@wdc.com>
Cc: Damien Le Moal <dlemoal@kernel.org>
Cc: Andreas Hindborg <a.hindborg@samsung.com>
Signed-off-by: Ming Lei <ming.lei@redhat.com>
---
V2:
	- update comment as reported by Niklas

 drivers/block/ublk_drv.c      | 7 +++++--
 include/uapi/linux/ublk_cmd.h | 1 +
 2 files changed, 6 insertions(+), 2 deletions(-)

Comments

Niklas Cassel Aug. 10, 2023, 1:10 p.m. UTC | #1
On Thu, Aug 10, 2023 at 08:43:26PM +0800, Ming Lei wrote:
> There isn't any reason to not support REQ_OP_ZONE_RESET_ALL given everything
> is actually handled in userspace, not mention it is pretty easy to support
> RESET_ALL.
> 
> So enable REQ_OP_ZONE_RESET_ALL and let userspace handle it.
> 
> Verified by 'tools/zbc_reset_zone -all /dev/ublkb0' in libzbc[1] with
> libublk-rs based ublk-zoned target prototype[2], follows command line
> for creating ublk-zoned:
> 
> 	cargo run --example zoned -- add -1 1024	# add $dev_id $DEV_SIZE
> 
> [1] https://github.com/westerndigitalcorporation/libzbc
> [2] https://github.com/ming1/libublk-rs/tree/zoned.v2
> 
> Cc: Niklas Cassel <Niklas.Cassel@wdc.com>
> Cc: Damien Le Moal <dlemoal@kernel.org>
> Cc: Andreas Hindborg <a.hindborg@samsung.com>
> Signed-off-by: Ming Lei <ming.lei@redhat.com>
> ---
> V2:
> 	- update comment as reported by Niklas
> 
>  drivers/block/ublk_drv.c      | 7 +++++--
>  include/uapi/linux/ublk_cmd.h | 1 +
>  2 files changed, 6 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c
> index b60394fe7be6..3650ef209344 100644
> --- a/drivers/block/ublk_drv.c
> +++ b/drivers/block/ublk_drv.c
> @@ -251,6 +251,7 @@ static int ublk_dev_param_zoned_apply(struct ublk_device *ub)
>  	const struct ublk_param_zoned *p = &ub->params.zoned;
>  
>  	disk_set_zoned(ub->ub_disk, BLK_ZONED_HM);
> +	blk_queue_flag_set(QUEUE_FLAG_ZONE_RESETALL, ub->ub_disk->queue);
>  	blk_queue_required_elevator_features(ub->ub_disk->queue,
>  					     ELEVATOR_F_ZBD_SEQ_WRITE);
>  	disk_set_max_active_zones(ub->ub_disk, p->max_active_zones);
> @@ -393,6 +394,9 @@ static blk_status_t ublk_setup_iod_zoned(struct ublk_queue *ubq,
>  	case REQ_OP_ZONE_APPEND:
>  		ublk_op = UBLK_IO_OP_ZONE_APPEND;
>  		break;
> +	case REQ_OP_ZONE_RESET_ALL:
> +		ublk_op = UBLK_IO_OP_ZONE_RESET_ALL;
> +		break;
>  	case REQ_OP_DRV_IN:
>  		ublk_op = pdu->operation;
>  		switch (ublk_op) {
> @@ -404,9 +408,8 @@ static blk_status_t ublk_setup_iod_zoned(struct ublk_queue *ubq,
>  		default:
>  			return BLK_STS_IOERR;
>  		}
> -	case REQ_OP_ZONE_RESET_ALL:
>  	case REQ_OP_DRV_OUT:
> -		/* We do not support reset_all and drv_out */
> +		/* We do not support drv_out */
>  		return BLK_STS_NOTSUPP;
>  	default:
>  		return BLK_STS_IOERR;
> diff --git a/include/uapi/linux/ublk_cmd.h b/include/uapi/linux/ublk_cmd.h
> index 2685e53e4752..b9cfc5c96268 100644
> --- a/include/uapi/linux/ublk_cmd.h
> +++ b/include/uapi/linux/ublk_cmd.h
> @@ -245,6 +245,7 @@ struct ublksrv_ctrl_dev_info {
>  #define		UBLK_IO_OP_ZONE_CLOSE		11
>  #define		UBLK_IO_OP_ZONE_FINISH		12
>  #define		UBLK_IO_OP_ZONE_APPEND		13
> +#define		UBLK_IO_OP_ZONE_RESET_ALL	14

For some reason, it seems like the UBLK_IO_OP_ZONE_* values
are identical to the REQ_OP_ZONE_* values in enum req_op:
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/linux/blk_types.h?h=v6.5-rc5#n371

I don't see any obvious advantage of keeping them the same,
but if you want to keep this pattern, then perhaps you want
to define UBLK_IO_OP_ZONE_RESET_ALL to 17.


Kind regards,
Niklas
Ming Lei Aug. 10, 2023, 2 p.m. UTC | #2
On Thu, Aug 10, 2023 at 01:10:30PM +0000, Niklas Cassel wrote:
> On Thu, Aug 10, 2023 at 08:43:26PM +0800, Ming Lei wrote:
> > There isn't any reason to not support REQ_OP_ZONE_RESET_ALL given everything
> > is actually handled in userspace, not mention it is pretty easy to support
> > RESET_ALL.
> > 
> > So enable REQ_OP_ZONE_RESET_ALL and let userspace handle it.
> > 
> > Verified by 'tools/zbc_reset_zone -all /dev/ublkb0' in libzbc[1] with
> > libublk-rs based ublk-zoned target prototype[2], follows command line
> > for creating ublk-zoned:
> > 
> > 	cargo run --example zoned -- add -1 1024	# add $dev_id $DEV_SIZE
> > 
> > [1] https://github.com/westerndigitalcorporation/libzbc
> > [2] https://github.com/ming1/libublk-rs/tree/zoned.v2
> > 
> > Cc: Niklas Cassel <Niklas.Cassel@wdc.com>
> > Cc: Damien Le Moal <dlemoal@kernel.org>
> > Cc: Andreas Hindborg <a.hindborg@samsung.com>
> > Signed-off-by: Ming Lei <ming.lei@redhat.com>
> > ---
> > V2:
> > 	- update comment as reported by Niklas
> > 
> >  drivers/block/ublk_drv.c      | 7 +++++--
> >  include/uapi/linux/ublk_cmd.h | 1 +
> >  2 files changed, 6 insertions(+), 2 deletions(-)
> > 
> > diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c
> > index b60394fe7be6..3650ef209344 100644
> > --- a/drivers/block/ublk_drv.c
> > +++ b/drivers/block/ublk_drv.c
> > @@ -251,6 +251,7 @@ static int ublk_dev_param_zoned_apply(struct ublk_device *ub)
> >  	const struct ublk_param_zoned *p = &ub->params.zoned;
> >  
> >  	disk_set_zoned(ub->ub_disk, BLK_ZONED_HM);
> > +	blk_queue_flag_set(QUEUE_FLAG_ZONE_RESETALL, ub->ub_disk->queue);
> >  	blk_queue_required_elevator_features(ub->ub_disk->queue,
> >  					     ELEVATOR_F_ZBD_SEQ_WRITE);
> >  	disk_set_max_active_zones(ub->ub_disk, p->max_active_zones);
> > @@ -393,6 +394,9 @@ static blk_status_t ublk_setup_iod_zoned(struct ublk_queue *ubq,
> >  	case REQ_OP_ZONE_APPEND:
> >  		ublk_op = UBLK_IO_OP_ZONE_APPEND;
> >  		break;
> > +	case REQ_OP_ZONE_RESET_ALL:
> > +		ublk_op = UBLK_IO_OP_ZONE_RESET_ALL;
> > +		break;
> >  	case REQ_OP_DRV_IN:
> >  		ublk_op = pdu->operation;
> >  		switch (ublk_op) {
> > @@ -404,9 +408,8 @@ static blk_status_t ublk_setup_iod_zoned(struct ublk_queue *ubq,
> >  		default:
> >  			return BLK_STS_IOERR;
> >  		}
> > -	case REQ_OP_ZONE_RESET_ALL:
> >  	case REQ_OP_DRV_OUT:
> > -		/* We do not support reset_all and drv_out */
> > +		/* We do not support drv_out */
> >  		return BLK_STS_NOTSUPP;
> >  	default:
> >  		return BLK_STS_IOERR;
> > diff --git a/include/uapi/linux/ublk_cmd.h b/include/uapi/linux/ublk_cmd.h
> > index 2685e53e4752..b9cfc5c96268 100644
> > --- a/include/uapi/linux/ublk_cmd.h
> > +++ b/include/uapi/linux/ublk_cmd.h
> > @@ -245,6 +245,7 @@ struct ublksrv_ctrl_dev_info {
> >  #define		UBLK_IO_OP_ZONE_CLOSE		11
> >  #define		UBLK_IO_OP_ZONE_FINISH		12
> >  #define		UBLK_IO_OP_ZONE_APPEND		13
> > +#define		UBLK_IO_OP_ZONE_RESET_ALL	14
> 
> For some reason, it seems like the UBLK_IO_OP_ZONE_* values
> are identical to the REQ_OP_ZONE_* values in enum req_op:

Yeah.

I think that is zoned interface abstraction, which should be
generic enough to use linux's definition for ublk's UAPI in 1:1.

The same mapping can be found in virtio-blk zoned spec.

> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/linux/blk_types.h?h=v6.5-rc5#n371
> 
> I don't see any obvious advantage of keeping them the same,

Not sure I follow your idea, and can you share your exact suggestion?

UBLK_IO_OP_ZONE_* is part of ublk UAPI, but REQ_OP_ZONE_* is just kernel
internal definition which may be changed time by time, so we can't use
REQ_OP_ZONE_* directly.

Here you can think of UBLK_IO_OP_ZONE_* as interface between driver and
hardware, so UBLK_IO_OP_ZONE_* has to be defined independently.

> but if you want to keep this pattern, then perhaps you want
> to define UBLK_IO_OP_ZONE_RESET_ALL to 17.

Why do you think that 17 is better than 14?

I'd rather use 14 to fill the hole, meantime the two ZONE_RESET OPs
can be kept together.

Thanks,
Ming
Niklas Cassel Aug. 10, 2023, 2:22 p.m. UTC | #3
On Thu, Aug 10, 2023 at 10:00:14PM +0800, Ming Lei wrote:
> On Thu, Aug 10, 2023 at 01:10:30PM +0000, Niklas Cassel wrote:
> > On Thu, Aug 10, 2023 at 08:43:26PM +0800, Ming Lei wrote:

(snip)
 
> UBLK_IO_OP_ZONE_* is part of ublk UAPI, but REQ_OP_ZONE_* is just kernel
> internal definition which may be changed time by time, so we can't use
> REQ_OP_ZONE_* directly.
> 
> Here you can think of UBLK_IO_OP_ZONE_* as interface between driver and
> hardware, so UBLK_IO_OP_ZONE_* has to be defined independently.
> 
> > but if you want to keep this pattern, then perhaps you want
> > to define UBLK_IO_OP_ZONE_RESET_ALL to 17.
> 
> Why do you think that 17 is better than 14?

I never said that it was better :)
I even said: "I don't see any obvious advantage of keeping them the same" :)

Just that it would follow the existing pattern of keeping
UBLK_IO_OP_ZONE_* in sync with REQ_OP_ZONE_*.


> 
> I'd rather use 14 to fill the hole, meantime the two ZONE_RESET OPs
> can be kept together.

Ok, but then, considering that UBLK_IO_OP_ZONE_* is not part of any official
kernel release, and that the highest UBLK_IO_OP is currently defined as 5:
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/uapi/linux/ublk_cmd.h?h=v6.5-rc5#n237

why not define:
+#define		UBLK_IO_OP_ZONE_OPEN		6
+#define		UBLK_IO_OP_ZONE_CLOSE		7
+#define		UBLK_IO_OP_ZONE_FINISH		8
+#define		UBLK_IO_OP_ZONE_APPEND		9
+#define		UBLK_IO_OP_ZONE_RESET		10
+#define		UBLK_IO_OP_ZONE_RESET_ALL	11

instead of, like it currently is in linux-block/for-next (this patch included):

+#define		UBLK_IO_OP_ZONE_OPEN		10
+#define		UBLK_IO_OP_ZONE_CLOSE		11
+#define		UBLK_IO_OP_ZONE_FINISH		12
+#define		UBLK_IO_OP_ZONE_APPEND		13
+#define		UBLK_IO_OP_ZONE_RESET_ALL	14
+#define		UBLK_IO_OP_ZONE_RESET		15

Because, even after this patch, you would still have a hole between
UBLK_IO_OP_ value 5 and 10.


Kind regards,
Niklas
Ming Lei Aug. 10, 2023, 2:47 p.m. UTC | #4
On Thu, Aug 10, 2023 at 02:22:50PM +0000, Niklas Cassel wrote:
> On Thu, Aug 10, 2023 at 10:00:14PM +0800, Ming Lei wrote:
> > On Thu, Aug 10, 2023 at 01:10:30PM +0000, Niklas Cassel wrote:
> > > On Thu, Aug 10, 2023 at 08:43:26PM +0800, Ming Lei wrote:
> 
> (snip)
>  
> > UBLK_IO_OP_ZONE_* is part of ublk UAPI, but REQ_OP_ZONE_* is just kernel
> > internal definition which may be changed time by time, so we can't use
> > REQ_OP_ZONE_* directly.
> > 
> > Here you can think of UBLK_IO_OP_ZONE_* as interface between driver and
> > hardware, so UBLK_IO_OP_ZONE_* has to be defined independently.
> > 
> > > but if you want to keep this pattern, then perhaps you want
> > > to define UBLK_IO_OP_ZONE_RESET_ALL to 17.
> > 
> > Why do you think that 17 is better than 14?
> 
> I never said that it was better :)
> I even said: "I don't see any obvious advantage of keeping them the same" :)

OK, maybe I misunderstood your point.

> 
> Just that it would follow the existing pattern of keeping
> UBLK_IO_OP_ZONE_* in sync with REQ_OP_ZONE_*.

No matter 14 or 17, it does sync with REQ_OP_ZONE_*, even though it
isn't necessary to do so.

Then your all comment on this patch should be addressed, right?

> 
> 
> > 
> > I'd rather use 14 to fill the hole, meantime the two ZONE_RESET OPs
> > can be kept together.
> 
> Ok, but then, considering that UBLK_IO_OP_ZONE_* is not part of any official
> kernel release, and that the highest UBLK_IO_OP is currently defined as 5:

I don't think it is necessary, see below.

> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/uapi/linux/ublk_cmd.h?h=v6.5-rc5#n237
> 
> why not define:
> +#define		UBLK_IO_OP_ZONE_OPEN		6
> +#define		UBLK_IO_OP_ZONE_CLOSE		7
> +#define		UBLK_IO_OP_ZONE_FINISH		8
> +#define		UBLK_IO_OP_ZONE_APPEND		9
> +#define		UBLK_IO_OP_ZONE_RESET		10
> +#define		UBLK_IO_OP_ZONE_RESET_ALL	11
> 
> instead of, like it currently is in linux-block/for-next (this patch included):
> 
> +#define		UBLK_IO_OP_ZONE_OPEN		10
> +#define		UBLK_IO_OP_ZONE_CLOSE		11
> +#define		UBLK_IO_OP_ZONE_FINISH		12
> +#define		UBLK_IO_OP_ZONE_APPEND		13
> +#define		UBLK_IO_OP_ZONE_RESET_ALL	14
> +#define		UBLK_IO_OP_ZONE_RESET		15
> 
> Because, even after this patch, you would still have a hole between
> UBLK_IO_OP_ value 5 and 10.

(5, 10) can be reserved for some more generic normal IOs, maybe new kind
of READ/WRITE, or whatever.

We have 256 OP available, which is big enough for future extend, and OP
code can be used from any offset, but still more readable to group them
according to their category. And it isn't big deal to use which number
for which command, what matters is that we can extend, and keep
compatible.


Thanks,
Ming
Niklas Cassel Aug. 10, 2023, 3:09 p.m. UTC | #5
On Thu, Aug 10, 2023 at 10:47:14PM +0800, Ming Lei wrote:
> On Thu, Aug 10, 2023 at 02:22:50PM +0000, Niklas Cassel wrote:
> > On Thu, Aug 10, 2023 at 10:00:14PM +0800, Ming Lei wrote:
> > > On Thu, Aug 10, 2023 at 01:10:30PM +0000, Niklas Cassel wrote:
> > > > On Thu, Aug 10, 2023 at 08:43:26PM +0800, Ming Lei wrote:
> 
> We have 256 OP available, which is big enough for future extend, and OP
> code can be used from any offset, but still more readable to group them
> according to their category. And it isn't big deal to use which number
> for which command, what matters is that we can extend, and keep
> compatible.

I see your point, cheers!


Kind regards,
Niklas
Ming Lei Aug. 14, 2023, 2:01 a.m. UTC | #6
On Thu, Aug 10, 2023 at 08:43:26PM +0800, Ming Lei wrote:
> There isn't any reason to not support REQ_OP_ZONE_RESET_ALL given everything
> is actually handled in userspace, not mention it is pretty easy to support
> RESET_ALL.
> 
> So enable REQ_OP_ZONE_RESET_ALL and let userspace handle it.
> 
> Verified by 'tools/zbc_reset_zone -all /dev/ublkb0' in libzbc[1] with
> libublk-rs based ublk-zoned target prototype[2], follows command line
> for creating ublk-zoned:
> 
> 	cargo run --example zoned -- add -1 1024	# add $dev_id $DEV_SIZE
> 
> [1] https://github.com/westerndigitalcorporation/libzbc
> [2] https://github.com/ming1/libublk-rs/tree/zoned.v2
> 
> Cc: Niklas Cassel <Niklas.Cassel@wdc.com>
> Cc: Damien Le Moal <dlemoal@kernel.org>
> Cc: Andreas Hindborg <a.hindborg@samsung.com>
> Signed-off-by: Ming Lei <ming.lei@redhat.com>
> ---
> V2:
> 	- update comment as reported by Niklas

Hello Jens,

Can you merge this one since V2 addresses Niklas's concern.

Thanks,
Ming
Ming Lei Aug. 21, 2023, 2:16 a.m. UTC | #7
On Mon, Aug 14, 2023 at 10:01:25AM +0800, Ming Lei wrote:
> On Thu, Aug 10, 2023 at 08:43:26PM +0800, Ming Lei wrote:
> > There isn't any reason to not support REQ_OP_ZONE_RESET_ALL given everything
> > is actually handled in userspace, not mention it is pretty easy to support
> > RESET_ALL.
> > 
> > So enable REQ_OP_ZONE_RESET_ALL and let userspace handle it.
> > 
> > Verified by 'tools/zbc_reset_zone -all /dev/ublkb0' in libzbc[1] with
> > libublk-rs based ublk-zoned target prototype[2], follows command line
> > for creating ublk-zoned:
> > 
> > 	cargo run --example zoned -- add -1 1024	# add $dev_id $DEV_SIZE
> > 
> > [1] https://github.com/westerndigitalcorporation/libzbc
> > [2] https://github.com/ming1/libublk-rs/tree/zoned.v2
> > 
> > Cc: Niklas Cassel <Niklas.Cassel@wdc.com>
> > Cc: Damien Le Moal <dlemoal@kernel.org>
> > Cc: Andreas Hindborg <a.hindborg@samsung.com>
> > Signed-off-by: Ming Lei <ming.lei@redhat.com>
> > ---
> > V2:
> > 	- update comment as reported by Niklas
> 
> Hello Jens,
> 
> Can you merge this one since V2 addresses Niklas's concern.

Ping...

Thanks,
Ming
Jens Axboe Aug. 21, 2023, 2:25 a.m. UTC | #8
On Thu, 10 Aug 2023 20:43:26 +0800, Ming Lei wrote:
> There isn't any reason to not support REQ_OP_ZONE_RESET_ALL given everything
> is actually handled in userspace, not mention it is pretty easy to support
> RESET_ALL.
> 
> So enable REQ_OP_ZONE_RESET_ALL and let userspace handle it.
> 
> Verified by 'tools/zbc_reset_zone -all /dev/ublkb0' in libzbc[1] with
> libublk-rs based ublk-zoned target prototype[2], follows command line
> for creating ublk-zoned:
> 
> [...]

Applied, thanks!

[1/1] ublk: zoned: support REQ_OP_ZONE_RESET_ALL
      commit: 851e06297f20bbd85c93bbf09469f2150d1db218

Best regards,
diff mbox series

Patch

diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c
index b60394fe7be6..3650ef209344 100644
--- a/drivers/block/ublk_drv.c
+++ b/drivers/block/ublk_drv.c
@@ -251,6 +251,7 @@  static int ublk_dev_param_zoned_apply(struct ublk_device *ub)
 	const struct ublk_param_zoned *p = &ub->params.zoned;
 
 	disk_set_zoned(ub->ub_disk, BLK_ZONED_HM);
+	blk_queue_flag_set(QUEUE_FLAG_ZONE_RESETALL, ub->ub_disk->queue);
 	blk_queue_required_elevator_features(ub->ub_disk->queue,
 					     ELEVATOR_F_ZBD_SEQ_WRITE);
 	disk_set_max_active_zones(ub->ub_disk, p->max_active_zones);
@@ -393,6 +394,9 @@  static blk_status_t ublk_setup_iod_zoned(struct ublk_queue *ubq,
 	case REQ_OP_ZONE_APPEND:
 		ublk_op = UBLK_IO_OP_ZONE_APPEND;
 		break;
+	case REQ_OP_ZONE_RESET_ALL:
+		ublk_op = UBLK_IO_OP_ZONE_RESET_ALL;
+		break;
 	case REQ_OP_DRV_IN:
 		ublk_op = pdu->operation;
 		switch (ublk_op) {
@@ -404,9 +408,8 @@  static blk_status_t ublk_setup_iod_zoned(struct ublk_queue *ubq,
 		default:
 			return BLK_STS_IOERR;
 		}
-	case REQ_OP_ZONE_RESET_ALL:
 	case REQ_OP_DRV_OUT:
-		/* We do not support reset_all and drv_out */
+		/* We do not support drv_out */
 		return BLK_STS_NOTSUPP;
 	default:
 		return BLK_STS_IOERR;
diff --git a/include/uapi/linux/ublk_cmd.h b/include/uapi/linux/ublk_cmd.h
index 2685e53e4752..b9cfc5c96268 100644
--- a/include/uapi/linux/ublk_cmd.h
+++ b/include/uapi/linux/ublk_cmd.h
@@ -245,6 +245,7 @@  struct ublksrv_ctrl_dev_info {
 #define		UBLK_IO_OP_ZONE_CLOSE		11
 #define		UBLK_IO_OP_ZONE_FINISH		12
 #define		UBLK_IO_OP_ZONE_APPEND		13
+#define		UBLK_IO_OP_ZONE_RESET_ALL	14
 #define		UBLK_IO_OP_ZONE_RESET		15
 /*
  * Construct a zone report. The report request is carried in `struct