[PATCH] um: time-travel: actually apply "free-until" optimisation
Richard Weinberger
richard.weinberger at gmail.com
Thu Dec 10 17:28:44 EST 2020
On Thu, Dec 3, 2020 at 3:37 PM Johannes Berg <johannes at sipsolutions.net> wrote:
>
> From: Johannes Berg <johannes.berg at intel.com>
>
> Due a bug - we never checked the time_travel_ext_free_until value - we
> were always requesting time for every single scheduling. This adds up
> since we make reading time cost 256ns, and it's a fairly common call.
> Fix this.
>
> While at it, also make reading time only cost something when we're not
> currently waiting for our scheduling turn - otherwise things get mixed
> up in a very confusing way. We should never get here, since we're not
> actually running, but it's possible if you stick printk() or such into
> the virtio code that must handle the external interrupts.
>
> Signed-off-by: Johannes Berg <johannes.berg at intel.com>
> ---
> arch/um/kernel/time.c | 12 +++++++++++-
> 1 file changed, 11 insertions(+), 1 deletion(-)
>
> diff --git a/arch/um/kernel/time.c b/arch/um/kernel/time.c
> index 303565ce8c64..5ac084deac7e 100644
> --- a/arch/um/kernel/time.c
> +++ b/arch/um/kernel/time.c
> @@ -183,6 +183,14 @@ static void time_travel_ext_update_request(unsigned long long time)
> time == time_travel_ext_prev_request)
> return;
>
> + /*
> + * if we're running and are allowed to run past the request
> + * then we don't need to update it either
> + */
> + if (!time_travel_ext_waiting && time_travel_ext_free_until_valid &&
> + time < time_travel_ext_free_until)
> + return;
> +
> time_travel_ext_prev_request = time;
> time_travel_ext_prev_request_valid = true;
> time_travel_ext_req(UM_TIMETRAVEL_REQUEST, time);
> @@ -217,6 +225,7 @@ static void time_travel_ext_wait(bool idle)
> };
>
> time_travel_ext_prev_request_valid = false;
> + time_travel_ext_free_until_valid = false;
> time_travel_ext_waiting++;
>
> time_travel_ext_req(UM_TIMETRAVEL_WAIT, -1);
> @@ -639,7 +648,8 @@ static u64 timer_read(struct clocksource *cs)
> * "what do I do next" and onstack event we use to know when
> * to return from time_travel_update_time().
> */
> - if (!irqs_disabled() && !in_interrupt() && !in_softirq())
> + if (!irqs_disabled() && !in_interrupt() && !in_softirq() &&
> + !time_travel_ext_waiting)
This will not build with timetravel support disabled.
> time_travel_update_time(time_travel_time +
> TIMER_MULTIPLIER,
> false);
> --
> 2.26.2
>
>
> _______________________________________________
> linux-um mailing list
> linux-um at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-um
--
Thanks,
//richard
More information about the linux-um
mailing list