diff --git a/block/bfq-cgroup.c b/block/bfq-cgroup.c index ecd3d0ec2f3b68c7fe6b9ceb453402da2454c4ce..f60089b7269185c26d00051f665a5303de3b3314 100644 --- a/block/bfq-cgroup.c +++ b/block/bfq-cgroup.c @@ -567,6 +567,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) @@ -585,6 +591,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); } /**