On Fri, 2018-04-20 at 14:55 +0800, jianchao.wang wrote: > Hi Bart > > On 04/20/2018 12:43 AM, Bart Van Assche wrote: > > Use the deadline instead of the request generation to detect whether > > or not a request timer fired after reinitialization of a request > > Maybe use deadline to do this is not suitable. > > Let's think of the following scenario. > > T1/T2 times in nano seconds > J1/J2 times in jiffies > > rq is started at T1,J1 > blk_mq_timeout_work > -> blk_mq_check_expired > -> save rq->__deadline (J1 + MQ_RQ_IN_FLIGHT) > > rq is completed and freed > rq is allocated and started again on T2 > rq->__deadline = J2 + MQ_RQ_IN_FLIGHT > -> synchronize srcu/rcu > -> blk_mq_terminate_expired > -> rq->__deadline (J2 + MQ_RQ_IN_FLIGHT) > > 1. deadline = rq->__deadline & ~RQ_STATE_MASK (0x3) > if J2-J1 < 4 jiffies, we will get the same deadline value. > > 2. even if we do some bit shift when save and get deadline > if T2 - T1 < time of 1 jiffies, we sill get the same deadline. Hello Jianchao, How about using the upper 16 or 32 bits of rq->__deadline to store a generation number? I don't know any block driver for which the product of (deadline in seconds) and HZ exceeds (1 << 32). Thanks, Bart.