Re: [PATCH V3 6/8] block: introduce preempt version of blk_[freeze|unfreeze]_queue

Ming Lei
2017-09-04T16:20:24Z

On Mon, Sep 04, 2017 at 03:21:08PM +0000, Bart Van Assche wrote:
> On Sat, 2017-09-02 at 21:08 +0800, Ming Lei wrote:
> > --- a/include/linux/blkdev.h
> > +++ b/include/linux/blkdev.h
> > @@ -565,6 +565,10 @@ struct request_queue {
> >
> > int bypass_depth;
> > atomic_t mq_freeze_depth;
> > + spinlock_t freeze_lock;
> > + unsigned normal_freezing:1;
> > + unsigned preempt_freezing:1;
> > + unsigned preempt_unfreezing:1;
> >
> > #if defined(CONFIG_BLK_DEV_BSG)
> > bsg_job_fn *bsg_job_fn;
>
> Requests queues already have to many states and you want to make request queues
> even more complicated by introducing several new state variables? Yikes!

The three flags are used in freeze/unfreeze path only, and I don't think
they are too complicated to maintain. Actually each state are simply
enough:

- normal_freezing means the queue is in normal freezing, it is set
before blk_queue_freeze() returns. In this state, no any request
can be allocated from the queue, just like current blk queue
freezing.

- preempt_freezing means the queue is in preempt freezing, the flag
is set before blk_queue_freeze_preempt() returns successfully. In
this state, only RQF_PREEMPT is allowed to be allocated.

- preempt_unfreezing means the queue is in preempt unfreezing, just
set in the entry of blk_queue_unfreeze_preempt(). In this state,
no any request can be allocated from the queue.

--
Ming