block, bfq: get extra ref to prevent a queue from being freed during a group move
[platform/kernel/linux-starfive.git] / block / bfq-cgroup.c
index e1419ed..8ab7f18 100644 (file)
@@ -651,6 +651,12 @@ void bfq_bfqq_move(struct bfq_data *bfqd, struct bfq_queue *bfqq,
                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)
@@ -670,6 +676,8 @@ void bfq_bfqq_move(struct bfq_data *bfqd, struct bfq_queue *bfqq,
 
        if (!bfqd->in_service_queue && !bfqd->rq_in_driver)
                bfq_schedule_dispatch(bfqd);
+       /* release extra ref taken above */
+       bfq_put_queue(bfqq);
 }
 
 /**