Re: [PATCH V2 04/16] block, bfq: modify the peak-rate estimator
From: Bart Van Assche
Date: Fri Mar 31 2017 - 11:32:00 EST
On Fri, 2017-03-31 at 14:47 +0200, Paolo Valente wrote:
> -static bool bfq_update_peak_rate(struct bfq_data *bfqd, struct bfq_queue *bfqq,
> - bool compensate)
> +static bool bfq_bfqq_is_slow(struct bfq_data *bfqd, struct bfq_queue *bfqq,
> + bool compensate, enum bfqq_expiration reason,
> + unsigned long *delta_ms)
> {
> - u64 bw, usecs, expected, timeout;
> - ktime_t delta;
> - int update = 0;
> + ktime_t delta_ktime;
> + u32 delta_usecs;
> + bool slow = BFQQ_SEEKY(bfqq); /* if delta too short, use seekyness */
>
> - if (!bfq_bfqq_sync(bfqq) || bfq_bfqq_budget_new(bfqq))
> + if (!bfq_bfqq_sync(bfqq))
> return false;
>
> if (compensate)
> - delta = bfqd->last_idling_start;
> + delta_ktime = bfqd->last_idling_start;
> else
> - delta = ktime_get();
> - delta = ktime_sub(delta, bfqd->last_budget_start);
> - usecs = ktime_to_us(delta);
> -
> - /* Don't trust short/unrealistic values. */
> - if (usecs < 100 || usecs >= LONG_MAX)
> - return false;
> -
> - /*
> - * Calculate the bandwidth for the last slice. We use a 64 bit
> - * value to store the peak rate, in sectors per usec in fixed
> - * point math. We do so to have enough precision in the estimate
> - * and to avoid overflows.
> - */
> - bw = (u64)bfqq->entity.service << BFQ_RATE_SHIFT;
> - do_div(bw, (unsigned long)usecs);
> + delta_ktime = ktime_get();
> + delta_ktime = ktime_sub(delta_ktime, bfqd->last_budget_start);
> + delta_usecs = ktime_to_us(delta_ktime);
> +
This patch changes the type of the variable in which the result of ktime_to_us()
is stored from u64 into u32 and next compares that result with LONG_MAX. Since
ktime_to_us() returns a signed 64-bit number, are you sure you want to store that
result in a 32-bit variable? If ktime_to_us() would e.g. return 0xffffffff00000100
or 0x100000100 then the assignment will truncate these numbers to 0x100.
Bart.