On Tue, Nov 19 2013, Christoph Hellwig wrote: > On Tue, Nov 19, 2013 at 07:02:18PM +1100, Dave Chinner wrote: > > I have no idea if it's related to the above hang, but either way > > breaking iostat is a major regression.... > > Both of them are most likely due to the conversion of virtio_blk > to the blk-mq code. > > I've not seen the hang in my heavy xfstests testing, but that was a > slightly different codebase than what finally got in, so I'll try > to reproduce it once I get some spare QA cycles.
Thanks! Dave, if you still have it in that state, can you dump the contents of /sys/block/<devs>/mq/ for the device/devices that are hung? > The missing stats should be solved by something like the patch below > (untested so far): > > > diff --git a/block/blk-mq.c b/block/blk-mq.c > index 862f458..41e3b85 100644 > --- a/block/blk-mq.c > +++ b/block/blk-mq.c > @@ -175,7 +175,7 @@ static void blk_mq_rq_ctx_init(struct blk_mq_ctx *ctx, > struct request *rq, > unsigned int rw_flags) > { > rq->mq_ctx = ctx; > - rq->cmd_flags = rw_flags; > + rq->cmd_flags = rw_flags | REQ_IO_STAT; > ctx->rq_dispatched[rw_is_sync(rw_flags)]++; > } I have queued up the below. diff --git a/block/blk-mq.c b/block/blk-mq.c index 862f458..ef90f18 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -171,9 +171,12 @@ bool blk_mq_can_queue(struct blk_mq_hw_ctx *hctx) } EXPORT_SYMBOL(blk_mq_can_queue); -static void blk_mq_rq_ctx_init(struct blk_mq_ctx *ctx, struct request *rq, - unsigned int rw_flags) +static void blk_mq_rq_ctx_init(struct request_queue *q, struct blk_mq_ctx *ctx, + struct request *rq, unsigned int rw_flags) { + if (blk_queue_io_stat(q)) + rw_flags |= REQ_IO_STAT; + rq->mq_ctx = ctx; rq->cmd_flags = rw_flags; ctx->rq_dispatched[rw_is_sync(rw_flags)]++; @@ -197,7 +200,7 @@ static struct request *blk_mq_alloc_request_pinned(struct request_queue *q, rq = __blk_mq_alloc_request(hctx, gfp & ~__GFP_WAIT, reserved); if (rq) { - blk_mq_rq_ctx_init(ctx, rq, rw); + blk_mq_rq_ctx_init(q, ctx, rq, rw); break; } else if (!(gfp & __GFP_WAIT)) break; @@ -921,7 +924,7 @@ static void blk_mq_make_request(struct request_queue *q, struct bio *bio) trace_block_getrq(q, bio, rw); rq = __blk_mq_alloc_request(hctx, GFP_ATOMIC, false); if (likely(rq)) - blk_mq_rq_ctx_init(ctx, rq, rw); + blk_mq_rq_ctx_init(q, ctx, rq, rw); else { blk_mq_put_ctx(ctx); trace_block_sleeprq(q, bio, rw); -- Jens Axboe -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/