From 0d163915d06fe28a4d025934ae3e681b3e229276 Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Sat, 23 Apr 2022 22:42:58 +0200 Subject: [PATCH] nova: avoid hangs on AMD with IOMMUs With the new usb driver #4399 and usage of the updated dde_linux lx_eml/lx_kit approach a much higher rate of IRQ session construction/destruction and signal handler assignment (irq->sigh) are caused. This trickles down to the kernel, which causes an hang of the AMD IOMMUs due to not setting reserved bits adequately. The commit fixes the root cause in the kernel and add a guard into core's to limit such driver behaviour. Fixes #4482 --- repos/base-nova/ports/nova.hash | 2 +- repos/base-nova/ports/nova.port | 2 +- repos/base-nova/src/core/irq_session_component.cc | 5 +++++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/repos/base-nova/ports/nova.hash b/repos/base-nova/ports/nova.hash index 0b7d4a6e7f..9bae98c7d4 100644 --- a/repos/base-nova/ports/nova.hash +++ b/repos/base-nova/ports/nova.hash @@ -1 +1 @@ -f5e2aa3d82dd6737422987241ebc8e17ecbf640c +7208e091c7694c61247427715d0abef7ba8d78e3 diff --git a/repos/base-nova/ports/nova.port b/repos/base-nova/ports/nova.port index 388df664db..7ef5b271c8 100644 --- a/repos/base-nova/ports/nova.port +++ b/repos/base-nova/ports/nova.port @@ -4,7 +4,7 @@ DOWNLOADS := nova.git # r10 branch URL(nova) := https://github.com/alex-ab/NOVA.git -REV(nova) := de90690dbf395a786d10c22123f37feb143a109f +REV(nova) := 1c6acf0af8256036cdea023576e2cb0e30e7d69c DIR(nova) := src/kernel/nova PATCHES := $(sort $(wildcard $(REP_DIR)/patches/*.patch)) diff --git a/repos/base-nova/src/core/irq_session_component.cc b/repos/base-nova/src/core/irq_session_component.cc index e59e462282..472d885ce1 100644 --- a/repos/base-nova/src/core/irq_session_component.cc +++ b/repos/base-nova/src/core/irq_session_component.cc @@ -107,6 +107,11 @@ void Irq_object::sigh(Signal_context_capability cap) if (!_sigh_cap.valid() && !cap.valid()) return; + if (_sigh_cap.valid() && _sigh_cap == cap) { + /* avoid useless overhead, e.g. with IOMMUs enabled */ + return; + } + if ((_sigh_cap.valid() && !cap.valid())) { deassociate(irq_sel()); _sigh_cap = Signal_context_capability();