On 6/28/18 1:52 PM, Steven Rostedt wrote: > On Thu, 28 Jun 2018 09:27:08 +0200 > Johannes Thumshirn <jthumshirn@xxxxxxx> wrote: > >> Hi Ming, >> >> On Thu, Jun 28, 2018 at 11:19:16AM +0800, Ming Lei wrote: >>> + list_for_each_entry(rq, list, queuelist) { >>> BUG_ON(rq->mq_ctx != ctx); >>> - list_del_init(&rq->queuelist); >>> - __blk_mq_insert_req_list(hctx, rq, false); >>> + trace_block_rq_insert(hctx->queue, rq); >>> } >> >> I wonder if we really need the above loop unconditionally. It does >> some BUG_ON() sanity checking (which I hate but it was already there >> so not your problem) and tracing of the request insertion. >> >> So can we maybe only run this loop if tracing is enabled? Not sure if >> this is possible though. Maybe Steven (Cced) can help here. > > Yes: > > if (trace_block_rq_insert_enabled()) { > list_for_each_entry(rq, list, queuelist) { > BUG_ON(rq->mq_ctx != ctx); > list_del_init(&rq->queuelist); > __blk_mq_insert_req_list(hctx, rq, false); > trace_block_rq_insert(hctx->queue, rq); > } > } > > This will only call the loop if the trace event "block_rq_insert" has > been activated. It also uses the jump label infrastructure, so that if > statement is a non-conditional branch (static_key_false()). This works for both ftrace and blktrace? -- Jens Axboe