Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 12 Oct 2015 13:20:17 +0000 (UTC)
From:      Andrew Turner <andrew@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r289184 - stable/10/sys/arm/mv
Message-ID:  <201510121320.t9CDKHqt098739@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: andrew
Date: Mon Oct 12 13:20:17 2015
New Revision: 289184
URL: https://svnweb.freebsd.org/changeset/base/289184

Log:
  MFC of r288447. Only the Marvell driver has been updated as there is no
  support for Raspbetty Pi 2 in stable/10.
  
  An IPI must be cleared before it is handled otherwise next IPI could be
  missed. In other words, if a new request for an IPI is sent while the
  previous request is being handled but the IPI is not cleared yet, the
  clearing of the previous IPI request also clears the new one and the
  handling is missed.
  
  There are only three MP interrupt controllers in ARM now. Two of them are
  fixed by this change, the third one is correct, probably only just by
  accident. The fix is minimalistic as new interrupt framework is awaited.
  
  It was debugged on RPi2 where missing IPI handling together with SCHED_ULE
  led to situation in which tdq_ipipending was not cleared and so IPI_PREEMPT
  was stopped to be sent. Various odditys were found related to slow system
  response time like various events timed out, and slow console response.

Modified:
  stable/10/sys/arm/mv/mpic.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/arm/mv/mpic.c
==============================================================================
--- stable/10/sys/arm/mv/mpic.c	Mon Oct 12 10:44:20 2015	(r289183)
+++ stable/10/sys/arm/mv/mpic.c	Mon Oct 12 13:20:17 2015	(r289184)
@@ -378,10 +378,14 @@ int
 pic_ipi_get(int i __unused)
 {
 	uint32_t val;
+	int ipi;
 
 	val = MPIC_CPU_READ(mv_mpic_sc, MPIC_IN_DRBL);
-	if (val)
-		return (ffs(val) - 1);
+	if (val) {
+		ipi = ffs(val) - 1;
+		MPIC_CPU_WRITE(mv_mpic_sc, MPIC_IN_DRBL, ~(1 << ipi));
+		return (ipi);
+	}
 
 	return (0x3ff);
 }
@@ -389,10 +393,6 @@ pic_ipi_get(int i __unused)
 void
 pic_ipi_clear(int ipi)
 {
-	uint32_t val;
-
-	val = ~(1 << ipi);
-	MPIC_CPU_WRITE(mv_mpic_sc, MPIC_IN_DRBL, val);
 }
 
 #endif



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201510121320.t9CDKHqt098739>