um: time-travel/signals: fix ndelay() in interrupt
authorJohannes Berg <johannes.berg@intel.com>
Fri, 5 Mar 2021 12:19:56 +0000 (13:19 +0100)
committerRichard Weinberger <richard@nod.at>
Thu, 17 Jun 2021 19:44:52 +0000 (21:44 +0200)
commitd6b399a0e02a9063a5812af6cb8b657a4a1ecf68
tree88ffd20ce7a78849df5f2a542942d62e757558e0
parent33c7d0616a0482def19d7f981d4eaa429086c771
um: time-travel/signals: fix ndelay() in interrupt

We should be able to ndelay() from any context, even from an
interrupt context! However, this is broken (not functionally,
but locking-wise) in time-travel because we'll get into the
time-travel code and enable interrupts to handle messages on
other time-travel aware subsystems (only virtio for now).

Luckily, I've already reworked the time-travel aware signal
(interrupt) delivery for suspend/resume to have a time travel
handler, which runs directly in the context of the signal and
not from the Linux interrupt.

In order to fix this time-travel issue then, we need to do a
few things:

 1) rework the signal handling code to call time-travel handlers
    (only) if interrupts are disabled but signals aren't blocked,
    instead of marking it only pending there. This is needed to
    not deadlock other communication.
 2) rework time-travel to not enable interrupts while it's
    waiting for a message;
 3) rework time-travel to not (just) disable interrupts but
    rather block signals at a lower level while it needs them
    disabled for communicating with the controller.

Finally, since now we can actually spend even virtual time
in interrupts-disabled sections, the delay warning when we
deliver a time-travel delayed interrupt is no longer valid,
things can (and should) now get delayed.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Richard Weinberger <richard@nod.at>
arch/um/include/shared/irq_user.h
arch/um/include/shared/os.h
arch/um/kernel/irq.c
arch/um/kernel/time.c
arch/um/os-Linux/signal.c