svn commit: r286072 - head/sys/arm64/arm64

Zbigniew Bodek zbb at FreeBSD.org
Thu Jul 30 13:59:39 UTC 2015


Author: zbb
Date: Thu Jul 30 13:59:38 2015
New Revision: 286072
URL: https://svnweb.freebsd.org/changeset/base/286072

Log:
  Enable IRQ during syscalls on ARM64
  
  FreeBSD provides a feature called Adaptive Mutexes, which allows
  a thread to spin for a while when the mutex is taken instead of
  immediately going to sleep. This causes issues when called from
  syscall handler if interrupts are masked. If every other core
  also attempts to access the same mutex there is a chance that
  all of them are spinning on the same lock at the same time.
  If interrupts are disabled, no kernel preemtion can occur and
  the system becomes unresponsive.
  
  This patch enables interrupts when syscall is being executed
  and masks them as soon as it is completed.
  
  Reviewed by:   andrew
  Obtained from: Semihalf
  Sponsored by:  The FreeBSD Foundation
  Differential Revision: https://reviews.freebsd.org/D3246

Modified:
  head/sys/arm64/arm64/trap.c

Modified: head/sys/arm64/arm64/trap.c
==============================================================================
--- head/sys/arm64/arm64/trap.c	Thu Jul 30 13:45:34 2015	(r286071)
+++ head/sys/arm64/arm64/trap.c	Thu Jul 30 13:59:38 2015	(r286072)
@@ -319,6 +319,12 @@ do_el0_sync(struct trapframe *frame)
 #endif
 		break;
 	case EXCP_SVC:
+		/*
+		 * Ensure the svc_handler is being run with interrupts enabled.
+		 * They will be automatically restored when returning from
+		 * exception handler.
+		 */
+		intr_enable();
 		svc_handler(frame);
 		break;
 	case EXCP_INSN_ABORT_L:


More information about the svn-src-head mailing list