mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-30 08:02:30 +00:00
um: time-travel: Fix IRQ handling in time_travel_handle_message()
As the comment here indicates, we need to do the polling in the
idle loop without blocking interrupts, since interrupts can be
vhost-user messages that we must process even while in our idle
loop.
I don't know why I explained one thing and implemented another,
but we have indeed observed random hangs due to this, depending
on the timing of the messages.
Fixes: 88ce642492
("um: Implement time-travel=ext")
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Acked-By: Anton Ivanov <anton.ivanov@cambridgegreys.com>
Signed-off-by: Richard Weinberger <richard@nod.at>
This commit is contained in:
parent
730586ff7f
commit
ebef8ea2ba
1 changed files with 9 additions and 5 deletions
|
@ -70,13 +70,17 @@ static void time_travel_handle_message(struct um_timetravel_msg *msg,
|
|||
* read of the message and write of the ACK.
|
||||
*/
|
||||
if (mode != TTMH_READ) {
|
||||
bool disabled = irqs_disabled();
|
||||
|
||||
BUG_ON(mode == TTMH_IDLE && !disabled);
|
||||
|
||||
if (disabled)
|
||||
local_irq_enable();
|
||||
while (os_poll(1, &time_travel_ext_fd) != 0) {
|
||||
if (mode == TTMH_IDLE) {
|
||||
BUG_ON(!irqs_disabled());
|
||||
local_irq_enable();
|
||||
local_irq_disable();
|
||||
}
|
||||
/* nothing */
|
||||
}
|
||||
if (disabled)
|
||||
local_irq_disable();
|
||||
}
|
||||
|
||||
ret = os_read_file(time_travel_ext_fd, msg, sizeof(*msg));
|
||||
|
|
Loading…
Reference in a new issue