hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/block/bfq-iosched.c
....@@ -373,6 +373,12 @@
373373
374374 void bic_set_bfqq(struct bfq_io_cq *bic, struct bfq_queue *bfqq, bool is_sync)
375375 {
376
+ struct bfq_queue *old_bfqq = bic->bfqq[is_sync];
377
+
378
+ /* Clear bic pointer if bfqq is detached from this bic */
379
+ if (old_bfqq && old_bfqq->bic == bic)
380
+ old_bfqq->bic = NULL;
381
+
376382 bic->bfqq[is_sync] = bfqq;
377383 }
378384
....@@ -2810,7 +2816,7 @@
28102816 /*
28112817 * Merge queues (that is, let bic redirect its requests to new_bfqq)
28122818 */
2813
- bic_set_bfqq(bic, new_bfqq, 1);
2819
+ bic_set_bfqq(bic, new_bfqq, true);
28142820 bfq_mark_bfqq_coop(new_bfqq);
28152821 /*
28162822 * new_bfqq now belongs to at least two bics (it is a shared queue):
....@@ -4974,9 +4980,8 @@
49744980 unsigned long flags;
49754981
49764982 spin_lock_irqsave(&bfqd->lock, flags);
4977
- bfqq->bic = NULL;
4978
- bfq_exit_bfqq(bfqd, bfqq);
49794983 bic_set_bfqq(bic, NULL, is_sync);
4984
+ bfq_exit_bfqq(bfqd, bfqq);
49804985 spin_unlock_irqrestore(&bfqd->lock, flags);
49814986 }
49824987 }
....@@ -5062,9 +5067,11 @@
50625067
50635068 bfqq = bic_to_bfqq(bic, false);
50645069 if (bfqq) {
5065
- bfq_release_process_ref(bfqd, bfqq);
5066
- bfqq = bfq_get_queue(bfqd, bio, BLK_RW_ASYNC, bic);
5070
+ struct bfq_queue *old_bfqq = bfqq;
5071
+
5072
+ bfqq = bfq_get_queue(bfqd, bio, false, bic);
50675073 bic_set_bfqq(bic, bfqq, false);
5074
+ bfq_release_process_ref(bfqd, old_bfqq);
50685075 }
50695076
50705077 bfqq = bic_to_bfqq(bic, true);
....@@ -6004,7 +6011,7 @@
60046011 return bfqq;
60056012 }
60066013
6007
- bic_set_bfqq(bic, NULL, 1);
6014
+ bic_set_bfqq(bic, NULL, true);
60086015
60096016 bfq_put_cooperator(bfqq);
60106017