On Thu, Sep 20, 2012 at 12:20:38PM -0700, Tejun Heo wrote: > On Thu, Sep 20, 2012 at 03:17:16PM -0400, Vivek Goyal wrote: > > I suspect we are looping in retry code because bio based queues never come > > out of bypass mode. > > > > /* > > * If queue was bypassing, we should retry. Do so after a > > * short msleep(). It isn't strictly necessary but queue > > * can be bypassing for some time and it's always nice to > > * avoid busy looping. > > */ > > if (ret == -EBUSY) { > > msleep(10); > > ret = restart_syscall(); > > } > > Yeah, I incorrectly assumed that bio based drivers would call > blk_init_allocated_queue(). I think we need to move the initial > bypass_end call to blk_register_queue(). Like the following. Not > completely sure yet tho. I can confirm that with this patch, hang issue is gone. I tried it on a dm device. Thanks Vivek > > diff --git a/block/blk-core.c b/block/blk-core.c > index 4b4dbdf..cbb019a 100644 > --- a/block/blk-core.c > +++ b/block/blk-core.c > @@ -714,9 +714,6 @@ blk_init_allocated_queue(struct request_queue *q, request_fn_proc *rfn, > return NULL; > > blk_queue_congestion_threshold(q); > - > - /* all done, end the initial bypass */ > - blk_queue_bypass_end(q); > return q; > } > EXPORT_SYMBOL(blk_init_allocated_queue); > diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c > index 9628b29..f53802e 100644 > --- a/block/blk-sysfs.c > +++ b/block/blk-sysfs.c > @@ -527,6 +527,8 @@ int blk_register_queue(struct gendisk *disk) > if (WARN_ON(!q)) > return -ENXIO; > > + blk_queue_bypass_end(q); > + > ret = blk_trace_init_sysfs(dev); > if (ret) > return ret; -- To unsubscribe from this list: send the line "unsubscribe cgroups" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html