From nobody Fri Oct 2 07:45:31 2026 Received: from mail-oi1-f225.google.com (mail-oi1-f225.google.com [209.85.167.225]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 43414326D55 for ; Mon, 3 Aug 2026 21:14:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.225 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785791690; cv=none; b=FpvRYl+sH8xuiE8NDvnRLBPqQ1AYQdFcRwCD61Ak5z3ifnNXLlPhbm1kL8968++vza/FLTnR1sR3LaebBTBnHaA9KGeLc1Ea38RE+TYiJlrAZC6DXRjWLK2IoiwoWhHHmCBVYzKaFF1UDc0TGQDRESp+BKGe+1V0Vf1mz8Al/P8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785791690; c=relaxed/simple; bh=9acBFwHuoe1WjBcMr0Xej+GgpA3/dG8koVdNsnmmatw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=otgp5JJFeLC+q+olKUe+MtGHt7H1+o0EnMczix8a3VRYL5pYEL4nnVffaYC+s+7Pw3bqg0WgktCppe/2+jtcYkFiPvReTv07b4gR+wiUPSW25MgFK102V+JjHLutN1w7Ksnhh30+2FvB0/YANtG1t5uBa1fgoUM6aU5ni3Zd8R0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=purestorage.com; spf=pass smtp.mailfrom=purestorage.com; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b=G1wejPQr; arc=none smtp.client-ip=209.85.167.225 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=purestorage.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=purestorage.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b="G1wejPQr" Received: by mail-oi1-f225.google.com with SMTP id 5614622812f47-4ab246dfc90so443187b6e.0 for ; Mon, 03 Aug 2026 14:14:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1785791685; x=1786396485; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=uczeYpDC/SttNe9telPi5/5P4P2/v7kOCg4CCf1zw7s=; b=G1wejPQrYslJGiG4PDO4PcNu4a7nr7geQkg51aHduQhBLYccVJO0lOQmYSAkozkrMp bwq/JF1a7H6BNTgDpZx6l0Yo+TFkvwk4Bs97M27FFyhkkeFGIw0bGvU0Lz+EzSlUyesa O2OSiZ5qvrNPRE4nZBGX/i2D0tx9qbhXIrvGXhvW/mUhjVoKo1C1U3BMy2gtRho7ODD+ 2nC7U+vQU51nCuXKUhAArcbBvkmzTRFNMRVTRhTBWGSf6bVhdU9ZgnAxNh9z/PuJ8ARa suOGpd2U2h4i8fw5lFkm4nOK3khezMwfi9hmk+OGB8hfthJWr2g1j/W/vdiQ/y9JO5R9 dSuw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785791685; x=1786396485; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=uczeYpDC/SttNe9telPi5/5P4P2/v7kOCg4CCf1zw7s=; b=sB1ZESc7Yz3Uf2YRVTcx9YGWaSnkY3CNwVwKMxLNGcfbdC11JJhutB62SNmg28tGwz LO/K6ChEOmrN9hMI1segSSMuMQRsPHVomCsD/zs9sg0MSrxLcXB+S1UR27Szczw3dJlF RR3vgs3B9XSGKJLJSWKg22OhSJzBe85dLxSUKkSMDDOd9U3pYHMzXUhXDQhHuDiMYNmT EE5kC3/C2dCS/XjqXfkrU7ajQzOuIvzSlp+rws/9I7JS7FKewfkjNd8O8TKzPjdQhll/ UY2R9sqpHYdoib4uS54FdrntRnn41OSoIxHjj11wedCObIuWwQYftGKe7kOoG5jyYUde nbFg== X-Forwarded-Encrypted: i=1; AHgh+RonFF1d5s2yYf+RCZAKibPJWWO4M8JnI6b99hzO5jYLdTCo5QNE18SoKdJs8AC1yrKsWaZNBVCyV1qbSAo=@vger.kernel.org X-Gm-Message-State: AOJu0YxQBkBqu6GmoVGsGGi3cRITDAxQBroTjmN2zMd0fqvgt0KIGi+S QA6IPl5oghXN/xoxLyfdswUYl8SVg/+Lkq1HvX8lLIZh3uS7DekQmuf0XWtO0g1ZN1oy8VB79k7 0G/QS71WDCmpgZ9YfxO1ezthoJGMQQ8l/fsFf X-Gm-Gg: AR+sD13ThZya07IY46smVUmA3FKA/zkxrfJTVGnXotzx8AZk89PnTdwQKp5Epmx4mkc 3Ub3Sp1BpVxb0Gsq21YI+3xocJNv7NmE2distd1lL4Ds6atDVC8k0dp6ecVqTR28CfwIarhrrpm F3N+uS992WzmprPHajfJBaKA+GMuFxK+zY66n8mtnCbtqe450vIERRSGxdjJXxWY04UvC51+pt9 WGFsvwbT6/lGIDyahJMioLUKiIfo9Qq1Keo4ADchKckqAninWc3SkxGqNLYSpa9THPc3TZqKbhw rjf1g51cbhp52wafgYHYoK6ctAPlF6e4fGjxQqojO4HpC2Funjem7gaGlCIx2D+NE5tDM5/9b0C JiETLs+eki5cLLD5hcxyqwgVhf6ZbSKw3 X-Received: by 2002:a05:6808:50a7:b0:496:d5:7b22 with SMTP id 5614622812f47-4af5df715e8mr12303752b6e.1.1785791685069; Mon, 03 Aug 2026 14:14:45 -0700 (PDT) Received: from c7-smtp-2026.dev.purestorage.com ([208.88.159.128]) by smtp-relay.gmail.com with ESMTPS id 586e51a60fabf-458f6639937sm1031268fac.9.2026.08.03.14.14.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Aug 2026 14:14:45 -0700 (PDT) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.112.12.104]) by c7-smtp-2026.dev.purestorage.com (Postfix) with ESMTP id A39C0402B3; Mon, 3 Aug 2026 15:14:44 -0600 (MDT) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id A0BB7E4041D; Mon, 3 Aug 2026 15:14:44 -0600 (MDT) From: Caleb Sander Mateos To: Ming Lei , Jens Axboe , Shuah Khan Cc: linux-block@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Caleb Sander Mateos Subject: [PATCH v2 1/8] ublk: consistently use u16 for queue and tag numbers Date: Mon, 3 Aug 2026 15:14:33 -0600 Message-ID: <20260803211441.2538144-2-csander@purestorage.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260803211441.2538144-1-csander@purestorage.com> References: <20260803211441.2538144-1-csander@purestorage.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The u16 nr_hw_queues and queue_depth fields of the ublk UAPI struct ublksrv_ctrl_dev_info constrain the number of queues and queue depth of each ublk device. However, the ublk driver is a bit inconsistent with the type it uses to represent these values, mixing u16 with int and unsigned int. Change all queue number, queue depth, q_id, and tag variables/fields to u16 to save some space. Signed-off-by: Caleb Sander Mateos Reviewed-by: Ming Lei --- drivers/block/ublk_drv.c | 80 ++++++++++++++++++++-------------------- 1 file changed, 41 insertions(+), 39 deletions(-) diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c index dd5d336eba29..da88c8042db6 100644 --- a/drivers/block/ublk_drv.c +++ b/drivers/block/ublk_drv.c @@ -235,22 +235,22 @@ struct ublk_io { void *buf_ctx_handle; spinlock_t lock; } ____cacheline_aligned_in_smp; =20 struct ublk_queue { - int q_id; - int q_depth; + u16 q_id; + u16 q_depth; =20 unsigned long flags; struct ublksrv_io_desc *io_cmd_buf; =20 bool force_abort; bool canceling; bool fail_io; /* copy of dev->state =3D=3D UBLK_S_DEV_FAIL_IO */ spinlock_t cancel_lock; struct ublk_device *dev; - u32 nr_io_ready; + u16 nr_io_ready; =20 /* * For supporting UBLK_F_BATCH_IO only. * * Inflight ublk request tag is saved in this fifo @@ -325,11 +325,11 @@ struct ublk_device { spinlock_t lock; struct mm_struct *mm; =20 struct ublk_params params; =20 - u32 nr_queue_ready; + u16 nr_queue_ready; bool unprivileged_daemons; struct mutex cancel_mutex; bool canceling; pid_t ublksrv_tgid; struct delayed_work exit_work; @@ -401,11 +401,11 @@ static inline void ublk_io_evts_deinit(struct ublk_qu= eue *q) WARN_ON_ONCE(!kfifo_is_empty(&q->evts_fifo)); kfifo_free(&q->evts_fifo); } =20 static inline struct ublksrv_io_desc * -ublk_get_iod(const struct ublk_queue *ubq, unsigned tag) +ublk_get_iod(const struct ublk_queue *ubq, u16 tag) { return &ubq->io_cmd_buf[tag]; } =20 static inline bool ublk_support_zero_copy(const struct ublk_queue *ubq) @@ -421,12 +421,11 @@ static inline bool ublk_dev_support_zero_copy(const s= truct ublk_device *ub) static inline bool ublk_support_shmem_zc(const struct ublk_queue *ubq) { return ubq->flags & UBLK_F_SHMEM_ZC; } =20 -static inline bool ublk_iod_is_shmem_zc(const struct ublk_queue *ubq, - unsigned int tag) +static inline bool ublk_iod_is_shmem_zc(const struct ublk_queue *ubq, u16 = tag) { return ublk_get_iod(ubq, tag)->op_flags & UBLK_IO_F_SHMEM_ZC; } =20 static inline bool ublk_dev_support_shmem_zc(const struct ublk_device *ub) @@ -862,22 +861,22 @@ static ssize_t ublk_batch_copy_io_tags(struct ublk_ba= tch_fetch_cmd *fcmd, static unsigned int unprivileged_ublks_max =3D 64; static unsigned int unprivileged_ublks_added; /* protected by ublk_ctl_mut= ex */ =20 static struct miscdevice ublk_misc; =20 -static inline unsigned ublk_pos_to_hwq(loff_t pos) +static inline u16 ublk_pos_to_hwq(loff_t pos) { return ((pos - UBLKSRV_IO_BUF_OFFSET) >> UBLK_QID_OFF) & UBLK_QID_BITS_MASK; } =20 static inline unsigned ublk_pos_to_buf_off(loff_t pos) { return (pos - UBLKSRV_IO_BUF_OFFSET) & UBLK_IO_BUF_BITS_MASK; } =20 -static inline unsigned ublk_pos_to_tag(loff_t pos) +static inline u16 ublk_pos_to_tag(loff_t pos) { return ((pos - UBLKSRV_IO_BUF_OFFSET) >> UBLK_TAG_OFF) & UBLK_TAG_BITS_MASK; } =20 @@ -1229,22 +1228,22 @@ static noinline void ublk_put_device(struct ublk_de= vice *ub) { put_device(&ub->cdev_dev); } =20 static inline struct ublk_queue *ublk_get_queue(struct ublk_device *dev, - int qid) + u16 qid) { return dev->queues[qid]; } =20 static inline struct ublksrv_io_desc * -ublk_queue_cmd_buf(struct ublk_device *ub, int q_id) +ublk_queue_cmd_buf(struct ublk_device *ub, u16 q_id) { return ublk_get_queue(ub, q_id)->io_cmd_buf; } =20 -static inline int __ublk_queue_cmd_buf_size(int depth) +static inline int __ublk_queue_cmd_buf_size(u16 depth) { return round_up(depth * sizeof(struct ublksrv_io_desc), PAGE_SIZE); } =20 static inline int ublk_queue_cmd_buf_size(struct ublk_device *ub) @@ -1665,11 +1664,11 @@ static inline void __ublk_abort_rq(struct ublk_queu= e *ubq, else ublk_end_request(rq, BLK_STS_IOERR); } =20 static void -ublk_auto_buf_reg_fallback(const struct ublk_queue *ubq, unsigned tag) +ublk_auto_buf_reg_fallback(const struct ublk_queue *ubq, u16 tag) { struct ublksrv_io_desc *iod =3D ublk_get_iod(ubq, tag); =20 iod->op_flags |=3D UBLK_IO_F_NEED_REG_BUF; } @@ -1776,11 +1775,11 @@ static bool ublk_start_io(const struct ublk_queue *= ubq, struct request *req, } =20 static void ublk_dispatch_req(struct ublk_queue *ubq, struct request *req) { unsigned int issue_flags =3D IO_URING_CMD_TASK_WORK_ISSUE_FLAGS; - int tag =3D req->tag; + u16 tag =3D req->tag; struct ublk_io *io =3D &ubq->ios[tag]; =20 pr_devel("%s: complete: qid %d tag %d io_flags %x addr %llx\n", __func__, ubq->q_id, req->tag, io->flags, ublk_get_iod(ubq, req->tag)->addr); @@ -2366,11 +2365,11 @@ static const struct blk_mq_ops ublk_batch_mq_ops = =3D { .timeout =3D ublk_timeout, }; =20 static void ublk_queue_reinit(struct ublk_device *ub, struct ublk_queue *u= bq) { - int i; + u16 i; =20 ubq->nr_io_ready =3D 0; =20 for (i =3D 0; i < ubq->q_depth; i++) { struct ublk_io *io =3D &ubq->ios[i]; @@ -2411,11 +2410,11 @@ static int ublk_ch_open(struct inode *inode, struct= file *filp) return 0; } =20 static void ublk_reset_ch_dev(struct ublk_device *ub) { - int i; + u16 i; =20 for (i =3D 0; i < ub->dev_info.nr_hw_queues; i++) { struct ublk_queue *ubq =3D ublk_get_queue(ub, i); =20 /* Sync with ublk_cancel_cmd() */ @@ -2483,20 +2482,20 @@ static void ublk_partition_scan_work(struct work_st= ruct *work) * means. */ static void ublk_set_canceling(struct ublk_device *ub, bool canceling) __must_hold(&ub->cancel_mutex) { - int i; + u16 i; =20 ub->canceling =3D canceling; for (i =3D 0; i < ub->dev_info.nr_hw_queues; i++) ublk_get_queue(ub, i)->canceling =3D canceling; } =20 static bool ublk_check_and_reset_active_ref(struct ublk_device *ub) { - int i, j; + u16 i, j; =20 if (!ublk_dev_need_req_ref(ub)) return false; =20 for (i =3D 0; i < ub->dev_info.nr_hw_queues; i++) { @@ -2525,11 +2524,11 @@ static bool ublk_check_and_reset_active_ref(struct = ublk_device *ub) static void ublk_ch_release_work_fn(struct work_struct *work) { struct ublk_device *ub =3D container_of(work, struct ublk_device, exit_work.work); struct gendisk *disk; - int i; + u16 i; =20 /* * For zero-copy and auto buffer register modes, I/O references * might not be dropped naturally when the daemon is killed, but * io_uring guarantees that registered bvec kernel buffers are @@ -2644,11 +2643,12 @@ static int ublk_ch_mmap(struct file *filp, struct v= m_area_struct *vma) { struct ublk_device *ub =3D filp->private_data; size_t sz =3D vma->vm_end - vma->vm_start; unsigned max_sz =3D ublk_max_cmd_buf_size(); unsigned long pfn, end, phys_off =3D vma->vm_pgoff << PAGE_SHIFT; - int q_id, ret =3D 0; + int ret =3D 0; + u16 q_id; =20 spin_lock(&ub->lock); if (!ub->mm) ub->mm =3D current->mm; if (current->mm !=3D ub->mm) @@ -2717,11 +2717,11 @@ static void ublk_abort_batch_queue(struct ublk_devi= ce *ub, * So no one can hold our request IO reference any more, simply ignore the * reference, and complete the request immediately */ static void ublk_abort_queue(struct ublk_device *ub, struct ublk_queue *ub= q) { - int i; + u16 i; =20 for (i =3D 0; i < ubq->q_depth; i++) { struct ublk_io *io =3D &ubq->ios[i]; =20 if (io->flags & UBLK_IO_FLAG_OWNED_BY_SRV) @@ -2760,11 +2760,11 @@ static void ublk_start_cancel(struct ublk_device *u= b) out: mutex_unlock(&ub->cancel_mutex); ublk_put_disk(disk); } =20 -static void ublk_cancel_cmd(struct ublk_queue *ubq, unsigned tag, +static void ublk_cancel_cmd(struct ublk_queue *ubq, u16 tag, unsigned int issue_flags) { struct ublk_io *io =3D &ubq->ios[tag]; struct ublk_device *ub =3D ubq->dev; struct io_uring_cmd *cmd =3D NULL; @@ -2911,11 +2911,11 @@ static inline bool ublk_dev_ready(const struct ublk= _device *ub) return ub->nr_queue_ready =3D=3D ub->dev_info.nr_hw_queues; } =20 static void ublk_cancel_queue(struct ublk_queue *ubq) { - int i; + u16 i; =20 if (ublk_support_batch_io(ubq)) { ublk_batch_cancel_queue(ubq); return; } @@ -2925,11 +2925,11 @@ static void ublk_cancel_queue(struct ublk_queue *ub= q) } =20 /* Cancel all pending commands, must be called after del_gendisk() returns= */ static void ublk_cancel_dev(struct ublk_device *ub) { - int i; + u16 i; =20 for (i =3D 0; i < ub->dev_info.nr_hw_queues; i++) ublk_cancel_queue(ublk_get_queue(ub, i)); } =20 @@ -2959,11 +2959,11 @@ static void ublk_wait_tagset_rqs_idle(struct ublk_d= evice *ub) } } =20 static void ublk_force_abort_dev(struct ublk_device *ub) { - int i; + u16 i; =20 pr_devel("%s: force abort ub: dev_id %d state %s\n", __func__, ub->dev_info.dev_id, ub->dev_info.state =3D=3D UBLK_S_DEV_LIVE ? "LIVE" : "QUIESCED"); @@ -3156,11 +3156,11 @@ ublk_config_io_buf(const struct ublk_device *ub, st= ruct ublk_io *io, return 0; } =20 static inline void ublk_prep_cancel(struct io_uring_cmd *cmd, unsigned int issue_flags, - struct ublk_queue *ubq, unsigned int tag) + struct ublk_queue *ubq, u16 tag) { struct ublk_uring_cmd_pdu *pdu =3D ublk_get_uring_cmd_pdu(cmd); =20 /* * Safe to refer to @ubq since ublk_queue won't be died until its @@ -3960,12 +3960,12 @@ static int ublk_handle_non_batch_cmd(struct io_urin= g_cmd *cmd, unsigned int issue_flags) { const struct ublksrv_io_cmd *ub_cmd =3D io_uring_sqe_cmd(cmd->sqe, struct ublksrv_io_cmd); struct ublk_device *ub =3D cmd->file->private_data; - unsigned tag =3D READ_ONCE(ub_cmd->tag); - unsigned q_id =3D READ_ONCE(ub_cmd->q_id); + u16 tag =3D READ_ONCE(ub_cmd->tag); + u16 q_id =3D READ_ONCE(ub_cmd->q_id); unsigned index =3D READ_ONCE(ub_cmd->addr); struct ublk_queue *ubq; struct ublk_io *io; =20 if (cmd->cmd_op =3D=3D UBLK_U_IO_UNREGISTER_IO_BUF) @@ -4167,11 +4167,12 @@ static const struct file_operations ublk_ch_batch_i= o_fops =3D { .mmap =3D ublk_ch_mmap, }; =20 static void __ublk_deinit_queue(struct ublk_device *ub, struct ublk_queue = *ubq) { - int size, i; + int size; + u16 i; =20 size =3D ublk_queue_cmd_buf_size(ub); =20 for (i =3D 0; i < ubq->q_depth; i++) { struct ublk_io *io =3D &ubq->ios[i]; @@ -4188,22 +4189,22 @@ static void __ublk_deinit_queue(struct ublk_device = *ub, struct ublk_queue *ubq) ublk_io_evts_deinit(ubq); =20 kvfree(ubq); } =20 -static void ublk_deinit_queue(struct ublk_device *ub, int q_id) +static void ublk_deinit_queue(struct ublk_device *ub, u16 q_id) { struct ublk_queue *ubq =3D ub->queues[q_id]; =20 if (!ubq) return; =20 __ublk_deinit_queue(ub, ubq); ub->queues[q_id] =3D NULL; } =20 -static int ublk_get_queue_numa_node(struct ublk_device *ub, int q_id) +static int ublk_get_queue_numa_node(struct ublk_device *ub, u16 q_id) { unsigned int cpu; =20 /* Find first CPU mapped to this queue */ for_each_possible_cpu(cpu) { @@ -4212,18 +4213,19 @@ static int ublk_get_queue_numa_node(struct ublk_dev= ice *ub, int q_id) } =20 return NUMA_NO_NODE; } =20 -static int ublk_init_queue(struct ublk_device *ub, int q_id) +static int ublk_init_queue(struct ublk_device *ub, u16 q_id) { - int depth =3D ub->dev_info.queue_depth; + u16 depth =3D ub->dev_info.queue_depth; gfp_t gfp_flags =3D GFP_KERNEL | __GFP_ZERO; struct ublk_queue *ubq; struct page *page; int numa_node; - int size, i, ret; + int size, ret; + u16 i; =20 /* Determine NUMA node based on queue's CPU affinity */ numa_node =3D ublk_get_queue_numa_node(ub, q_id); =20 /* Allocate queue structure on local NUMA node */ @@ -4264,19 +4266,20 @@ static int ublk_init_queue(struct ublk_device *ub, = int q_id) return ret; } =20 static void ublk_deinit_queues(struct ublk_device *ub) { - int i; + u16 i; =20 for (i =3D 0; i < ub->dev_info.nr_hw_queues; i++) ublk_deinit_queue(ub, i); } =20 static int ublk_init_queues(struct ublk_device *ub) { - int i, ret; + int ret; + u16 i; =20 for (i =3D 0; i < ub->dev_info.nr_hw_queues; i++) { ret =3D ublk_init_queue(ub, i); if (ret) goto fail; @@ -5179,11 +5182,11 @@ static int ublk_ctrl_set_size(struct ublk_device *u= b, const struct ublksrv_ctrl_ return ret; } =20 struct count_busy { const struct ublk_queue *ubq; - unsigned int nr_busy; + u16 nr_busy; }; =20 static bool ublk_count_busy_req(struct request *rq, void *data) { struct count_busy *idle =3D data; @@ -5217,12 +5220,11 @@ static int ublk_wait_for_idle_io(struct ublk_device= *ub, */ if (ublk_dev_support_batch_io(ub)) return 0; =20 while (elapsed < timeout_ms && !signal_pending(current)) { - unsigned int queues_cancelable =3D 0; - int i; + u16 i, queues_cancelable =3D 0; =20 for (i =3D 0; i < ub->dev_info.nr_hw_queues; i++) { struct ublk_queue *ubq =3D ublk_get_queue(ub, i); =20 queues_cancelable +=3D !!ubq_has_idle_io(ubq); --=20 2.54.0 From nobody Fri Oct 2 07:45:31 2026 Received: from mail-qt1-f226.google.com (mail-qt1-f226.google.com [209.85.160.226]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E1B083B71C6 for ; Mon, 3 Aug 2026 21:14:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.226 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785791689; cv=none; b=n1AkkdJOsktBvhlRU/7+GHtYiRFLHVqROfDEorvagc5LyAdMS05Pbu8KkyJ7+ERRtxZSaizsWZWGQKzAYFwkF32kcZj8WTCP2hjhO0O+HVPXKppbN2X1/BMs34CM8yxHUdy3NCvSneqv9CJPUEPYpzdBUZrmlFcQu1D7081cvB4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785791689; c=relaxed/simple; bh=BT5boy5Fu+AFD1SW3WqZ0I9VD3CFZAoEYdiqVc8OFzs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=iJvUqvkpLonbgq6WxxwzrekA0zfQOgqapV17L8E90FC4SIrrd+5Sc1lD17V6Bbbs1ZkrkJRcJh/4RdwCTp+uMHIY5Wsq82UYER2z+dkMNavxlfr7cLINxJuvXU6mu8tChUQMKzs4unVU0GG37PQQ94ZBtW4k6pNxZymvY6yGEmI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=purestorage.com; spf=pass smtp.mailfrom=purestorage.com; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b=ISZeIZV7; arc=none smtp.client-ip=209.85.160.226 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=purestorage.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=purestorage.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b="ISZeIZV7" Received: by mail-qt1-f226.google.com with SMTP id d75a77b69052e-51c12e68069so5985791cf.3 for ; Mon, 03 Aug 2026 14:14:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1785791685; x=1786396485; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=dRHLyDMl1kx+dELOE0vsaooFjIJVjUh7ESGTg3U4394=; b=ISZeIZV7rYva5+HsxTgGnfbE9g9qJO9AeBOoTUALEH6JOujkmCni370cc8qx5h3XKR 4/TYZXLPwkyBPAO1tKph49/mP4KUez2I24Qkh7nXl0VtqgCaMjjQS86JwMY2CjzJ5FVc JUjFzkvi3IFoD78a++VEv7yiCxsREfQAtonyB2SLPPi07fEqmcJFkjaYqRWgIRNiU1X9 HAjpU8xSwdak6bdW9s1sAo4nIKQLikRepifyWJKCdTMDmcQ1m8R1JmIMZEuCpZkiGLLp xToA8q9i2dpNYhMAXeiURKf83kgej5zFXbAaE0rU2uypt5O37E3qgmQeILX3kuztQlCR OEvQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785791685; x=1786396485; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=dRHLyDMl1kx+dELOE0vsaooFjIJVjUh7ESGTg3U4394=; b=adzvHBI6alv2B+xAlJiyItdBilbF5I+d09xdsCnqJ1Jx/CqEGjyJFIWllQ34yIDuXo nql14cojzfMiw4jsoGvsewbQNU/C/6Bonlu5E4Us2h2kr+z6kkeUHZJVczRffADJX/SQ 4+ha5TfA7wSqIRr+ScGCNWiOYZMw9eQ3htntwHBJ0yaddSqSPGbR6/y407P1kqNmhF5o 8D7uYg9xbE9GYZZQht03CdRItR29+BFDUexZhau9aIN1cClWGUWm16gFGx3xD2mZ+cTk WQTS6+DCU7+4kGHTB8eXgp1WZc05mgKEMibsLwWWm6n+2pA+6bQNro9X6QsOWZTrF7jb xsZQ== X-Forwarded-Encrypted: i=1; AHgh+RqAamLQ89Hr/0jFE7DiY3vM1fX3WOGEynxfa9661BfMqSTLB93sfuLX8egWyOF/GIivdW8MphjVi5gv3aE=@vger.kernel.org X-Gm-Message-State: AOJu0YxhgStpT6tTGxVVGTRKrMmVgtX3cE03dynMTQ2JBAtutPeRBrla BuvJ9nBhSqy3LaBhxuBUkB+7weoJdcXa2g1Q/kmZzTjGIoCTV58L0ns0IldYy50ON3UdbdTlbki KGvlU+JsG9DaAri2aQ5DpIOUydJ8Vc+tqFx9N66JAsJOWfjUhk761 X-Gm-Gg: AR+sD11iEKPQPc4lHoCmm3KUdocO45FxHGl9xCLwD4CF+fsoDUjytAsZCuIrxUfacDf TxiycCBAGhN74qIUVCaxCmLmDbBWYN0pr9WSHHfDiCudRDFYDJDSRXG94JylZhla9DCcASKDiQA U2oi5DVmBjfMoZQPBGUvVG8fVAjVjgOLvD+mOfv5A9nGaM+t+m6WMskd+5unlnsc6WcSTjpd5oY EiKqgqHC4xX3k1Z4e7CYth389yQLumfr+hqvLyaDGZnOBWsouJoyxdvFMHp/EBE7Wv3r15mraL3 dKOURM2mUGpjJygORhpYcW8SfTy9yVW7iDS39KEy15KUfzwl+unD4bfwNZ//0cirVk86jR0xR1n cEr9twik3zoHGbLGP9A== X-Received: by 2002:a05:6214:4289:b0:907:83be:27d with SMTP id 6a1803df08f44-90849617816mr198273146d6.3.1785791685433; Mon, 03 Aug 2026 14:14:45 -0700 (PDT) Received: from c7-smtp-2026.dev.purestorage.com ([2620:125:9017:12:36:3:6:0]) by smtp-relay.gmail.com with ESMTPS id 6a1803df08f44-9085703f7a4sm3913306d6.12.2026.08.03.14.14.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Aug 2026 14:14:45 -0700 (PDT) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.112.12.104]) by c7-smtp-2026.dev.purestorage.com (Postfix) with ESMTP id CF73643524; Mon, 3 Aug 2026 15:14:44 -0600 (MDT) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id CC856E4041D; Mon, 3 Aug 2026 15:14:44 -0600 (MDT) From: Caleb Sander Mateos To: Ming Lei , Jens Axboe , Shuah Khan Cc: linux-block@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Caleb Sander Mateos Subject: [PATCH v2 2/8] ublk: remove struct ublk_zoned_report_desc's operation field Date: Mon, 3 Aug 2026 15:14:34 -0600 Message-ID: <20260803211441.2538144-3-csander@purestorage.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260803211441.2538144-1-csander@purestorage.com> References: <20260803211441.2538144-1-csander@purestorage.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" struct ublk_zoned_report_desc's operation field is only ever set to UBLK_IO_OP_REPORT_ZONES, so remove it. Replace its one load with the constant. Signed-off-by: Caleb Sander Mateos Reviewed-by: Ming Lei --- drivers/block/ublk_drv.c | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c index da88c8042db6..d364a5d0ebc2 100644 --- a/drivers/block/ublk_drv.c +++ b/drivers/block/ublk_drv.c @@ -526,11 +526,10 @@ static void ublk_init_iod(struct ublk_queue *ubq, str= uct request *req, =20 #ifdef CONFIG_BLK_DEV_ZONED =20 struct ublk_zoned_report_desc { __u64 sector; - __u32 operation; __u32 nr_zones; }; =20 static DEFINE_XARRAY(ublk_zoned_report_descs); =20 @@ -656,11 +655,10 @@ static int ublk_report_zones(struct gendisk *disk, se= ctor_t sector, if (IS_ERR(req)) { ret =3D PTR_ERR(req); goto out; } =20 - desc.operation =3D UBLK_IO_OP_REPORT_ZONES; desc.sector =3D sector; desc.nr_zones =3D zones_in_request; ret =3D ublk_zoned_insert_report_desc(req, &desc); if (ret) goto free_req; @@ -729,19 +727,13 @@ static blk_status_t ublk_setup_iod_zoned(struct ublk_= queue *ubq, break; case REQ_OP_DRV_IN: desc =3D ublk_zoned_get_report_desc(req); if (!desc) return BLK_STS_IOERR; - ublk_op =3D desc->operation; - switch (ublk_op) { - case UBLK_IO_OP_REPORT_ZONES: - ublk_init_iod(ubq, req, ublk_op, desc->nr_zones, - desc->sector); - return BLK_STS_OK; - default: - return BLK_STS_IOERR; - } + ublk_init_iod(ubq, req, UBLK_IO_OP_REPORT_ZONES, desc->nr_zones, + desc->sector); + return BLK_STS_OK; case REQ_OP_DRV_OUT: /* We do not support drv_out */ return BLK_STS_NOTSUPP; default: return BLK_STS_IOERR; --=20 2.54.0 From nobody Fri Oct 2 07:45:31 2026 Received: from mail-pf1-f227.google.com (mail-pf1-f227.google.com [209.85.210.227]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D193F3B71A4 for ; Mon, 3 Aug 2026 21:14:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.227 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785791690; cv=none; b=AE+JYzH8I4hTf/gUyb4Nvz//5srfhHvMXnBWeI3K3UDPTGeitFecil3KVvbn1H/mAbBPXKN7crFrkuYA38gEsa5LPTKYuUYlehumw+dMVQ0AIt+8UvRPXL3CMfClJczzetTzKBM4pmM7tePRJyO6sgOnz2qaVhj1DOFvRd2plTo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785791690; c=relaxed/simple; bh=FZL9v2s6V8OT5jqjZ1eRmbGaCvw5y2UKD5VJGsOygJU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=AaheQrwMjLuYMvsfmsfSghUN5Lbx3BGglWhoYGFc7lNLvo/YSvxniahLgt8kCExafVg/4SBhcnx6bKymdBwn4lOYtBYEg9t2cDqLd7VXlNMXoyLrNEizdKYNSZU6PhtAU0yk3ZrhaN07pK4PXn8CkMZIgr+ZEuLst9JXJPC80Pk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=purestorage.com; spf=pass smtp.mailfrom=purestorage.com; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b=Zh+Kgzcq; arc=none smtp.client-ip=209.85.210.227 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=purestorage.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=purestorage.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b="Zh+Kgzcq" Received: by mail-pf1-f227.google.com with SMTP id d2e1a72fcca58-8486c9a946bso737502b3a.1 for ; Mon, 03 Aug 2026 14:14:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1785791686; x=1786396486; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=n/+0NVp90japE4LHVXnwsuexjdaVJbd+UcY0JpTVc78=; b=Zh+KgzcqsjZ9fYjx0VQ/MVPSZonJ6O/NVeSOSGyYNcIgONdfM1jR4b1EUZDTvtzo7T Ax+4iR7LWDUZSAbvhIILk/2IgnDJoIC/qUnFX4WAXmOIEdc5z0Pk/IV2KsRrz4pS4eky +1goBgeqks8KDihQVW0iq2F47kwXeZVJA6jmZngrZ6KcsUW5oVNu6GfK+/fhHfzbRncd FN7f3xV7w9Plyh5AidCfd906R2vvz9asRnRT+4zOL/HdjRQ8iu4iUsuA0zORX+mQOqiF PJyCit8DlApqogldVSmzQemURP11V+q90CutXFoUOxH4lK2mwqa5MmDuyVJdQ9vJecns zuOA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785791686; x=1786396486; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=n/+0NVp90japE4LHVXnwsuexjdaVJbd+UcY0JpTVc78=; b=RptoSSTJkdv7UEphsXhc6JfwzNF05srV36Q3eDUNfCszQeXM61uzzNzssRbQ+vSfw4 j9ZnLiNwnTsPfBQAvqGFJePYM9D/7Nhwppc28r6i5LWCK14RhfXJpiZVlOEkj0yd0Mqg C/1tenZVHtHANZASsG9R8L3G28Asj190aQ0mMtxDXNOXlPjBmABmUw1ssoYfmb+Q9UOV LR8qllKCi3bVkFehsv0YHXiy7j+6Y6KFv8Ijf7dUzZaVFlwjqzlwOQuAcqWW9MxUX9ii 7D7O5Al+V2M6yAF1SQeobigw6ndfovz2FO2utkrQN1WXMwfNbTDPOuw/wPjcbJ0yga1h cTTQ== X-Forwarded-Encrypted: i=1; AHgh+RppiRCLcND0LO6QDkb5GNSEHE2P3XlZrbJNjtUTEfFYJp7drD9UoqWXansNwqNc3OGEu8bMCMSy88oPhk0=@vger.kernel.org X-Gm-Message-State: AOJu0Ywnsf1xoxLHYdXoXs/GRfe8a56nIHKBsJfxyeTP+dxM7quUaDHU p8InCxE1iz0gyt7EvVoFSAstHD16c6AZFONmxC+hvpdNW10V8nD0MH64ioY4iQScyHec81D3dme dP6O8frX3yaZYrmz04fb194Dwb83le+n/Dhh3lEcmbLfGNM158154 X-Gm-Gg: AR+sD11hjnoYSYadGd6JwAGHslYgINDX47PdeIH4Afxbe2UYsfCFUTcLUkfCmkcIDVd xlR7Bvt84QUhT6zSfCEwRpfOIe6rvFCbEGAuVhOI++dDxY/OJSjVeh/W2JVDWjzrg0DKMZ6iof6 5XwK/Uh7Fpd1Ua/TYZpLdNePo8ToNuoKqTC8OtZdE4w4FOix1a3wFrhcrqI5AyR9tJZKRJQ983K DuIUmi+ZOn7Lfb60hGzMAfgvODfC7dXogMnZksu8b9Y6T/t1zYNInFSJQC4KtVFgfa4VbPxG+sB isEuizVEBlA708vmHd+xWIbNX6b1I+qSsy7iELOUejCcauN7EbTWm6lneLaHLK+zCICBXDb4DN8 F9Huqb9A69WOZzaUWdw== X-Received: by 2002:a17:903:38c7:b0:2c9:8287:fd0d with SMTP id d9443c01a7336-2d052438c91mr158785315ad.3.1785791685662; Mon, 03 Aug 2026 14:14:45 -0700 (PDT) Received: from c7-smtp-2026.dev.purestorage.com ([2620:125:9017:12:36:3:6:0]) by smtp-relay.gmail.com with ESMTPS id d9443c01a7336-2d04b16e439sm11538945ad.47.2026.08.03.14.14.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Aug 2026 14:14:45 -0700 (PDT) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.112.12.104]) by c7-smtp-2026.dev.purestorage.com (Postfix) with ESMTP id 07E1F43663; Mon, 3 Aug 2026 15:14:45 -0600 (MDT) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 0567DE4041D; Mon, 3 Aug 2026 15:14:45 -0600 (MDT) From: Caleb Sander Mateos To: Ming Lei , Jens Axboe , Shuah Khan Cc: linux-block@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Caleb Sander Mateos Subject: [PATCH v2 3/8] ublk: split request validation from io_desc init Date: Mon, 3 Aug 2026 15:14:35 -0600 Message-ID: <20260803211441.2538144-4-csander@purestorage.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260803211441.2538144-1-csander@purestorage.com> References: <20260803211441.2538144-1-csander@purestorage.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" In preparation for moving the struct ublksrv_io_desc initialization from the thread submitting ublk requests to the daemon thread receiving them, split the fallible part of ublk_setup_iod{,_zoned}() into new helper ublk_validate_req{,_zoned}(). Only ublk_setup_iod{,_zoned}() accesses the io_desc and cannot error out. Return a bool value from ublk_validate_req{,_zoned}() as the existing error code ublk_setup_iod{,_zoned}() returns is only checked against BLK_STS_OK. Signed-off-by: Caleb Sander Mateos Reviewed-by: Ming Lei --- drivers/block/ublk_drv.c | 70 +++++++++++++++++++++++++++------------- 1 file changed, 48 insertions(+), 22 deletions(-) diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c index d364a5d0ebc2..7f0549238d76 100644 --- a/drivers/block/ublk_drv.c +++ b/drivers/block/ublk_drv.c @@ -698,12 +698,28 @@ static int ublk_report_zones(struct gendisk *disk, se= ctor_t sector, out: kvfree(buffer); return ret; } =20 -static blk_status_t ublk_setup_iod_zoned(struct ublk_queue *ubq, - struct request *req) +static bool ublk_validate_req_zoned(const struct request *req) +{ + switch (req_op(req)) { + case REQ_OP_ZONE_OPEN: + case REQ_OP_ZONE_CLOSE: + case REQ_OP_ZONE_FINISH: + case REQ_OP_ZONE_RESET: + case REQ_OP_ZONE_APPEND: + case REQ_OP_ZONE_RESET_ALL: + return true; + case REQ_OP_DRV_IN: + return !!ublk_zoned_get_report_desc(req); + default: + return false; + } +} + +static void ublk_setup_iod_zoned(struct ublk_queue *ubq, struct request *r= eq) { struct ublk_zoned_report_desc *desc; u32 ublk_op; =20 switch (req_op(req)) { @@ -725,24 +741,19 @@ static blk_status_t ublk_setup_iod_zoned(struct ublk_= queue *ubq, case REQ_OP_ZONE_RESET_ALL: ublk_op =3D UBLK_IO_OP_ZONE_RESET_ALL; break; case REQ_OP_DRV_IN: desc =3D ublk_zoned_get_report_desc(req); - if (!desc) - return BLK_STS_IOERR; ublk_init_iod(ubq, req, UBLK_IO_OP_REPORT_ZONES, desc->nr_zones, desc->sector); - return BLK_STS_OK; - case REQ_OP_DRV_OUT: - /* We do not support drv_out */ - return BLK_STS_NOTSUPP; + return; default: - return BLK_STS_IOERR; + WARN_ON_ONCE(1); + return; } =20 ublk_init_iod(ubq, req, ublk_op, blk_rq_sectors(req), blk_rq_pos(req)); - return BLK_STS_OK; } =20 #else =20 #define ublk_report_zones (NULL) @@ -759,14 +770,18 @@ static void ublk_dev_param_zoned_apply(struct ublk_de= vice *ub) static int ublk_revalidate_disk_zones(struct ublk_device *ub) { return 0; } =20 -static blk_status_t ublk_setup_iod_zoned(struct ublk_queue *ubq, - struct request *req) +static bool ublk_validate_req_zoned(const struct request *req) { - return BLK_STS_NOTSUPP; + return false; +} + +static void ublk_setup_iod_zoned(struct ublk_queue *ubq, struct request *r= eq) +{ + WARN_ON_ONCE(1); } =20 #endif =20 static inline void __ublk_complete_rq(struct request *req, struct ublk_io = *io, @@ -1495,11 +1510,26 @@ static unsigned int ublk_unmap_io(bool need_map, return ublk_copy_user_pages(req, 0, &iter, dir); } return rq_bytes; } =20 -static blk_status_t ublk_setup_iod(struct ublk_queue *ubq, struct request = *req) +static bool ublk_validate_req(const struct ublk_queue *ubq, + const struct request *req) +{ + switch (req_op(req)) { + case REQ_OP_READ: + case REQ_OP_WRITE: + case REQ_OP_FLUSH: + case REQ_OP_DISCARD: + case REQ_OP_WRITE_ZEROES: + return true; + default: + return ublk_queue_is_zoned(ubq) && ublk_validate_req_zoned(req); + } +} + +static void ublk_setup_iod(struct ublk_queue *ubq, struct request *req) { u32 ublk_op; =20 switch (req_op(req)) { case REQ_OP_READ: @@ -1516,17 +1546,15 @@ static blk_status_t ublk_setup_iod(struct ublk_queu= e *ubq, struct request *req) break; case REQ_OP_WRITE_ZEROES: ublk_op =3D UBLK_IO_OP_WRITE_ZEROES; break; default: - if (ublk_queue_is_zoned(ubq)) - return ublk_setup_iod_zoned(ubq, req); - return BLK_STS_IOERR; + ublk_setup_iod_zoned(ubq, req); + return; } =20 ublk_init_iod(ubq, req, ublk_op, blk_rq_sectors(req), blk_rq_pos(req)); - return BLK_STS_OK; } =20 static inline struct ublk_uring_cmd_pdu *ublk_get_uring_cmd_pdu( struct io_uring_cmd *ioucmd) { @@ -2136,12 +2164,10 @@ static enum blk_eh_timer_return ublk_timeout(struct= request *rq) } =20 static blk_status_t ublk_prep_req(struct ublk_queue *ubq, struct request *= rq, bool check_cancel) { - blk_status_t res; - if (unlikely(READ_ONCE(ubq->fail_io))) return BLK_STS_TARGET; =20 /* With recovery feature enabled, force_abort is set in * ublk_stop_dev() before calling del_gendisk(). We have to @@ -2158,14 +2184,14 @@ static blk_status_t ublk_prep_req(struct ublk_queue= *ubq, struct request *rq, =20 if (check_cancel && unlikely(ubq->canceling)) return BLK_STS_IOERR; =20 /* fill iod to slot in io cmd buffer */ - res =3D ublk_setup_iod(ubq, rq); - if (unlikely(res !=3D BLK_STS_OK)) + if (unlikely(!ublk_validate_req(ubq, rq))) return BLK_STS_IOERR; =20 + ublk_setup_iod(ubq, rq); blk_mq_start_request(rq); return BLK_STS_OK; } =20 /* --=20 2.54.0 From nobody Fri Oct 2 07:45:31 2026 Received: from mail-pg1-f227.google.com (mail-pg1-f227.google.com [209.85.215.227]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F2A3C3B7B72 for ; Mon, 3 Aug 2026 21:14:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.227 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785791689; cv=none; b=pg+LxfLMKuaRzLP0ymgxb24GIJvWuby7fRS8Uy+nLJw1O4fhn0HtDtUNemr7vWDzq6zPoAruRn6zLBvFz8vGozhfi8YmiBhflNZxB2W+6bCnqODLmcQnxuZc1vAmjQ+g1QEYTE9tP9Kr3R4/wsnQS3tn1YDM4yI61hHgVEHchq8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785791689; c=relaxed/simple; bh=UpmEnx3awHseJWWLI2g6v8qVQIy9TviUGqb9Opoaoo0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jheW2Q58aI2H4kocd+3hOBDZxSBGgwW01zzU+q7CdD2UvZdEJT1V9bcAbgmIzTOMzSQG/v3hIMhU//rCuFz5HccxLfrdEWWQ7tHM7kDZ3v/tWVpSGIrm3ZcI/xj8SzTkFGqGR5zqLz5Jl1idzG5p27BX3583iXrxtPGez65DQjs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=purestorage.com; spf=pass smtp.mailfrom=purestorage.com; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b=AiOY6D5Z; arc=none smtp.client-ip=209.85.215.227 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=purestorage.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=purestorage.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b="AiOY6D5Z" Received: by mail-pg1-f227.google.com with SMTP id 41be03b00d2f7-ca6a6181273so235093a12.1 for ; Mon, 03 Aug 2026 14:14:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1785791686; x=1786396486; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=aTIvj8Z/s40cHu4vpiMgFm0KJRfpdgU7PpP6Ih2zxbE=; b=AiOY6D5Z9rB4MRoPETkGxa7yeSC0O9KfWqdxj1WuCngzlLPBFHYuiwhMwH9ubujtdI DZguM8d0X34Wn0pTjzIaBHxlLzAKHgFihOKheyfpylAUDehGGZySl6/frA7a/g5gCPFU YuPqiciOlh7TYCKFJgUNgqqjznsqeMPmIqsa8JyS+TDgZ3nl4iy8tY70KZoYV1PXFEqS CgHiCjA3ge6PQycGOIC9GuU1xvuEr16IfGdCA72JZFC5ZpY5FCkbUlW4it6g1g+K6+NJ 5R9CS0EWr/kmHxVrED6aItEson3z2AqjXr85Fx9nwN3i8oH1XamvExqcIsvlH5GZku6x cmkw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785791686; x=1786396486; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=aTIvj8Z/s40cHu4vpiMgFm0KJRfpdgU7PpP6Ih2zxbE=; b=HIjs92hMKfgCAfpXfgvaweA5stqdn6diX3112A09ttFRHCB2u4P0Rw34CfC90y39d+ SuosvzXRbEiI/QEizjjRJsUq0KNUrVzfgQX/ddLXNoptQc8PRvU8jSkmIgJgDV4FJw1W IGvaKS78R2WuhsCVlHqZR1TnywCylh/2xNXzny1h+pl92mNQ1xTQyMehDv3rmnuocr3N QlgemORgRUmfqLVrUSh3gI66NSZdw1oGzHpU64dIzkn9RcNKVIIGRGlXVM8apTMIVDcT htYeoxn6RF+KbdU9WQEEZ8TESNpezpcGljEv7IFi6V90kLJDVuUdv+jJcnNfr/+J1Z5s mF3w== X-Forwarded-Encrypted: i=1; AHgh+RqVV6Ch7Rzx+c9kjCjVKIJ6tMkyIp2YzkT76l4k2aU4ZXU5NYf6dETCaESRJvFpuEYcdhN+UDWd0H1CpdY=@vger.kernel.org X-Gm-Message-State: AOJu0YzuLcMivEP8oK5/Lb53LPoUwNMfvZHH/yOAT1N7rncMl0A8klF7 yy7YyYLxN3+J1q3An0PeDbpzGJbQeG3ingi2h8wEcDYBhUz4Wi/rjHze76Y6xA05jvsQu/id1si rOWwamq6zlHAAysuV+zOrK6iac6jY+9xMKv7srkb8znxnDdt76AsN X-Gm-Gg: AR+sD13Djn1ih7NolbB3+NUj/Xx/MYTAm5lfkJkExobVBuDYoROD04MGDXHz3QBdoqu l2MAWx8OyZ2Q7PZyh0b+Ee8OxetZ8c3eVif7FGVOV1kN3aCE57x1h5T5I07CwR56i9AM+iP80N/ scat4XjyvwIMpvEByYqJF0avUQp3zl6mi3nb94bE8K46UmjylhngURSlHYK9aqX0ysDttyOBE50 7LlJr7kjjbviJb/hubycb/sayQUYV/3ALRmKcfeLzbscjqZ5nfRWG6aaC2NN4dUT1KXlEj9GPVZ Raebei8JlxRZTO1xM9lwmEykWkebtON8fnnEwEFV+Ue+6TD6n2mStbNRR8NHmRrxgIjhLms4r7F FhhBikQW/mR7/xZS+kA== X-Received: by 2002:a05:6a21:501:b0:3bf:99ea:aeb2 with SMTP id adf61e73a8af0-3c92a900f91mr17076379637.4.1785791685907; Mon, 03 Aug 2026 14:14:45 -0700 (PDT) Received: from c7-smtp-2026.dev.purestorage.com ([2620:125:9017:12:36:3:6:0]) by smtp-relay.gmail.com with ESMTPS id 41be03b00d2f7-cbe39643987sm856581a12.1.2026.08.03.14.14.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Aug 2026 14:14:45 -0700 (PDT) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (bond0.slc5-n17m28-k8s.dev.purestorage.com [IPv6:2620:125:9025:20::a31:41f]) by c7-smtp-2026.dev.purestorage.com (Postfix) with ESMTP id 3561A436B7; Mon, 3 Aug 2026 15:14:45 -0600 (MDT) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 3213DE4041D; Mon, 3 Aug 2026 15:14:45 -0600 (MDT) From: Caleb Sander Mateos To: Ming Lei , Jens Axboe , Shuah Khan Cc: linux-block@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Caleb Sander Mateos Subject: [PATCH v2 4/8] ublk: initialize io_desc on daemon task Date: Mon, 3 Aug 2026 15:14:36 -0600 Message-ID: <20260803211441.2538144-5-csander@purestorage.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260803211441.2538144-1-csander@purestorage.com> References: <20260803211441.2538144-1-csander@purestorage.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" ublk_setup_iod() is currently called to populate struct ublksrv_io_desc on the thread submitting I/O to a ublk device. However, only the ublk server threads read the io_descs. This basically guarantees a cache miss on both threads for each ublk I/O. There's really no need to initialize the io_descs on the submitting thread. Move the ublk_setup_iod() call to ublk_dispatch_req() (for non-UBLK_F_BATCH_IO) and __ublk_batch_prep_dispatch() (for UBLK_F_BATCH_IO), which runs on the ublk server daemon thread before dispatching the I/O to userspace. Signed-off-by: Caleb Sander Mateos Reviewed-by: Ming Lei --- drivers/block/ublk_drv.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c index 7f0549238d76..291461e1b236 100644 --- a/drivers/block/ublk_drv.c +++ b/drivers/block/ublk_drv.c @@ -1798,10 +1798,11 @@ static void ublk_dispatch_req(struct ublk_queue *ub= q, struct request *req) { unsigned int issue_flags =3D IO_URING_CMD_TASK_WORK_ISSUE_FLAGS; u16 tag =3D req->tag; struct ublk_io *io =3D &ubq->ios[tag]; =20 + ublk_setup_iod(ubq, req); pr_devel("%s: complete: qid %d tag %d io_flags %x addr %llx\n", __func__, ubq->q_id, req->tag, io->flags, ublk_get_iod(ubq, req->tag)->addr); =20 /* @@ -1851,10 +1852,11 @@ static bool __ublk_batch_prep_dispatch(struct ublk_= queue *ubq, struct ublk_io *io =3D &ubq->ios[tag]; struct request *req =3D blk_mq_tag_to_rq(ub->tag_set.tags[ubq->q_id], tag= ); enum auto_buf_reg_res res =3D AUTO_BUF_REG_FALLBACK; struct io_uring_cmd *cmd =3D data->cmd; =20 + ublk_setup_iod(ubq, req); if (!ublk_start_io(ubq, req, io)) return false; =20 if (ublk_support_auto_buf_reg(ubq) && blk_rq_has_data(req)) { res =3D ublk_auto_buf_register(ubq, req, io, cmd, @@ -2187,11 +2189,10 @@ static blk_status_t ublk_prep_req(struct ublk_queue= *ubq, struct request *rq, =20 /* fill iod to slot in io cmd buffer */ if (unlikely(!ublk_validate_req(ubq, rq))) return BLK_STS_IOERR; =20 - ublk_setup_iod(ubq, rq); blk_mq_start_request(rq); return BLK_STS_OK; } =20 /* --=20 2.54.0 From nobody Fri Oct 2 07:45:31 2026 Received: from mail-yx1-f100.google.com (mail-yx1-f100.google.com [74.125.224.100]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DFC15427F8D for ; Mon, 3 Aug 2026 21:14:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.224.100 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785791691; cv=none; b=FXw4J460dy6TLNsUr9k+dwqwSY4AllQqt3qJDUnX5Edq9uBCymMDffNelO6O/FG/kXG4dNDvEyBDQw18j43o//PID1Icw4XpJ2+jUyrkErkIgYFMAbSeqCjhs8CKJH3DcgAeN1WA9kOJpwpP981uhFyC+FAEhj55Hw6iq2IGBMU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785791691; c=relaxed/simple; bh=1X0HeOzb3YZwsssSB/FHvZUDgTOczA79yfrgodBT3l0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cdtJYg+vx6zkQdEtVryuKRXYVNd/fUhRjiN9QfbCL8R8URVwD+t+ne6nkz1Gra0Hpsebk2mLILVjA1ym8CRelwDiruSJjJudB2k2yXn6OGu4rvdfH4LgknLVXfh8s6x7rlHS6i2Na3Gm6YF+Rs6nY+7zoS0l3FpaBr6lPAEi4hs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=purestorage.com; spf=pass smtp.mailfrom=purestorage.com; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b=fmjqFU/c; arc=none smtp.client-ip=74.125.224.100 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=purestorage.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=purestorage.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b="fmjqFU/c" Received: by mail-yx1-f100.google.com with SMTP id 956f58d0204a3-664b1bab782so506106d50.1 for ; Mon, 03 Aug 2026 14:14:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1785791686; x=1786396486; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=Z9JxpJkklZFmCfZG7kvSXRiUJwuxf74cgBgaZj0atTg=; b=fmjqFU/cZxpuza1Emuv2boJXtnXomz5sgIkdAC4qaJIt0JoN31dHYo26Z8DyBbtPFU YWUz2l0ECD9qIG8v90ne9piB2rDwnpfIn4gnPAXSqHAj7J3/5vCv+Orr0CL58GSET2zF R1IFXV6wnkInjF4B1rrFWKKEE/5nG19Cp0hUZyI9YOZOJpGcrnYxJDi+bmaOzEUeascN E0QfK/KT4Fp0G7wQM3N4zS5CQWrn1jzTtcw/+Gcr0j8s8Wg3xuOtZhQmpm/j+L615wXn sKTKFd07Mhadi/frBUGX9tBuK0p/zg39XXZlD8jQk5WjlcEa7EI28WpyjSXibPvy6+xC ipLQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785791686; x=1786396486; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=Z9JxpJkklZFmCfZG7kvSXRiUJwuxf74cgBgaZj0atTg=; b=VwVGf8IP/UTnbNGgu9AJGtU3Si6mFAPBglbsEwVGMZymzz8gZq3voOrYPvyv6fPbYN 0iaalIMSDANLG2JTO5Ktxn9tpx5ErKxZrr9uhZk/Rwbbxp1yPNvcj0sPnk+Nw1HqNDCa Kk3HhzUur7Z6bm2jKNO0qOAF7RptXwQ1sc74w9J/8rezIb/P9LksiGSFvmfSj+KAuEoh qNta0sUCC3Z2AAk7jzVooIalUbcWnin1XwjPIy/Ta0EppOL3DwobqRR6GXdDiOdILAzk grSognLFG+t6YvvSIf5lcJE3dN71h6TSeFpPBpmxwez3NAfcDxymdGSmdFMWgG7mKr0j B4vw== X-Forwarded-Encrypted: i=1; AHgh+Rrh9oOJDsClb9Zee3dlBhUrQpqHhGImly/l0TOkfhLgGh6wM+Lm2xLHZHPSDrSGjCbDjeNAlfZwvZh062I=@vger.kernel.org X-Gm-Message-State: AOJu0YzsplQY6f2aIATxbqqRNN20Y92lx/inmEJzdU16qPzLwRZcacAK fgNRDY54++074pWqeincYOBkyutB8qsVMIiARwtGd3zVhAKaGJJblogyOKQ7jM78pJLfO7wP9b6 aoewjlGkHOfeiXulHE/ytSqKpHwLS83q0y4+g X-Gm-Gg: AR+sD10CZfDAPDcr8WpUBFByzXNhHzJrHRfYHn6u8YdQ72v51UyjAY/e+AOsXqsWLFC YewL9bpJcaaLaDM3Mj7uw356HXY7/1L3Dhaem4nbFBistCQ5fVF7ugFXjNy7xJmgx2fpdQk9D9L jaG58Mk+Ayw4X+xzhcJYdZFFSfqjktq5S596yLh51NIqmW6rxboY3BSNsJ0lZw38vT3Mde8KDhQ tycZ4xNcWdUUbyWVePFdryxBnoqWv3ptfi8DIXc98mzgwz4r3GrvBxlkMoT5bY/QaYq8Lte0RSv 2BHLY4Ot0tSlyhhEHF/YtOeNatU0m/9QDyUYJiU3hklTJm7xIXLAa//oV6mJbzXwM3f4s0rs5CQ 95fi+8DMXoPmjCjz8D/f/b4hGYfbuf3XQ X-Received: by 2002:a05:690e:4550:10b0:664:b979:5d89 with SMTP id 956f58d0204a3-6694f28f39fmr8654072d50.4.1785791685871; Mon, 03 Aug 2026 14:14:45 -0700 (PDT) Received: from c7-smtp-2026.dev.purestorage.com ([208.88.159.129]) by smtp-relay.gmail.com with ESMTPS id 956f58d0204a3-6694908a946sm445440d50.23.2026.08.03.14.14.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Aug 2026 14:14:45 -0700 (PDT) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (bond0.slc5-n17m28-k8s.dev.purestorage.com [IPv6:2620:125:9025:20::a31:41f]) by c7-smtp-2026.dev.purestorage.com (Postfix) with ESMTP id 5DDBA402A0; Mon, 3 Aug 2026 15:14:45 -0600 (MDT) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 5B57CE4041D; Mon, 3 Aug 2026 15:14:45 -0600 (MDT) From: Caleb Sander Mateos To: Ming Lei , Jens Axboe , Shuah Khan Cc: linux-block@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Caleb Sander Mateos , Ming Lei Subject: [PATCH v2 5/8] ublk: add UBLK_F_IO_DESC_SIZE Date: Mon, 3 Aug 2026 15:14:37 -0600 Message-ID: <20260803211441.2538144-6-csander@purestorage.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260803211441.2538144-1-csander@purestorage.com> References: <20260803211441.2538144-1-csander@purestorage.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" ublk passes the parameters of incoming I/O in memory shared between the kernel ublk driver and userspace ublk server in struct ublksrv_io_desc. The size of this struct is currently fixed to 24 bytes, which has been an obstacle to extending it with additional fields [1]. Additionally, with multiple ublk server threads handling I/Os from the same ublk queue (possible with UBLK_F_PER_IO_DAEMON or UBLK_F_BATCH_IO), false sharing results from adjacent io_descs sharing the same cache line. Add a ublk feature UBLK_F_IO_DESC_SIZE to allow a ublk server to override the size of each io_desc. The size must be at least 24 and a multiple of 8 to store a properly-aligned struct ublksrv_io_desc. It's also limited to a maximum of 256, though this bound could be lifted in the future. The struct ublksrv_io_desc is located at the beginning of each io_desc and the remainder is padding. The mmap() performed for each queue must have a length of queue_depth * io_desc_size rounded up to the page size. The mmap() offset must be q_id * UBLK_MAX_QUEUE_DEPTH * io_desc_size, also rounded up to the page size. [1]: https://lore.kernel.org/linux-block/aV8QfvaNO5P6vOs6@fedora/ Suggested-by: Ming Lei Signed-off-by: Caleb Sander Mateos --- drivers/block/ublk_drv.c | 38 ++++++++++++++++++++-------- include/uapi/linux/ublk_cmd.h | 5 +++- tools/testing/selftests/ublk/kublk.c | 1 + 3 files changed, 32 insertions(+), 12 deletions(-) diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c index 291461e1b236..2f5de735b2d2 100644 --- a/drivers/block/ublk_drv.c +++ b/drivers/block/ublk_drv.c @@ -87,11 +87,12 @@ | UBLK_F_BUF_REG_OFF_DAEMON \ | (IS_ENABLED(CONFIG_BLK_DEV_INTEGRITY) ? UBLK_F_INTEGRITY : 0) \ | UBLK_F_SAFE_STOP_DEV \ | UBLK_F_BATCH_IO \ | UBLK_F_NO_AUTO_PART_SCAN \ - | UBLK_F_SHMEM_ZC) + | UBLK_F_SHMEM_ZC \ + | UBLK_F_IO_DESC_SIZE) =20 #define UBLK_F_ALL_RECOVERY_FLAGS (UBLK_F_USER_RECOVERY \ | UBLK_F_USER_RECOVERY_REISSUE \ | UBLK_F_USER_RECOVERY_FAIL_IO) =20 @@ -105,10 +106,12 @@ #define UBLK_BATCH_F_ALL \ (UBLK_BATCH_F_HAS_ZONE_LBA | \ UBLK_BATCH_F_HAS_BUF_ADDR | \ UBLK_BATCH_F_AUTO_BUF_REG_FALLBACK) =20 +#define UBLK_MAX_IO_DESC_SIZE 256 + /* ublk batch fetch uring_cmd */ struct ublk_batch_fetch_cmd { struct list_head node; struct io_uring_cmd *cmd; unsigned short buf_group; @@ -237,10 +240,11 @@ struct ublk_io { } ____cacheline_aligned_in_smp; =20 struct ublk_queue { u16 q_id; u16 q_depth; + u16 io_desc_size; =20 unsigned long flags; struct ublksrv_io_desc *io_cmd_buf; =20 bool force_abort; @@ -403,11 +407,11 @@ static inline void ublk_io_evts_deinit(struct ublk_qu= eue *q) } =20 static inline struct ublksrv_io_desc * ublk_get_iod(const struct ublk_queue *ubq, u16 tag) { - return &ubq->io_cmd_buf[tag]; + return (void *)ubq->io_cmd_buf + tag * (size_t)ubq->io_desc_size; } =20 static inline bool ublk_support_zero_copy(const struct ublk_queue *ubq) { return ubq->flags & UBLK_F_SUPPORT_ZERO_COPY; @@ -1246,23 +1250,24 @@ static inline struct ublksrv_io_desc * ublk_queue_cmd_buf(struct ublk_device *ub, u16 q_id) { return ublk_get_queue(ub, q_id)->io_cmd_buf; } =20 -static inline int __ublk_queue_cmd_buf_size(u16 depth) +static inline size_t __ublk_queue_cmd_buf_size(const struct ublk_device *u= b, + u16 depth) { - return round_up(depth * sizeof(struct ublksrv_io_desc), PAGE_SIZE); + return round_up(depth * (size_t)ub->dev_info.io_desc_size, PAGE_SIZE); } =20 -static inline int ublk_queue_cmd_buf_size(struct ublk_device *ub) +static inline size_t ublk_queue_cmd_buf_size(const struct ublk_device *ub) { - return __ublk_queue_cmd_buf_size(ub->dev_info.queue_depth); + return __ublk_queue_cmd_buf_size(ub, ub->dev_info.queue_depth); } =20 -static int ublk_max_cmd_buf_size(void) +static size_t ublk_max_cmd_buf_size(const struct ublk_device *ub) { - return __ublk_queue_cmd_buf_size(UBLK_MAX_QUEUE_DEPTH); + return __ublk_queue_cmd_buf_size(ub, UBLK_MAX_QUEUE_DEPTH); } =20 /* * Should I/O outstanding to the ublk server when it exits be reissued? * If not, outstanding I/O will get errors. @@ -2660,11 +2665,11 @@ static int ublk_ch_release(struct inode *inode, str= uct file *filp) /* map pre-allocated per-queue cmd buffer to ublksrv daemon */ static int ublk_ch_mmap(struct file *filp, struct vm_area_struct *vma) { struct ublk_device *ub =3D filp->private_data; size_t sz =3D vma->vm_end - vma->vm_start; - unsigned max_sz =3D ublk_max_cmd_buf_size(); + size_t max_sz =3D ublk_max_cmd_buf_size(ub); unsigned long pfn, end, phys_off =3D vma->vm_pgoff << PAGE_SHIFT; int ret =3D 0; u16 q_id; =20 spin_lock(&ub->lock); @@ -4186,11 +4191,11 @@ static const struct file_operations ublk_ch_batch_i= o_fops =3D { .mmap =3D ublk_ch_mmap, }; =20 static void __ublk_deinit_queue(struct ublk_device *ub, struct ublk_queue = *ubq) { - int size; + size_t size; u16 i; =20 size =3D ublk_queue_cmd_buf_size(ub); =20 for (i =3D 0; i < ubq->q_depth; i++) { @@ -4239,11 +4244,12 @@ static int ublk_init_queue(struct ublk_device *ub, = u16 q_id) u16 depth =3D ub->dev_info.queue_depth; gfp_t gfp_flags =3D GFP_KERNEL | __GFP_ZERO; struct ublk_queue *ubq; struct page *page; int numa_node; - int size, ret; + size_t size; + int ret; u16 i; =20 /* Determine NUMA node based on queue's CPU affinity */ numa_node =3D ublk_get_queue_numa_node(ub, q_id); =20 @@ -4264,10 +4270,11 @@ static int ublk_init_queue(struct ublk_device *ub, = u16 q_id) if (!page) { kvfree(ubq); return -ENOMEM; } ubq->io_cmd_buf =3D page_address(page); + ubq->io_desc_size =3D ub->dev_info.io_desc_size; =20 for (i =3D 0; i < ubq->q_depth; i++) spin_lock_init(&ubq->ios[i].lock); =20 if (ublk_dev_support_batch_io(ub)) { @@ -4748,10 +4755,19 @@ static int ublk_ctrl_add_dev(const struct ublksrv_c= trl_cmd *header) =20 /* User copy is required to access integrity buffer */ if (info.flags & UBLK_F_INTEGRITY && !(info.flags & UBLK_F_USER_COPY)) return -EINVAL; =20 + if (info.flags & UBLK_F_IO_DESC_SIZE) { + if (info.io_desc_size < sizeof(struct ublksrv_io_desc) || + info.io_desc_size % _Alignof(struct ublksrv_io_desc) || + info.io_desc_size > UBLK_MAX_IO_DESC_SIZE) + return -EINVAL; + } else { + info.io_desc_size =3D sizeof(struct ublksrv_io_desc); + } + /* the created device is always owned by current user */ ublk_store_owner_uid_gid(&info.owner_uid, &info.owner_gid); =20 if (header->dev_id !=3D info.dev_id) { pr_warn("%s: dev id not match %u %u\n", diff --git a/include/uapi/linux/ublk_cmd.h b/include/uapi/linux/ublk_cmd.h index 6991370a72ce..33b25dd13965 100644 --- a/include/uapi/linux/ublk_cmd.h +++ b/include/uapi/linux/ublk_cmd.h @@ -415,10 +415,13 @@ struct ublk_shmem_buf_reg { * pages match a registered buffer, UBLK_IO_F_SHMEM_ZC is set and addr * encodes the buffer index + offset instead of a userspace buffer address. */ #define UBLK_F_SHMEM_ZC (1ULL << 19) =20 +/* ublksrv_io_desc size is specified by ublksrv_ctrl_dev_info's io_desc_si= ze */ +#define UBLK_F_IO_DESC_SIZE (1ULL << 20) + /* device state */ #define UBLK_S_DEV_DEAD 0 #define UBLK_S_DEV_LIVE 1 #define UBLK_S_DEV_QUIESCED 2 #define UBLK_S_DEV_FAIL_IO 3 @@ -450,11 +453,11 @@ struct ublksrv_ctrl_cmd { =20 struct ublksrv_ctrl_dev_info { __u16 nr_hw_queues; __u16 queue_depth; __u16 state; - __u16 pad0; + __u16 io_desc_size; =20 __u32 max_io_buf_bytes; __u32 dev_id; =20 __s32 ublksrv_pid; diff --git a/tools/testing/selftests/ublk/kublk.c b/tools/testing/selftests= /ublk/kublk.c index 0b23c09daea5..5c4a1f18d0a3 100644 --- a/tools/testing/selftests/ublk/kublk.c +++ b/tools/testing/selftests/ublk/kublk.c @@ -1968,10 +1968,11 @@ static int cmd_dev_get_features(void) FEAT_NAME(UBLK_F_INTEGRITY), FEAT_NAME(UBLK_F_SAFE_STOP_DEV), FEAT_NAME(UBLK_F_BATCH_IO), FEAT_NAME(UBLK_F_NO_AUTO_PART_SCAN), FEAT_NAME(UBLK_F_SHMEM_ZC), + FEAT_NAME(UBLK_F_IO_DESC_SIZE), }; struct ublk_dev *dev; __u64 features =3D 0; int ret; =20 --=20 2.54.0 From nobody Fri Oct 2 07:45:31 2026 Received: from mail-pl1-f225.google.com (mail-pl1-f225.google.com [209.85.214.225]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 42DF240F74F for ; Mon, 3 Aug 2026 21:14:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.225 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785791691; cv=none; b=LW+NOGHHymZnjPO5wmt+4UQHs3GxXeu8jkqc3pr6u44qT/cm9lD3B8noPH0gYLxTi2HroaBXsdz3d6XlZng88KGUA6GUhxLkHbNNuoAaGXyGIivjYuIqiL7SFIIlhNGu7Vdr3KyWcblb5Uh80eD4l91wyoOPMkun0wL2KllQ4SE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785791691; c=relaxed/simple; bh=KeIyb5xZKfQ4JDv9mZHP1us5dt4PFZ7cWzMj3sugzT0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=kj+ByV6bGCVZy95cwSr8WSqu1fNyQ9yFp0aEfJtp7Cfbg4/1amsvqILZd/9SWjcwa3kssKlzXQmYZf8zagQJJEL7+ETR5NBEdh0UNRW+PwSD9CiFp4HR3CX3bF2eZawZeE4smeJVT0TKOpTDDUOOJgfE56tWotah9bz8PAAxk9s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=purestorage.com; spf=pass smtp.mailfrom=purestorage.com; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b=CJP6TYBf; arc=none smtp.client-ip=209.85.214.225 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=purestorage.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=purestorage.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b="CJP6TYBf" Received: by mail-pl1-f225.google.com with SMTP id d9443c01a7336-2ceeee8c46bso6769165ad.2 for ; Mon, 03 Aug 2026 14:14:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1785791686; x=1786396486; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=OJFQX9w+WNzPqwmbcIl1aG5997/wz45rR1Xtro/0Q4Y=; b=CJP6TYBfcN/Uaf89CY3PdbjPLfAdnt+RGhjNDTw3BGowZ7jdHh7bFjF14ziieJ7nkP JFQUPK8RtMK2gFQuEygz0+s2Ad83s5DBNGv29GBumwzv9H598SeEa5NBxzQTVox8t4tG KxtVY46AKk7ZQPSOsuch3UY+btpIk6A3mKXJWWGEJPS5ylp+kCSJo4KAXeNMdixEjT5g tzwjTt3T5FeU7yRhXl3+CVMlNASM9yTW2fNVg8+UPWgbaFMWNLw51sU7PIapo1a/DhUb pDUjQEARJ3YWLxYAUWPMf9DZxA1SXrO/hLrXEoktBl45VxOJziR3BI7QFKNgL8D+iac3 LdJg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785791686; x=1786396486; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=OJFQX9w+WNzPqwmbcIl1aG5997/wz45rR1Xtro/0Q4Y=; b=nNmJjOB0HL6HpkpUpww67okr+Qr5y9JBsjMct6niL7uYKoKBlDIeb5l6pM6vN1vATP AKkGchj2/P6/0c1xr96qIp7cz225NvSC7RdzM38pYG6qoMLQD4PzpGaD2Y/97E4PeMmM GJZLDmLCs5M3WznOew3qDB4MLXXJSdo/Zl+ifyDYhBbsnIzTLAr4iZck6XDLMOs1oq4F apuMHCeuQXGOtyTTINRRKpTqSwycm/deuXjdSj1pGJGMIyg8toQm4BKVSFQpSmaUZKX2 ykc/jAJJkIcSlHsHkhEYQ2wsAIJ51KTpbHFgLqpixX3ezTESDF/S8k5D2h/mPdr5HrLg 3OCA== X-Forwarded-Encrypted: i=1; AHgh+RodkLJfe/A4NnNeWGb1lTg/4X5pZ4YmLKLjsAlC87xKQthX/OQa8D8XrlVTG/Aj7XfZJyLQXp/xz81Txmk=@vger.kernel.org X-Gm-Message-State: AOJu0YyyVrcm82bOelit53OEWox9sRFTEenKkjehJ6m9eb0YN/poQZjW K9M08HFr/TSm7j3yEulFZG+YRkw9p8nPBjlMQ6XEGLz5C/AWomITMdTMuy7zGe5ZXYeIpEnXyYb lvFU4GSCSuQVv0P9nWud16xIPChSkDLiv7QqT/VEEi0fXMB3ODS9e X-Gm-Gg: AR+sD11zPwVG0J7ClX9LN7Qox4qJmwcLRr19JAulnhebzSmuzUJUZLJShB8r24x7Lze aT1pHI06JLKa9Wp5ZQt5/8dVKWlRdFGMTx0wgMUzqBBmNBnmTUCbOdSzwUqFvB8q/KLGArKGTl3 9exI2uAgYUVbs1zboM238qhKWHg+SSEAmhHCpDu1hq9MiK+KyrOEjh1gqWPlckOpUxxy9qI4rPg h5/cjWs5dxulpT8vjNrI2PyUzIreI01npwA+p7dXlOx1uCi2CN8AZ+Pg4KFsn91sR7dLGYZy1o8 5A+v6Y7YJ3fNT6siPELPXTtqUOMzIeAyqQUzpjw0VuQ4NmqpGg1rmWN4MAddKj5l7j6JqIpPGpc Q0qV/fstfo5E2A6eSBw== X-Received: by 2002:a17:902:dad1:b0:2c4:397:dd7a with SMTP id d9443c01a7336-2d05296eb89mr158008895ad.4.1785791686265; Mon, 03 Aug 2026 14:14:46 -0700 (PDT) Received: from c7-smtp-2026.dev.purestorage.com ([2620:125:9017:12:36:3:6:0]) by smtp-relay.gmail.com with ESMTPS id d9443c01a7336-2d04b0fc2dasm4928015ad.32.2026.08.03.14.14.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Aug 2026 14:14:46 -0700 (PDT) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.112.12.104]) by c7-smtp-2026.dev.purestorage.com (Postfix) with ESMTP id 860DC43962; Mon, 3 Aug 2026 15:14:45 -0600 (MDT) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 83074E4041D; Mon, 3 Aug 2026 15:14:45 -0600 (MDT) From: Caleb Sander Mateos To: Ming Lei , Jens Axboe , Shuah Khan Cc: linux-block@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Caleb Sander Mateos Subject: [PATCH v2 6/8] selftests: ublk: add support for --io_desc_size Date: Mon, 3 Aug 2026 15:14:38 -0600 Message-ID: <20260803211441.2538144-7-csander@purestorage.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260803211441.2538144-1-csander@purestorage.com> References: <20260803211441.2538144-1-csander@purestorage.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add an optional --io_desc_size argument to the kublk add/recover commands to enable UBLK_F_IO_DESC on the ublk device. The mmap() arguments and ublk_get_iod() computation are adjusted accordingly. Display the configured io_desc_size in the kublk list output for ublk devices with UBLK_F_IO_DESC. Signed-off-by: Caleb Sander Mateos --- tools/testing/selftests/ublk/kublk.c | 29 +++++++++++++++++++--------- tools/testing/selftests/ublk/kublk.h | 6 ++++-- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/tools/testing/selftests/ublk/kublk.c b/tools/testing/selftests= /ublk/kublk.c index 5c4a1f18d0a3..0e3e2d74cc4d 100644 --- a/tools/testing/selftests/ublk/kublk.c +++ b/tools/testing/selftests/ublk/kublk.c @@ -350,10 +350,12 @@ static void ublk_ctrl_dump(struct ublk_dev *dev) info->dev_id, info->nr_hw_queues, info->queue_depth, 1 << p.basic.logical_bs_shift, p.basic.dev_sectors); ublk_log("\tmax rq size %d daemon pid %d flags 0x%llx state %s\n", info->max_io_buf_bytes, info->ublksrv_pid, info->flags, ublk_dev_state_desc(dev)); + if (info->flags & UBLK_F_IO_DESC_SIZE) + ublk_log("\tio_desc_size %u\n", info->io_desc_size); =20 if (affinity) { char buf[512]; int i; =20 @@ -398,26 +400,26 @@ static struct ublk_dev *ublk_ctrl_init(void) dev->nr_fds =3D 1; =20 return dev; } =20 -static int __ublk_queue_cmd_buf_sz(unsigned depth) +static size_t __ublk_queue_cmd_buf_sz(const struct ublk_queue *q, __u16 de= pth) { - int size =3D depth * sizeof(struct ublksrv_io_desc); - unsigned int page_sz =3D getpagesize(); + size_t size =3D depth * (size_t)q->io_desc_size; + size_t page_sz =3D getpagesize(); =20 return round_up(size, page_sz); } =20 -static int ublk_queue_max_cmd_buf_sz(void) +static size_t ublk_queue_max_cmd_buf_sz(const struct ublk_queue *q) { - return __ublk_queue_cmd_buf_sz(UBLK_MAX_QUEUE_DEPTH); + return __ublk_queue_cmd_buf_sz(q, UBLK_MAX_QUEUE_DEPTH); } =20 -static int ublk_queue_cmd_buf_sz(struct ublk_queue *q) +static size_t ublk_queue_cmd_buf_sz(const struct ublk_queue *q) { - return __ublk_queue_cmd_buf_sz(q->q_depth); + return __ublk_queue_cmd_buf_sz(q, q->q_depth); } =20 static void ublk_queue_deinit(struct ublk_queue *q) { int i; @@ -451,26 +453,27 @@ static int ublk_queue_init(struct ublk_queue *q, unsi= gned long long extra_flags, __u8 metadata_size) { struct ublk_dev *dev =3D q->dev; int depth =3D dev->dev_info.queue_depth; int i; - int cmd_buf_size, io_buf_size, integrity_size; + size_t cmd_buf_size, io_buf_size, integrity_size; unsigned long off; =20 pthread_spin_init(&q->lock, PTHREAD_PROCESS_PRIVATE); q->tgt_ops =3D dev->tgt.ops; q->flags =3D 0; q->q_depth =3D depth; q->flags =3D dev->dev_info.flags; q->flags |=3D extra_flags; q->metadata_size =3D metadata_size; + q->io_desc_size =3D dev->dev_info.io_desc_size; =20 /* Cache fd in queue for fast path access */ q->ublk_fd =3D dev->fds[0]; =20 cmd_buf_size =3D ublk_queue_cmd_buf_sz(q); - off =3D UBLKSRV_CMD_BUF_OFFSET + q->q_id * ublk_queue_max_cmd_buf_sz(); + off =3D UBLKSRV_CMD_BUF_OFFSET + q->q_id * ublk_queue_max_cmd_buf_sz(q); q->io_cmd_buf =3D mmap(0, cmd_buf_size, PROT_READ, MAP_SHARED | MAP_POPULATE, dev->fds[0], off); if (q->io_cmd_buf =3D=3D MAP_FAILED) { ublk_err("ublk dev %d queue %d map io_cmd_buf failed %m\n", q->dev->dev_info.dev_id, q->q_id); @@ -1706,10 +1709,11 @@ static int __cmd_dev_add(const struct dev_ctx *ctx) =20 info =3D &dev->dev_info; info->dev_id =3D ctx->dev_id; info->nr_hw_queues =3D nr_queues; info->queue_depth =3D depth; + info->io_desc_size =3D ctx->io_desc_size; info->flags =3D ctx->flags; if ((features & UBLK_F_QUIESCE) && (info->flags & UBLK_F_USER_RECOVERY)) info->flags |=3D UBLK_F_QUIESCE; dev->nthreads =3D nthreads; @@ -2067,10 +2071,11 @@ static void __cmd_create_help(char *exe, bool recov= ery) printf("\t[-e 0|1 ] [-i 0|1] [--no_ublk_fixed_fd]\n"); printf("\t[--nthreads threads] [--per_io_tasks]\n"); printf("\t[--integrity_capable] [--integrity_reftag] [--metadata_size SIZ= E] " "[--pi_offset OFFSET] [--csum_type ip|t10dif|nvme] [--tag_size SIZE]\n"= ); printf("\t[--batch|-b] [--no_auto_part_scan]\n"); + printf("\t[--io_desc_size SIZE]\n"); printf("\t[target options] [backfile1] [backfile2] ...\n"); printf("\tdefault: nr_queues=3D2(max 32), depth=3D128(max 1024), dev_id= =3D-1(auto allocation)\n"); printf("\tdefault: nthreads=3Dnr_queues"); =20 for (i =3D 0; i < ARRAY_SIZE(tgt_ops_list); i++) { @@ -2144,10 +2149,11 @@ int main(int argc, char *argv[]) { "batch", 0, NULL, 'b'}, { "no_auto_part_scan", 0, NULL, 0 }, { "shmem_zc", 0, NULL, 0 }, { "htlb", 1, NULL, 0 }, { "rdonly_shmem_buf", 0, NULL, 0 }, + { "io_desc_size", 1, NULL, 0 }, { 0, 0, 0, 0 } }; const struct ublk_tgt_ops *ops =3D NULL; int option_idx, opt; const char *cmd =3D argv[1]; @@ -2156,10 +2162,11 @@ int main(int argc, char *argv[]) .queue_depth =3D 128, .nr_hw_queues =3D 2, .dev_id =3D -1, .tgt_type =3D "unknown", .csum_type =3D LBMD_PI_CSUM_NONE, + .io_desc_size =3D sizeof(struct ublksrv_io_desc), }; int ret =3D -EINVAL, i; int tgt_argc =3D 1; char *tgt_argv[MAX_NR_TGT_ARG] =3D { NULL }; int value; @@ -2265,10 +2272,14 @@ int main(int argc, char *argv[]) ctx.flags |=3D UBLK_F_SHMEM_ZC; if (!strcmp(longopts[option_idx].name, "htlb")) ctx.htlb_path =3D strdup(optarg); if (!strcmp(longopts[option_idx].name, "rdonly_shmem_buf")) ctx.rdonly_shmem_buf =3D 1; + if (!strcmp(longopts[option_idx].name, "io_desc_size")) { + ctx.flags |=3D UBLK_F_IO_DESC_SIZE; + ctx.io_desc_size =3D strtoul(optarg, NULL, 0); + } break; case '?': /* * target requires every option must have argument */ diff --git a/tools/testing/selftests/ublk/kublk.h b/tools/testing/selftests= /ublk/kublk.h index 742c41d77df1..15b56ff45bb6 100644 --- a/tools/testing/selftests/ublk/kublk.h +++ b/tools/testing/selftests/ublk/kublk.h @@ -85,10 +85,11 @@ struct dev_ctx { __u32 integrity_flags; __u8 metadata_size; __u8 pi_offset; __u8 csum_type; __u8 tag_size; + __u16 io_desc_size; =20 int _evtfd; int _shmid; =20 /* built from shmem, only for ublk_dump_dev() */ @@ -185,10 +186,11 @@ struct ublk_queue { #define UBLKS_Q_NO_UBLK_FIXED_FD (1ULL << 62) #define UBLKS_Q_PREPARED (1ULL << 61) __u64 flags; int ublk_fd; /* cached ublk char device fd */ __u8 metadata_size; + __u16 io_desc_size; struct ublk_io ios[UBLK_QUEUE_DEPTH]; =20 /* used for prep io commands */ pthread_spinlock_t lock; }; @@ -459,13 +461,13 @@ static inline void ublk_mark_io_done(struct ublk_io *= io, int res) { io->flags |=3D (UBLKS_IO_NEED_COMMIT_RQ_COMP | UBLKS_IO_FREE); io->result =3D res; } =20 -static inline const struct ublksrv_io_desc *ublk_get_iod(const struct ublk= _queue *q, int tag) +static inline const struct ublksrv_io_desc *ublk_get_iod(const struct ublk= _queue *q, __u16 tag) { - return &q->io_cmd_buf[tag]; + return (void *)q->io_cmd_buf + tag * (size_t)q->io_desc_size; } =20 static inline void ublk_set_sqe_cmd_op(struct io_uring_sqe *sqe, __u32 cmd= _op) { __u32 *addr =3D (__u32 *)&sqe->off; --=20 2.54.0 From nobody Fri Oct 2 07:45:31 2026 Received: from mail-qt1-f227.google.com (mail-qt1-f227.google.com [209.85.160.227]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id ED7773B5E01 for ; Mon, 3 Aug 2026 21:14:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.227 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785791691; cv=none; b=NLd54cSlGrSvc+SCq0EuM0CWUN/eA9EQrcM4rXQ5EmrnoLeyb98O272+vN30EI134tBMa1zjNRSYHBGiwnnMR4IRIF34jGS+WoBKnXfrJoCTVW/WeQhbj9cTqu8Co9IcKhZ7HUXwkLLw7nebvqkVMJ+tulhP04mYm318iJINcqI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785791691; c=relaxed/simple; bh=8qxekDeSK5x+ec3E67tUMH2DiSjF/BHmj5eXMGM1EUQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=azNsfZ8lgUQ+n1pvBoCvN5c2ExBqWToRpTwaWQJzCMQTZ8w6qmS7j35IhEN3xvV14mjed602o9M3i9Ts3DZOk8pEgR4spOukMN0wFqOOkzbpSycx9Eg280MqSrgINNzzbs9YhZDY8vQkI9Uzz8GIYyJZ5MP4VTL3zPVpzx+8tFU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=purestorage.com; spf=pass smtp.mailfrom=purestorage.com; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b=DDzxn+MX; arc=none smtp.client-ip=209.85.160.227 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=purestorage.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=purestorage.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b="DDzxn+MX" Received: by mail-qt1-f227.google.com with SMTP id d75a77b69052e-52b4e3fd033so1916951cf.0 for ; Mon, 03 Aug 2026 14:14:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1785791686; x=1786396486; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=q/ysi0c3v/nSs3PcCunYETC+T3p7rfWS9Ra9/ntvyBI=; b=DDzxn+MX2lgwWRBkZu6OQhokrvUo1q+qdVG3p2rhBfx8VhGU6gwhBUlqTeQBCoB30B L/tEaknzZ5BQcejafpvsfq1939ABqYP7vtmBBbcuohJfC2b4+rh9IWURJkOJ6UWYnRLw DJxvZxEV55gJTW2/bQ1bvnoOq8yGFpuKfVT7UviH6LcyeZ8kn+Vc4/avg+eU6nvQ5Yyf Ih1Quw9TDgsdQjVEjjcpJNsec0WVBRtdZQVDs4GEQLYqeOxzSK43QDpFaLxwQwCRaNLy pd+aAkvEotoEqbiyJ7caWLZZqm5pQ5+r/6HFpP7/zd913dFy49Sz6wD1sYm5XqmdFoh9 4m1A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785791686; x=1786396486; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=q/ysi0c3v/nSs3PcCunYETC+T3p7rfWS9Ra9/ntvyBI=; b=d00iQOLGo/BL0Ce67OuA07pznl4riBA8zPtBDjmUXQ6F/E4H7eR4c5k/WmEl3v0wEq UKff/mlf42ZIkdEnpi5zN9Nltk3jTClmRkib4whYdoZRXp/fbgbs2BqaClqRlMSq4/V+ WnliVTHTKwjC7EV0zvLE+vQysQEeREbNlZjBsLT3tLiLKiL7KL8Qx8CksGdN7xDOGdLQ DAK/OXeNlxoujVUnWXnEkOZdDk6HQDw5z7Klr6IiRCtdgxGgGRC9G4nXsmo+9inNULyv ma7qleJl6MGXGoj1eVZESJuMkxek6zCUWxUMLFw0+f1T99MOG5CZsq3TxovAXsGEA3Q7 +29Q== X-Forwarded-Encrypted: i=1; AHgh+RrXvYtthegUSw33KXBDJyyC5oMSicpGBMZqx0pL5/HmR6SgfPsRsoTxCwyhQwqkBeyFvBS9K5F9BP3DKsA=@vger.kernel.org X-Gm-Message-State: AOJu0Ywhms8sPuW+PnvPktLKs3bGm1RRYis+2YJ8YpEyQbaJdy3aEdk2 RFbaUBhsXtOBbujWnSgfvsN3MR+OlFR7YMeRtLWfxHyiGoRLLilQJ1Zr6HpP1wNYfNLInxQHrv2 su/CTZWNXk5K1fgfHxgnh7FB7mSvAxmaF/kOV X-Gm-Gg: AR+sD12iQXFBH7968RS1sOh3+8EBKHkHtpRAxcjRBaBNyJIw4vGAcPyRYrfspe/D0le QeUxPRiqnAMgFvYpza2PzPAjL+jgpLke5xHWDGAcAtKFAFskw3IIvNxsATKME2er35C6JdJdcmL l7LgAthCscuci+NxoUQz2uOw0WgQZFcKqPLsKtN7O8appE1uvXsMXTShIRFeocmkN0U8oGFYnrS rh1GMK11fgg0hAH5v37hyGtdHh1UxB1pQKuo/NOMmVh/eZ3s1ts7NADTX5vtCCq83hxs1xaNzUs GCloKcV2/hJJ7h01KBIhE7/CQ0YI9Iw5RDbd267pPxsqdCN83RSVexZH6Lv3L+pKwKnCdh3CkNe kXWaUW7Qwif3PkXaVFh9cOcCTYpsB3Lmq X-Received: by 2002:ac8:7f55:0:b0:517:6162:daf5 with SMTP id d75a77b69052e-52b5681199dmr174778891cf.3.1785791686336; Mon, 03 Aug 2026 14:14:46 -0700 (PDT) Received: from c7-smtp-2026.dev.purestorage.com ([208.88.159.129]) by smtp-relay.gmail.com with ESMTPS id d75a77b69052e-52b4eb94561sm4853741cf.22.2026.08.03.14.14.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Aug 2026 14:14:46 -0700 (PDT) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.112.12.104]) by c7-smtp-2026.dev.purestorage.com (Postfix) with ESMTP id AD42143524; Mon, 3 Aug 2026 15:14:45 -0600 (MDT) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id AB005E4041D; Mon, 3 Aug 2026 15:14:45 -0600 (MDT) From: Caleb Sander Mateos To: Ming Lei , Jens Axboe , Shuah Khan Cc: linux-block@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Caleb Sander Mateos Subject: [PATCH v2 7/8] selftests: ublk: add UBLK_F_IO_DESC_SIZE test Date: Mon, 3 Aug 2026 15:14:39 -0600 Message-ID: <20260803211441.2538144-8-csander@purestorage.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260803211441.2538144-1-csander@purestorage.com> References: <20260803211441.2538144-1-csander@purestorage.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add test loop_08, which creates a ublk device with UBLK_F_IO_DESC_SIZE enabled and io_desc_size set to 64. The test issues verified I/O to the device using fio. Signed-off-by: Caleb Sander Mateos --- tools/testing/selftests/ublk/Makefile | 1 + tools/testing/selftests/ublk/test_loop_08.sh | 25 ++++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100755 tools/testing/selftests/ublk/test_loop_08.sh diff --git a/tools/testing/selftests/ublk/Makefile b/tools/testing/selftest= s/ublk/Makefile index 6e4fe8d1fed1..b00ef238a038 100644 --- a/tools/testing/selftests/ublk/Makefile +++ b/tools/testing/selftests/ublk/Makefile @@ -32,10 +32,11 @@ TEST_PROGS +=3D test_loop_02.sh TEST_PROGS +=3D test_loop_03.sh TEST_PROGS +=3D test_loop_04.sh TEST_PROGS +=3D test_loop_05.sh TEST_PROGS +=3D test_loop_06.sh TEST_PROGS +=3D test_loop_07.sh +TEST_PROGS +=3D test_loop_08.sh =20 TEST_PROGS +=3D test_integrity_01.sh TEST_PROGS +=3D test_integrity_02.sh TEST_PROGS +=3D test_integrity_03.sh =20 diff --git a/tools/testing/selftests/ublk/test_loop_08.sh b/tools/testing/s= elftests/ublk/test_loop_08.sh new file mode 100755 index 000000000000..f7af2587482d --- /dev/null +++ b/tools/testing/selftests/ublk/test_loop_08.sh @@ -0,0 +1,25 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 + +. "$(cd "$(dirname "$0")" && pwd)"/test_common.sh + +ERR_CODE=3D0 + +if ! _have_program fio; then + exit "$UBLK_SKIP_CODE" +fi + +_prep_test "loop" "write and verify with io_desc_size" + +_create_backfile 0 256M + +dev_id=3D$(_add_ublk_dev -t loop --io_desc_size 64 "${UBLK_BACKFILES[0]}") +_check_add_dev $TID $? + +# run fio over the ublk disk +_run_fio_verify_io --filename=3D/dev/ublkb"${dev_id}" --size=3D256M +ERR_CODE=3D$? + +_cleanup_test + +_show_result $TID $ERR_CODE --=20 2.54.0 From nobody Fri Oct 2 07:45:31 2026 Received: from mail-oa1-f99.google.com (mail-oa1-f99.google.com [209.85.160.99]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 662E23B2FF6 for ; Mon, 3 Aug 2026 21:14:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.99 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785791692; cv=none; b=ANllzOkVV0hjvPnDRt4wvufTMvqbEAHtglFbkfvhMmDK03uDjEnkP2xRhjtoX/KOh3mLsZaKPOk8ioqhWoK+7/on4aGRWUxO0azdxo94NHA9pMs48CAV6XiD2/6qMcwcPPLGWdriZXmUG2VwYF0Dst1hNy803XNhrjeKE9vXUYE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785791692; c=relaxed/simple; bh=oHXxfW5IlQ1V89s+68++ytVnFnwh2NLZMo3nuYY1G5w=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tKyRKOgkWIkM3Thm5O95AV6O0sNP9mUfwOU4kWpTzdggU5IkrgposV02SVDVlsHfqic7efoQuS2om47NHVQagzErnPU2F9FkVclVrDrhujEi/132SWeEJP+Wtwsr1oA/ToxBjFDJI3nU41iAu6sJcseA4rF1JiKuf8rxWH50RFs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=purestorage.com; spf=pass smtp.mailfrom=purestorage.com; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b=UWDGt9mh; arc=none smtp.client-ip=209.85.160.99 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=purestorage.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=purestorage.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b="UWDGt9mh" Received: by mail-oa1-f99.google.com with SMTP id 586e51a60fabf-455f99ad59fso511104fac.2 for ; Mon, 03 Aug 2026 14:14:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1785791686; x=1786396486; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=vpVnITloaB/CuxZF0cmwJEghk018GUmAzlcAcdSo+j0=; b=UWDGt9mhF/OTKVAuvww/x54apzfGy0eMmHMQ1mIy7pq+ki5uzEk7s9q6x/ycKSan3o OWxS3E5WpGo4PcqGxrU4tPdQHpM9tyEGoSTKiRtwqJYekU+hvhK4fxC3bYUKyKqvz5DG 0w6y/4CnwzuRsm1APj4TSc8BW+7vwVagrnYDTVX9V3nhxf77THFCSCG3OpXbrKj5cHA0 Q8wwF2CJjllV5yUkTaoMipQWn0bpsbVW+Tol+BmIu57egMqmsk07ZHcabVW4rphDNJnx ThFo/tJFJyLVp3FZuaMK7O7aHqOLvac1xY+NktMZ9MoT/iz62suidjoU1JX1S0dkH0qx 7XEw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785791686; x=1786396486; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=vpVnITloaB/CuxZF0cmwJEghk018GUmAzlcAcdSo+j0=; b=QBFtCyeRmymddPBRJ9DPZ/eEay08BJaeXiUt/oOPPlfeSdkx7fOY3BDpq87J1qlOiP GYB3658mANtTLym4iiO4Qp+fndM9OVF+MiduJWa1Pqr1+YbTbhoAZT8QlKmR6e6FqJqJ 0UuPOwIeL2Ndjyov5XkZ5zALzcATbfIx84w+TxJxEUYDMvtgjKWpbt6kM6q/lDth1kIR YAbMbKGIrPGE6ay5ee5eQlfGGCelgQ0I//Pur9HxvdkGn+Q7bPMlzrtRxNH2jIGbc0ra m8IvwyI/OLn/cozoVyhi+yXSIW5Zi9pmYyrwbef2AHIO3PTjVKRK11r5Dzwz9OyW3Yuf mjyA== X-Forwarded-Encrypted: i=1; AHgh+RoPg5yz/gbaa/sOBkmIYpHQBQjOQiXTgF2pwdab73tZ+yih0aAlLmT3OVIOM26zY7Z+Jja94XC6sxYzMgM=@vger.kernel.org X-Gm-Message-State: AOJu0YxpLK9+pqYUErzWqNltkxclqRtNxnnzi+AsYgbAG2YXYNLjD5yv HQFVGzrfEh2AvD7AveD2BRqMCDWKmGMOJKKL8ITB9wpL89pU05GmJ1YfD/KBHJE7nkgx8JVXWlj aj2y/IOg8xRETka8sbIDbxt3gk6boFKCHuAWSR7uwr/CdKyKN/6dF X-Gm-Gg: AR+sD10gnKBp70X8v/47rH4VqInCuhs0HerqnpgJGq1xRz2quS4VY6nq8QKSOWGQNaJ ldOo0TjLonLxleCfeWzOoE+9GiuFfUwDzwyghOe326FS0t8q+dgFHuH8+SD7skl6CRZSrzIXw2+ ZLq7Ko1/SSufbfWRXLpCFN0NSYHEs59u9p0igpLGMBSOvGSiX7T/k0FCqIntXEGWPlsrIDZm0nK LFfsI8sUYuyTHp2QD53pl7bmdXjjsgBWCXhPFHuufIthQHjKGKaYGctwtjQ79pLkBBSey3HjnSX V30rdmsllgTDg79HSwtVWYlB8J3RpZ+wLsH+UyxRm4QlcClwI6hwAFHENHN7U4PU+P57zdeTuXJ /IHooQHnBS4dalDadnw== X-Received: by 2002:a05:6830:8d1:b0:7e9:c631:98b6 with SMTP id 46e09a7af769-7f196f85314mr10975146a34.3.1785791686286; Mon, 03 Aug 2026 14:14:46 -0700 (PDT) Received: from c7-smtp-2026.dev.purestorage.com ([2620:125:9017:12:36:3:6:0]) by smtp-relay.gmail.com with ESMTPS id 586e51a60fabf-458f66afb19sm1030795fac.12.2026.08.03.14.14.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Aug 2026 14:14:46 -0700 (PDT) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.112.12.104]) by c7-smtp-2026.dev.purestorage.com (Postfix) with ESMTP id D495B402B3; Mon, 3 Aug 2026 15:14:45 -0600 (MDT) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id D220EE4041D; Mon, 3 Aug 2026 15:14:45 -0600 (MDT) From: Caleb Sander Mateos To: Ming Lei , Jens Axboe , Shuah Khan Cc: linux-block@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Caleb Sander Mateos Subject: [PATCH v2 8/8] ublk: lift checks out of ublk_{,un}map_io() Date: Mon, 3 Aug 2026 15:14:40 -0600 Message-ID: <20260803211441.2538144-9-csander@purestorage.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260803211441.2538144-1-csander@purestorage.com> References: <20260803211441.2538144-1-csander@purestorage.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" ublk_map_io() and ublk_unmap_io() are no-ops for ublk devices that enable user copy or zero copy, as well as for requests without data to copy in the given direction. However, the implementation is a bit convoluted, returning the full request data length and relying on the caller to check the return value against the request length. UBLK_F_SHMEM_ZC recently added branches to skip the ublk_{,un}map_io() call for I/Os using a shared-memory buffer. This is a more logical place for the device need_map and the ublk_need_{,un}map_req() checks, so move them there from ublk_{,un}map_io(). Checking these conditions early also skips the expensive pointer-chasing for the ublk_iod_is_shmem_zc() check in __ublk_complete_rq() for the common case of a ublk device using user copy or zero copy. Drop the req_op() filter in __ublk_complete_rq(), as it's redundant with the ublk_need_unmap_req() check. Signed-off-by: Caleb Sander Mateos Reviewed-by: Ming Lei --- drivers/block/ublk_drv.c | 70 +++++++++++----------------------------- 1 file changed, 19 insertions(+), 51 deletions(-) diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c index 2f5de735b2d2..9249d25dceed 100644 --- a/drivers/block/ublk_drv.c +++ b/drivers/block/ublk_drv.c @@ -1466,57 +1466,33 @@ static inline bool ublk_need_unmap_req(const struct= request *req) { return blk_rq_has_data(req) && (req_op(req) =3D=3D REQ_OP_READ || req_op(req) =3D=3D REQ_OP_DRV_I= N); } =20 -static unsigned int ublk_map_io(const struct ublk_queue *ubq, - const struct request *req, +static unsigned int ublk_map_io(const struct request *req, const struct ublk_io *io) { - const unsigned int rq_bytes =3D blk_rq_bytes(req); + struct iov_iter iter; + const int dir =3D ITER_DEST; =20 - if (!ublk_need_map_io(ubq)) - return rq_bytes; - - /* - * no zero copy, we delay copy WRITE request data into ublksrv - * context and the big benefit is that pinning pages in current - * context is pretty fast, see ublk_pin_user_pages - */ - if (ublk_need_map_req(req)) { - struct iov_iter iter; - const int dir =3D ITER_DEST; - - if (import_ubuf(dir, u64_to_user_ptr(io->buf.addr), rq_bytes, - &iter) < 0) - return 0; + if (import_ubuf(dir, u64_to_user_ptr(io->buf.addr), blk_rq_bytes(req), + &iter) < 0) + return 0; =20 - return ublk_copy_user_pages(req, 0, &iter, dir); - } - return rq_bytes; + return ublk_copy_user_pages(req, 0, &iter, dir); } =20 -static unsigned int ublk_unmap_io(bool need_map, - const struct request *req, +static unsigned int ublk_unmap_io(const struct request *req, const struct ublk_io *io) { - const unsigned int rq_bytes =3D blk_rq_bytes(req); - - if (!need_map) - return rq_bytes; - - if (ublk_need_unmap_req(req)) { - struct iov_iter iter; - const int dir =3D ITER_SOURCE; + struct iov_iter iter; + const int dir =3D ITER_SOURCE; =20 - if (import_ubuf(dir, u64_to_user_ptr(io->buf.addr), io->res, - &iter) < 0) - return 0; + if (import_ubuf(dir, u64_to_user_ptr(io->buf.addr), io->res, &iter) < 0) + return 0; =20 - return ublk_copy_user_pages(req, 0, &iter, dir); - } - return rq_bytes; + return ublk_copy_user_pages(req, 0, &iter, dir); } =20 static bool ublk_validate_req(const struct ublk_queue *ubq, const struct request *req) { @@ -1588,26 +1564,17 @@ static inline void __ublk_complete_rq(struct reques= t *req, struct ublk_io *io, if (io->res < 0) { res =3D errno_to_blk_status(io->res); goto exit; } =20 - /* - * FLUSH, DISCARD or WRITE_ZEROES usually won't return bytes returned, so= end them - * directly. - * - * Both the two needn't unmap. - */ - if (req_op(req) !=3D REQ_OP_READ && req_op(req) !=3D REQ_OP_WRITE && - req_op(req) !=3D REQ_OP_DRV_IN) - goto exit; - /* shmem zero copy: no data to unmap, pages already shared */ - if (ublk_iod_is_shmem_zc(req->mq_hctx->driver_data, req->tag)) + if (!need_map || !ublk_need_unmap_req(req) || + ublk_iod_is_shmem_zc(req->mq_hctx->driver_data, req->tag)) goto exit; =20 /* for READ request, writing data in iod->addr to rq buffers */ - unmapped_bytes =3D ublk_unmap_io(need_map, req, io); + unmapped_bytes =3D ublk_unmap_io(req, io); =20 /* * Extremely impossible since we got data filled in just before * * Re-read simply for this unlikely case. @@ -1769,14 +1736,15 @@ static bool ublk_start_io(const struct ublk_queue *= ubq, struct request *req, struct ublk_io *io) { unsigned mapped_bytes; =20 /* shmem zero copy: skip data copy, pages already shared */ - if (ublk_iod_is_shmem_zc(ubq, req->tag)) + if (!ublk_need_map_io(ubq) || !ublk_need_map_req(req) || + ublk_iod_is_shmem_zc(ubq, req->tag)) return true; =20 - mapped_bytes =3D ublk_map_io(ubq, req, io); + mapped_bytes =3D ublk_map_io(req, io); =20 /* partially mapped, update io descriptor */ if (unlikely(mapped_bytes !=3D blk_rq_bytes(req))) { /* * Nothing mapped, retry until we succeed. --=20 2.54.0