[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