[PATCH rtems-lwip] rtemslwip/xil_shims: Avoid hang in IRQ context

Kinsey Moore kinsey.moore at oarcorp.com
Thu Mar 30 16:49:55 UTC 2023


Do not try to alter IRQ server handlers while executing in the IRQ
server thread context. This change avoids a deadlock in CGEM error
condition handling that causes a reinitialization of the driver which
attempts to reinstall the IRQ handler from within the IRQ handler. This
deadlocks inside the IRQ server handler installation code while holding
the lwIP system protection lock thus deadlocking all threads that try to
access lwIP functionality.
---
 rtemslwip/zynqmp/xil_shims.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/rtemslwip/zynqmp/xil_shims.c b/rtemslwip/zynqmp/xil_shims.c
index ec9ed12..2eda0c5 100644
--- a/rtemslwip/zynqmp/xil_shims.c
+++ b/rtemslwip/zynqmp/xil_shims.c
@@ -27,8 +27,10 @@
 #include "xil_mmu.h"
 #include <rtems/rtems/cache.h>
 #include <rtems/rtems/intr.h>
+#include <rtems/score/threadimpl.h>
 #include <libcpu/mmu-vmsav8-64.h>
 #include <stdio.h>
+#include <string.h>
 
 #define TWO_MB (2*1024*1024)
 #define ONE_GB (1024*1024*1024)
@@ -67,6 +69,15 @@ BaseType_t xPortInstallInterruptHandler(
   void             *pvCallBackRef
 )
 {
+  char name[10];
+
+  /* Is this running in the context of any interrupt server tasks? */
+  _Thread_Get_name( _Thread_Get_executing(), name, sizeof( name ) );
+  if (strcmp(name, "IRQS") == 0) {
+    /* Can't run this from within an IRQ Server thread context */
+    return RTEMS_ILLEGAL_ON_SELF;
+  }
+
   rtems_status_code sc = rtems_interrupt_server_handler_install(
     RTEMS_INTERRUPT_SERVER_DEFAULT,
     ucInterruptID,
-- 
2.30.2



More information about the devel mailing list