]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - block/bfq-iosched.c
block, bfq: fix wrong init of saved start time for weight raising
[mirror_ubuntu-bionic-kernel.git] / block / bfq-iosched.c
index a4783da90ba882f29ac1159b67dc1b24296ead5b..c25955c25e033204293c479b0fbe738ef9129faf 100644 (file)
@@ -1202,6 +1202,24 @@ static unsigned int bfq_wr_duration(struct bfq_data *bfqd)
        return dur;
 }
 
+/*
+ * Return the farthest future time instant according to jiffies
+ * macros.
+ */
+static unsigned long bfq_greatest_from_now(void)
+{
+       return jiffies + MAX_JIFFY_OFFSET;
+}
+
+/*
+ * Return the farthest past time instant according to jiffies
+ * macros.
+ */
+static unsigned long bfq_smallest_from_now(void)
+{
+       return jiffies - MAX_JIFFY_OFFSET;
+}
+
 static void bfq_update_bfqq_wr_on_rq_arrival(struct bfq_data *bfqd,
                                             struct bfq_queue *bfqq,
                                             unsigned int old_wr_coeff,
@@ -1216,7 +1234,19 @@ static void bfq_update_bfqq_wr_on_rq_arrival(struct bfq_data *bfqd,
                        bfqq->wr_coeff = bfqd->bfq_wr_coeff;
                        bfqq->wr_cur_max_time = bfq_wr_duration(bfqd);
                } else {
-                       bfqq->wr_start_at_switch_to_srt = jiffies;
+                       /*
+                        * No interactive weight raising in progress
+                        * here: assign minus infinity to
+                        * wr_start_at_switch_to_srt, to make sure
+                        * that, at the end of the soft-real-time
+                        * weight raising periods that is starting
+                        * now, no interactive weight-raising period
+                        * may be wrongly considered as still in
+                        * progress (and thus actually started by
+                        * mistake).
+                        */
+                       bfqq->wr_start_at_switch_to_srt =
+                               bfq_smallest_from_now();
                        bfqq->wr_coeff = bfqd->bfq_wr_coeff *
                                BFQ_SOFTRT_WEIGHT_FACTOR;
                        bfqq->wr_cur_max_time =
@@ -2897,24 +2927,6 @@ static unsigned long bfq_bfqq_softrt_next_start(struct bfq_data *bfqd,
                   jiffies + nsecs_to_jiffies(bfqq->bfqd->bfq_slice_idle) + 4);
 }
 
-/*
- * Return the farthest future time instant according to jiffies
- * macros.
- */
-static unsigned long bfq_greatest_from_now(void)
-{
-       return jiffies + MAX_JIFFY_OFFSET;
-}
-
-/*
- * Return the farthest past time instant according to jiffies
- * macros.
- */
-static unsigned long bfq_smallest_from_now(void)
-{
-       return jiffies - MAX_JIFFY_OFFSET;
-}
-
 /**
  * bfq_bfqq_expire - expire a queue.
  * @bfqd: device owning the queue.