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


Reply via email to