Messages in this thread | | | Date | Wed, 16 Apr 2008 18:42:19 +0200 | From | Jens Axboe <> | Subject | Re: Block: Prevent busy looping |
| |
On Wed, Apr 16 2008, Jens Axboe wrote: > On Wed, Apr 16 2008, Elias Oltmanns wrote: > > blk_run_queue() as well as blk_start_queue() plug the device on reentry > > and schedule blk_unplug_work() right afterwards. However, > > blk_plug_device() takes care of that already and makes sure that there is > > a short delay before blk_unplug_work() is scheduled. This is important > > to prevent busy looping and possibly system lockups as observed here: > > <http://permalink.gmane.org/gmane.linux.ide/28351>. > > If you call blk_start_queue() and blk_run_queue(), you better mean it. > There should be no delay. The only reason it does blk_plug_device() is > so that the work queue function will actually do some work. In the newer > kernels we just do: > > set_bit(QUEUE_FLAG_PLUGGED, &q->queue_flags); > kblockd_schedule_work(q, &q->unplug_work); > > instead, which is much better.
actually that's only in my devel tree, not in mainline yet (which still does blk_plug_device() instead of just setting the plugged bit).
-- Jens Axboe
| |