bfqq->ttime.last_end_request +
                        bfqd->bfq_slice_idle * 3;
 
-       bfqg_stats_update_io_add(bfqq_group(RQ_BFQQ(rq)), bfqq, rq->cmd_flags);
 
        /*
         * bfqq deserves to be weight-raised if:
        if (rq->cmd_flags & REQ_META)
                bfqq->meta_pending--;
 
-       bfqg_stats_update_io_remove(bfqq_group(bfqq), rq->cmd_flags);
 }
 
 static bool bfq_bio_merge(struct blk_mq_hw_ctx *hctx, struct bio *bio)
                bfqq->next_rq = rq;
 
        bfq_remove_request(q, next);
+       bfqg_stats_update_io_remove(bfqq_group(bfqq), next->cmd_flags);
 
        spin_unlock_irq(&bfqq->bfqd->lock);
 end:
        spin_lock_irq(&bfqd->lock);
 
        rq = __bfq_dispatch_request(hctx);
+       if (rq && RQ_BFQQ(rq))
+               bfqg_stats_update_io_remove(bfqq_group(RQ_BFQQ(rq)),
+                                           rq->cmd_flags);
        spin_unlock_irq(&bfqd->lock);
 
        return rq;
 {
        struct request_queue *q = hctx->queue;
        struct bfq_data *bfqd = q->elevator->elevator_data;
+       struct bfq_queue *bfqq = RQ_BFQQ(rq);
 
        spin_lock_irq(&bfqd->lock);
        if (blk_mq_sched_try_insert_merge(q, rq)) {
                        list_add_tail(&rq->queuelist, &bfqd->dispatch);
        } else {
                __bfq_insert_request(bfqd, rq);
+               /*
+                * Update bfqq, because, if a queue merge has occurred
+                * in __bfq_insert_request, then rq has been
+                * redirected into a new queue.
+                */
+               bfqq = RQ_BFQQ(rq);
 
                if (rq_mergeable(rq)) {
                        elv_rqhash_add(q, rq);
                }
        }
 
+       if (bfqq)
+               bfqg_stats_update_io_add(bfqq_group(bfqq), bfqq, rq->cmd_flags);
+
        spin_unlock_irq(&bfqd->lock);
 }
 
                 * lock is held.
                 */
 
-               if (!RB_EMPTY_NODE(&rq->rb_node))
+               if (!RB_EMPTY_NODE(&rq->rb_node)) {
                        bfq_remove_request(rq->q, rq);
+                       bfqg_stats_update_io_remove(bfqq_group(bfqq),
+                                                   rq->cmd_flags);
+               }
                bfq_put_rq_priv_body(bfqq);
        }