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 2/4] ublk: mark ublk_queue as const for ublk_commit_and_fetch
Date: Fri, 18 Apr 2025 09:35:48 +0800	[thread overview]
Message-ID: <aAGsdAdnkAwTRWg0@fedora> (raw)
In-Reply-To: <20250416-ublk_task_per_io-v5-2-9261ad7bff20@purestorage.com>

On Wed, Apr 16, 2025 at 01:46:06PM -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 when handling COMMIT_AND_FETCH.
> Move the logic for this command into its own function
> ublk_commit_and_fetch. Also open code ublk_commit_completion in
> ublk_commit_and_fetch to reduce the number of parameters/avoid a
> redundant lookup.
> 
> Suggested-by: Ming Lei <ming.lei@redhat.com>
> Signed-off-by: Uday Shankar <ushankar@purestorage.com>
> Reviewed-by: Caleb Sander Mateos <csander@purestorage.com>
> ---
>  drivers/block/ublk_drv.c | 91 +++++++++++++++++++++++-------------------------
>  1 file changed, 43 insertions(+), 48 deletions(-)
> 
> diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c
> index 4e4863d873e6593ad94c72cbf971f792df5795ae..b44cbcbcc9d1735c398dc9ac7e93f4c8736b9201 100644
> --- a/drivers/block/ublk_drv.c
> +++ b/drivers/block/ublk_drv.c
> @@ -1518,30 +1518,6 @@ static int ublk_ch_mmap(struct file *filp, struct vm_area_struct *vma)
>  	return remap_pfn_range(vma, vma->vm_start, pfn, sz, vma->vm_page_prot);
>  }
>  
> -static void ublk_commit_completion(struct ublk_device *ub,
> -		const struct ublksrv_io_cmd *ub_cmd)
> -{
> -	u32 qid = ub_cmd->q_id, tag = ub_cmd->tag;
> -	struct ublk_queue *ubq = ublk_get_queue(ub, qid);
> -	struct ublk_io *io = &ubq->ios[tag];
> -	struct request *req;
> -
> -	/* now this cmd slot is owned by nbd driver */
> -	io->flags &= ~UBLK_IO_FLAG_OWNED_BY_SRV;
> -	io->res = ub_cmd->result;
> -
> -	/* find the io request and complete */
> -	req = blk_mq_tag_to_rq(ub->tag_set.tags[qid], tag);
> -	if (WARN_ON_ONCE(unlikely(!req)))
> -		return;
> -
> -	if (req_op(req) == REQ_OP_ZONE_APPEND)
> -		req->__sector = ub_cmd->zone_append_lba;
> -
> -	if (likely(!blk_should_fake_timeout(req->q)))
> -		ublk_put_req_ref(ubq, req);
> -}
> -
>  /*
>   * Called from io task context via cancel fn, meantime quiesce ublk
>   * blk-mq queue, so we are called exclusively with blk-mq and io task
> @@ -1918,6 +1894,45 @@ static int ublk_unregister_io_buf(struct io_uring_cmd *cmd,
>  	return io_buffer_unregister_bvec(cmd, index, issue_flags);
>  }
>  
> +static int ublk_commit_and_fetch(const struct ublk_queue *ubq,
> +				 struct ublk_io *io, struct io_uring_cmd *cmd,
> +				 const struct ublksrv_io_cmd *ub_cmd,
> +				 struct request *req)

request argument can be removed by getting it inside this function directly,
and it is helpful to switch to retrieve & store it from 'ublk_io' later.

Otherwise, looks nice cleanup.


thanks,
Ming


  reply	other threads:[~2025-04-18  1:36 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 [this message]
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

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=aAGsdAdnkAwTRWg0@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.