All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ming Lei <ming.lei@redhat.com>
To: Uday Shankar <ushankar@purestorage.com>
Cc: Jens Axboe <axboe@kernel.dk>,
	Caleb Sander Mateos <csander@purestorage.com>,
	linux-block@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v5 4/4] ublk: mark ublk_queue as const for ublk_handle_need_get_data
Date: Fri, 18 Apr 2025 09:39:05 +0800	[thread overview]
Message-ID: <aAGtOYV2lxvu0Zzo@fedora> (raw)
In-Reply-To: <20250416-ublk_task_per_io-v5-4-9261ad7bff20@purestorage.com>

On Wed, Apr 16, 2025 at 01:46:08PM -0600, Uday Shankar wrote:
> We now allow multiple tasks to operate on I/Os belonging to the same
> queue concurrently. This means that any writes to ublk_queue in the I/O
> path are potential sources of data races. Try to prevent these by
> marking ublk_queue pointers as const in ublk_handle_need_get_data. Also
> move a bit more of the NEED_GET_DATA-specific logic into
> ublk_handle_need_get_data, to make the pattern in __ublk_ch_uring_cmd
> more uniform.
> 
> Suggested-by: Ming Lei <ming.lei@redhat.com>
> Signed-off-by: Uday Shankar <ushankar@purestorage.com>
> ---
>  drivers/block/ublk_drv.c | 32 +++++++++++++++++++-------------
>  1 file changed, 19 insertions(+), 13 deletions(-)
> 
> diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c
> index 215ab45b00e10150e58d7f5ea5b5d13e40a1aa79..5f9679c03305576bee586388cab82a6ea5472f8b 100644
> --- a/drivers/block/ublk_drv.c
> +++ b/drivers/block/ublk_drv.c
> @@ -1291,7 +1291,7 @@ static void ublk_cmd_tw_cb(struct io_uring_cmd *cmd,
>  	ublk_dispatch_req(ubq, pdu->req, issue_flags);
>  }
>  
> -static void ublk_queue_cmd(struct ublk_queue *ubq, struct request *rq)
> +static void ublk_queue_cmd(const struct ublk_queue *ubq, struct request *rq)
>  {
>  	struct io_uring_cmd *cmd = ubq->ios[rq->tag].cmd;
>  	struct ublk_uring_cmd_pdu *pdu = ublk_get_uring_cmd_pdu(cmd);
> @@ -1813,15 +1813,6 @@ static void ublk_mark_io_ready(struct ublk_device *ub, struct ublk_queue *ubq)
>  	mutex_unlock(&ub->mutex);
>  }
>  
> -static void ublk_handle_need_get_data(struct ublk_device *ub, int q_id,
> -		int tag)
> -{
> -	struct ublk_queue *ubq = ublk_get_queue(ub, q_id);
> -	struct request *req = blk_mq_tag_to_rq(ub->tag_set.tags[q_id], tag);
> -
> -	ublk_queue_cmd(ubq, req);
> -}
> -
>  static inline int ublk_check_cmd_op(u32 cmd_op)
>  {
>  	u32 ioc_type = _IOC_TYPE(cmd_op);
> @@ -1933,6 +1924,20 @@ static int ublk_commit_and_fetch(const struct ublk_queue *ubq,
>  	return 0;
>  }
>  
> +static int ublk_get_data(const struct ublk_queue *ubq, struct ublk_io *io,
> +			 struct io_uring_cmd *cmd,
> +			 const struct ublksrv_io_cmd *ub_cmd,
> +			 struct request *req)
> +{
> +	if (!(io->flags & UBLK_IO_FLAG_OWNED_BY_SRV))
> +		return -EINVAL;
> +
> +	ublk_fill_io_cmd(io, cmd, ub_cmd->addr);
> +	ublk_queue_cmd(ubq, req);
> +
> +	return 0;
> +}
> +
>  static int __ublk_ch_uring_cmd(struct io_uring_cmd *cmd,
>  			       unsigned int issue_flags,
>  			       const struct ublksrv_io_cmd *ub_cmd)
> @@ -2026,10 +2031,11 @@ static int __ublk_ch_uring_cmd(struct io_uring_cmd *cmd,
>  			goto out;
>  		break;
>  	case UBLK_IO_NEED_GET_DATA:
> -		if (!(io->flags & UBLK_IO_FLAG_OWNED_BY_SRV))
> +		ret = ublk_get_data(
> +			ubq, io, cmd, ub_cmd,
> +			blk_mq_tag_to_rq(ub->tag_set.tags[ub_cmd->q_id], tag));

Same with patch 2, moving request retrieval into ublk_get_data() could be
cleaner and helpful for switching to store request pointer into `ublk_io`.

Otherwise, looks nice cleanup.

Thanks,
Ming


      parent reply	other threads:[~2025-04-18  1:39 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-04-16 19:46 [PATCH v5 0/4] ublk: decouple server threads from hctxs Uday Shankar
2025-04-16 19:46 ` [PATCH v5 1/4] ublk: require unique task per io instead of unique task per hctx Uday Shankar
2025-04-18  1:30   ` Ming Lei
2025-04-18  2:30     ` Jens Axboe
2025-04-16 19:46 ` [PATCH v5 2/4] ublk: mark ublk_queue as const for ublk_commit_and_fetch Uday Shankar
2025-04-18  1:35   ` Ming Lei
2025-04-16 19:46 ` [PATCH v5 3/4] ublk: mark ublk_queue as const for ublk_register_io_buf Uday Shankar
2025-04-18  1:36   ` Ming Lei
2025-04-16 19:46 ` [PATCH v5 4/4] ublk: mark ublk_queue as const for ublk_handle_need_get_data Uday Shankar
2025-04-16 19:55   ` Caleb Sander Mateos
2025-04-18  1:39   ` Ming Lei [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=aAGtOYV2lxvu0Zzo@fedora \
    --to=ming.lei@redhat.com \
    --cc=axboe@kernel.dk \
    --cc=csander@purestorage.com \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=ushankar@purestorage.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.