Hi bart
I add debug log in blk_mq_add_timer as following
void blk_mq_add_timer(struct request *req, enum mq_rq_state old,
enum mq_rq_state new)
{
struct request_queue *q = req->q;
if (!req->timeout)
req->timeout = q->rq_timeout;
if (!blk_mq_rq_set_deadline(req, jiffies + req->timeout, old, new))
WARN_ON_ONCE(true);
trace_printk("jiffies %lx to %x ldl %lx gen %u dl %x\n",
jiffies,
req->timeout,
blk_rq_deadline(req),
req->das.generation,
req->das.deadline);
return __blk_add_timer(req);
}
And get log below:
jbd2/sda2-8-320 [000] ...1 95.030824: blk_mq_add_timer: jiffies
ffff37c0 to 1d4c ldl ffff550c40000000 gen 0 dl ffff550c
kworker/0:1H-136 [000] ...1 95.031822: blk_mq_add_timer: jiffies
ffff37c0 to 1d4c ldl ffff550c40000000 gen 0 dl ffff550c
kworker/6:1H-244 [006] ...1 95.041695: blk_mq_add_timer: jiffies
ffff37c3 to 1d4c ldl ffff550f40000000 gen 0 dl ffff550f
kworker/6:1H-244 [006] ...1 95.041954: blk_mq_add_timer: jiffies
ffff37c3 to 1d4c ldl ffff550f40000000 gen 0 dl ffff550f
The blk_rq_deadline return ffff550c40000000 which looks really crazy.
It should be due to union blk_deadline_and_state.
+union blk_deadline_and_state {
+ struct {
+ uint32_t generation:30;
+ uint32_t state:2;
+ uint32_t deadline;
+ };
+ unsigned long legacy_deadline;
+ uint64_t das;
+};
And generation never change.
Thanks
Jianchao