[PATCH v2 1/8] ublk: consistently use u16 for queue and tag numbers
Caleb Sander Mateos <[email protected]> Mon, 3 Aug 2026 15:14:33 -0600
| Newsgroups | org.kernel.vger.linux-block,org.kernel.vger.linux-kernel,org.kernel.vger.linux-kselftest |
|---|---|
| Message-ID | <[email protected]> |
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 <[email protected]> Reviewed-by: Ming Lei <[email protected]> --- 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; struct ublk_queue { - int q_id; - int q_depth; + u16 q_id; + u16 q_depth; unsigned long flags; struct ublksrv_io_desc *io_cmd_buf; bool force_abort; bool canceling; bool fail_io; /* copy of dev->state == UBLK_S_DEV_FAIL_IO */ spinlock_t cancel_lock; struct ublk_device *dev; - u32 nr_io_ready; + u16 nr_io_ready; /* * 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; struct ublk_params params; - 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_queue *q) WARN_ON_ONCE(!kfifo_is_empty(&q->evts_fifo)); kfifo_free(&q->evts_fifo); } 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]; } 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 struct ublk_device *ub) static inline bool ublk_support_shmem_zc(const struct ublk_queue *ubq) { return ubq->flags & UBLK_F_SHMEM_ZC; } -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; } 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_batch_fetch_cmd *fcmd, static unsigned int unprivileged_ublks_max = 64; static unsigned int unprivileged_ublks_added; /* protected by ublk_ctl_mutex */ static struct miscdevice ublk_misc; -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; } static inline unsigned ublk_pos_to_buf_off(loff_t pos) { return (pos - UBLKSRV_IO_BUF_OFFSET) & UBLK_IO_BUF_BITS_MASK; } -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; } @@ -1229,22 +1228,22 @@ static noinline void ublk_put_device(struct ublk_device *ub) { put_device(&ub->cdev_dev); } static inline struct ublk_queue *ublk_get_queue(struct ublk_device *dev, - int qid) + u16 qid) { return dev->queues[qid]; } 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; } -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); } static inline int ublk_queue_cmd_buf_size(struct ublk_device *ub) @@ -1665,11 +1664,11 @@ static inline void __ublk_abort_rq(struct ublk_queue *ubq, else ublk_end_request(rq, BLK_STS_IOERR); } 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 = ublk_get_iod(ubq, tag); iod->op_flags |= UBLK_IO_F_NEED_REG_BUF; } @@ -1776,11 +1775,11 @@ static bool ublk_start_io(const struct ublk_queue *ubq, struct request *req, } static void ublk_dispatch_req(struct ublk_queue *ubq, struct request *req) { unsigned int issue_flags = IO_URING_CMD_TASK_WORK_ISSUE_FLAGS; - int tag = req->tag; + u16 tag = req->tag; struct ublk_io *io = &ubq->ios[tag]; 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 = { .timeout = ublk_timeout, }; static void ublk_queue_reinit(struct ublk_device *ub, struct ublk_queue *ubq) { - int i; + u16 i; ubq->nr_io_ready = 0; for (i = 0; i < ubq->q_depth; i++) { struct ublk_io *io = &ubq->ios[i]; @@ -2411,11 +2410,11 @@ static int ublk_ch_open(struct inode *inode, struct file *filp) return 0; } static void ublk_reset_ch_dev(struct ublk_device *ub) { - int i; + u16 i; for (i = 0; i < ub->dev_info.nr_hw_queues; i++) { struct ublk_queue *ubq = ublk_get_queue(ub, i); /* Sync with ublk_cancel_cmd() */ @@ -2483,20 +2482,20 @@ static void ublk_partition_scan_work(struct work_struct *work) * means. */ static void ublk_set_canceling(struct ublk_device *ub, bool canceling) __must_hold(&ub->cancel_mutex) { - int i; + u16 i; ub->canceling = canceling; for (i = 0; i < ub->dev_info.nr_hw_queues; i++) ublk_get_queue(ub, i)->canceling = canceling; } static bool ublk_check_and_reset_active_ref(struct ublk_device *ub) { - int i, j; + u16 i, j; if (!ublk_dev_need_req_ref(ub)) return false; for (i = 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 = container_of(work, struct ublk_device, exit_work.work); struct gendisk *disk; - int i; + u16 i; /* * 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 vm_area_struct *vma) { struct ublk_device *ub = filp->private_data; size_t sz = vma->vm_end - vma->vm_start; unsigned max_sz = ublk_max_cmd_buf_size(); unsigned long pfn, end, phys_off = vma->vm_pgoff << PAGE_SHIFT; - int q_id, ret = 0; + int ret = 0; + u16 q_id; spin_lock(&ub->lock); if (!ub->mm) ub->mm = current->mm; if (current->mm != ub->mm) @@ -2717,11 +2717,11 @@ static void ublk_abort_batch_queue(struct ublk_device *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 *ubq) { - int i; + u16 i; for (i = 0; i < ubq->q_depth; i++) { struct ublk_io *io = &ubq->ios[i]; if (io->flags & UBLK_IO_FLAG_OWNED_BY_SRV) @@ -2760,11 +2760,11 @@ static void ublk_start_cancel(struct ublk_device *ub) out: mutex_unlock(&ub->cancel_mutex); ublk_put_disk(disk); } -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 = &ubq->ios[tag]; struct ublk_device *ub = ubq->dev; struct io_uring_cmd *cmd = NULL; @@ -2911,11 +2911,11 @@ static inline bool ublk_dev_ready(const struct ublk_device *ub) return ub->nr_queue_ready == ub->dev_info.nr_hw_queues; } static void ublk_cancel_queue(struct ublk_queue *ubq) { - int i; + u16 i; if (ublk_support_batch_io(ubq)) { ublk_batch_cancel_queue(ubq); return; } @@ -2925,11 +2925,11 @@ static void ublk_cancel_queue(struct ublk_queue *ubq) } /* Cancel all pending commands, must be called after del_gendisk() returns */ static void ublk_cancel_dev(struct ublk_device *ub) { - int i; + u16 i; for (i = 0; i < ub->dev_info.nr_hw_queues; i++) ublk_cancel_queue(ublk_get_queue(ub, i)); } @@ -2959,11 +2959,11 @@ static void ublk_wait_tagset_rqs_idle(struct ublk_device *ub) } } static void ublk_force_abort_dev(struct ublk_device *ub) { - int i; + u16 i; pr_devel("%s: force abort ub: dev_id %d state %s\n", __func__, ub->dev_info.dev_id, ub->dev_info.state == UBLK_S_DEV_LIVE ? "LIVE" : "QUIESCED"); @@ -3156,11 +3156,11 @@ ublk_config_io_buf(const struct ublk_device *ub, struct ublk_io *io, return 0; } 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 = ublk_get_uring_cmd_pdu(cmd); /* * 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_uring_cmd *cmd, unsigned int issue_flags) { const struct ublksrv_io_cmd *ub_cmd = io_uring_sqe_cmd(cmd->sqe, struct ublksrv_io_cmd); struct ublk_device *ub = cmd->file->private_data; - unsigned tag = READ_ONCE(ub_cmd->tag); - unsigned q_id = READ_ONCE(ub_cmd->q_id); + u16 tag = READ_ONCE(ub_cmd->tag); + u16 q_id = READ_ONCE(ub_cmd->q_id); unsigned index = READ_ONCE(ub_cmd->addr); struct ublk_queue *ubq; struct ublk_io *io; if (cmd->cmd_op == UBLK_U_IO_UNREGISTER_IO_BUF) @@ -4167,11 +4167,12 @@ static const struct file_operations ublk_ch_batch_io_fops = { .mmap = ublk_ch_mmap, }; static void __ublk_deinit_queue(struct ublk_device *ub, struct ublk_queue *ubq) { - int size, i; + int size; + u16 i; size = ublk_queue_cmd_buf_size(ub); for (i = 0; i < ubq->q_depth; i++) { struct ublk_io *io = &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); kvfree(ubq); } -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 = ub->queues[q_id]; if (!ubq) return; __ublk_deinit_queue(ub, ubq); ub->queues[q_id] = NULL; } -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; /* 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_device *ub, int q_id) } return NUMA_NO_NODE; } -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 = ub->dev_info.queue_depth; + u16 depth = ub->dev_info.queue_depth; gfp_t gfp_flags = GFP_KERNEL | __GFP_ZERO; struct ublk_queue *ubq; struct page *page; int numa_node; - int size, i, ret; + int size, ret; + u16 i; /* Determine NUMA node based on queue's CPU affinity */ numa_node = ublk_get_queue_numa_node(ub, q_id); /* 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; } static void ublk_deinit_queues(struct ublk_device *ub) { - int i; + u16 i; for (i = 0; i < ub->dev_info.nr_hw_queues; i++) ublk_deinit_queue(ub, i); } static int ublk_init_queues(struct ublk_device *ub) { - int i, ret; + int ret; + u16 i; for (i = 0; i < ub->dev_info.nr_hw_queues; i++) { ret = ublk_init_queue(ub, i); if (ret) goto fail; @@ -5179,11 +5182,11 @@ static int ublk_ctrl_set_size(struct ublk_device *ub, const struct ublksrv_ctrl_ return ret; } struct count_busy { const struct ublk_queue *ubq; - unsigned int nr_busy; + u16 nr_busy; }; static bool ublk_count_busy_req(struct request *rq, void *data) { struct count_busy *idle = 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; while (elapsed < timeout_ms && !signal_pending(current)) { - unsigned int queues_cancelable = 0; - int i; + u16 i, queues_cancelable = 0; for (i = 0; i < ub->dev_info.nr_hw_queues; i++) { struct ublk_queue *ubq = ublk_get_queue(ub, i); queues_cancelable += !!ubq_has_idle_io(ubq); -- 2.54.0