Re: [PATCH for-6.18/block 02/16] block: initialize bio issue time in blk_mq_submit_bio()

kernel test robot
2025-09-06T15:28:02Z

Hi Yu,

kernel test robot noticed the following build errors:

[auto build test ERROR on axboe-block/for-next]
[also build test ERROR on linus/master v6.17-rc4 next-20250905]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url: https://github.com/intel-lab-lkp/linux/commits/Yu-Kuai/block-cleanup-bio_issue/20250905-153659
base: https://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git for-next
patch link: https://lore.kernel.org/r/20250905070643.2533483-3-yukuai1%40huaweicloud.com
patch subject: [PATCH for-6.18/block 02/16] block: initialize bio issue time in blk_mq_submit_bio()
config: i386-buildonly-randconfig-003-20250906 (https://download.01.org/0day-ci/archive/20250906/202509062332.tqE0Bc8k-lkp@intel.com/config)
compiler: gcc-13 (Debian 13.3.0-16) 13.3.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250906/202509062332.tqE0Bc8k-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202509062332.tqE0Bc8k-lkp@intel.com/

All errors (new ones prefixed by >>):

block/blk-mq.c: In function 'blk_mq_submit_bio':
>> block/blk-mq.c:3171:12: error: 'struct bio' has no member named 'issue_time_ns'
3171 | bio->issue_time_ns = blk_time_get_ns();
| ^~

vim +3171 block/blk-mq.c

3097
3098 /**
3099 * blk_mq_submit_bio - Create and send a request to block device.
3100 * @bio: Bio pointer.
3101 *
3102 * Builds up a request structure from @q and @bio and send to the device. The
3103 * request may not be queued directly to hardware if:
3104 * * This request can be merged with another one
3105 * * We want to place request at plug queue for possible future merging
3106 * * There is an IO scheduler active at this queue
3107 *
3108 * It will not queue the request if there is an error with the bio, or at the
3109 * request creation.
3110 */
3111 void blk_mq_submit_bio(struct bio *bio)
3112 {
3113 struct request_queue *q = bdev_get_queue(bio->bi_bdev);
3114 struct blk_plug *plug = current->plug;
3115 const int is_sync = op_is_sync(bio->bi_opf);
3116 struct blk_mq_hw_ctx *hctx;
3117 unsigned int nr_segs;
3118 struct request *rq;
3119 blk_status_t ret;
3120
3121 /*
3122 * If the plug has a cached request for this queue, try to use it.
3123 */
3124 rq = blk_mq_peek_cached_request(plug, q, bio->bi_opf);
3125
3126 /*
3127 * A BIO that was released from a zone write plug has already been
3128 * through the preparation in this function, already holds a reference
3129 * on the queue usage counter, and is the only write BIO in-flight for
3130 * the target zone. Go straight to preparing a request for it.
3131 */
3132 if (bio_zone_write_plugging(bio)) {
3133 nr_segs = bio->__bi_nr_segments;
3134 if (rq)
3135 blk_queue_exit(q);
3136 goto new_request;
3137 }
3138
3139 /*
3140 * The cached request already holds a q_usage_counter reference and we
3141 * don't have to acquire a new one if we use it.
3142 */
3143 if (!rq) {
3144 if (unlikely(bio_queue_enter(bio)))
3145 return;
3146 }
3147
3148 /*
3149 * Device reconfiguration may change logical block size or reduce the
3150 * number of poll queues, so the checks for alignment and poll support
3151 * have to be done with queue usage counter held.
3152 */
3153 if (unlikely(bio_unaligned(bio, q))) {
3154 bio_io_error(bio);
3155 goto queue_exit;
3156 }
3157
3158 if ((bio->bi_opf & REQ_POLLED) && !blk_mq_can_poll(q)) {
3159 bio->bi_status = BLK_STS_NOTSUPP;
3160 bio_endio(bio);
3161 goto queue_exit;
3162 }
3163
3164 bio = __bio_split_to_limits(bio, &q->limits, &nr_segs);
3165 if (!bio)
3166 goto queue_exit;
3167
3168 if (!bio_integrity_prep(bio))
3169 goto queue_exit;
3170
> 3171 bio->issue_time_ns = blk_time_get_ns();
3172 if (blk_mq_attempt_bio_merge(q, bio, nr_segs))
3173 goto queue_exit;
3174
3175 if (bio_needs_zone_write_plugging(bio)) {
3176 if (blk_zone_plug_bio(bio, nr_segs))
3177 goto queue_exit;
3178 }
3179
3180 new_request:
3181 if (rq) {
3182 blk_mq_use_cached_rq(rq, plug, bio);
3183 } else {
3184 rq = blk_mq_get_new_requests(q, plug, bio);
3185 if (unlikely(!rq)) {
3186 if (bio->bi_opf & REQ_NOWAIT)
3187 bio_wouldblock_error(bio);
3188 goto queue_exit;
3189 }
3190 }
3191
3192 trace_block_getrq(bio);
3193
3194 rq_qos_track(q, rq, bio);
3195
3196 blk_mq_bio_to_request(rq, bio, nr_segs);
3197
3198 ret = blk_crypto_rq_get_keyslot(rq);
3199 if (ret != BLK_STS_OK) {
3200 bio->bi_status = ret;
3201 bio_endio(bio);
3202 blk_mq_free_request(rq);
3203 return;
3204 }
3205
3206 if (bio_zone_write_plugging(bio))
3207 blk_zone_write_plug_init_request(rq);
3208
3209 if (op_is_flush(bio->bi_opf) && blk_insert_flush(rq))
3210 return;
3211
3212 if (plug) {
3213 blk_add_rq_to_plug(plug, rq);
3214 return;
3215 }
3216
3217 hctx = rq->mq_hctx;
3218 if ((rq->rq_flags & RQF_USE_SCHED) ||
3219 (hctx->dispatch_busy && (q->nr_hw_queues == 1 || !is_sync))) {
3220 blk_mq_insert_request(rq, 0);
3221 blk_mq_run_hw_queue(hctx, true);
3222 } else {
3223 blk_mq_run_dispatch_ops(q, blk_mq_try_issue_directly(hctx, rq));
3224 }
3225 return;
3226
3227 queue_exit:
3228 /*
3229 * Don't drop the queue reference if we were trying to use a cached
3230 * request and thus didn't acquire one.
3231 */
3232 if (!rq)
3233 blk_queue_exit(q);
3234 }
3235

--
0-DAY CI Kernel Test Service