{
        struct bfq_entity *entity = &bfqq->entity;
 
+       /*
+        * Get extra reference to prevent bfqq from being freed in
+        * next possible expire or deactivate.
+        */
+       bfqq->ref++;
+
        /* If bfqq is empty, then bfq_bfqq_expire also invokes
         * bfq_del_bfqq_busy, thereby removing bfqq and its entity
         * from data structures related to current group. Otherwise we
                bfq_bfqq_expire(bfqd, bfqd->in_service_queue,
                                false, BFQQE_PREEMPTED);
 
-       /*
-        * get extra reference to prevent bfqq from being freed in
-        * next possible deactivate
-        */
-       bfqq->ref++;
-
        if (bfq_bfqq_busy(bfqq))
                bfq_deactivate_bfqq(bfqd, bfqq, false, false);
        else if (entity->on_st_or_in_serv)
 
        if (!bfqd->in_service_queue && !bfqd->rq_in_driver)
                bfq_schedule_dispatch(bfqd);
-       /* release extra ref taken above */
+       /* release extra ref taken above, bfqq may happen to be freed now */
        bfq_put_queue(bfqq);
 }