Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 25 Jul 2011 18:24:17 +0000 (UTC)
From:      Marius Strobl <marius@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org
Subject:   svn commit: r224359 - stable/7/sys/sparc64/sparc64
Message-ID:  <201107251824.p6PIOHxP069856@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: marius
Date: Mon Jul 25 18:24:17 2011
New Revision: 224359
URL: http://svn.freebsd.org/changeset/base/224359

Log:
  MFC: r223235
  
  - As with stray vector interrupts limit the reporting of stray level
    interrupts. Bringup on additional machine models repeatedly reveals
    firmware that enables interrupts behind our back, causing the console
    to be flooded otherwise.
  - As with the regular interrupt counters using uint16_t instead of
    u_long for counting the stray vector interrupts should be more than
    sufficient.
  - Cache the interrupt vector in intr_stray_vector().

Modified:
  stable/7/sys/sparc64/sparc64/intr_machdep.c
Directory Properties:
  stable/7/sys/   (props changed)
  stable/7/sys/cddl/contrib/opensolaris/   (props changed)
  stable/7/sys/contrib/dev/acpica/   (props changed)
  stable/7/sys/contrib/pf/   (props changed)

Modified: stable/7/sys/sparc64/sparc64/intr_machdep.c
==============================================================================
--- stable/7/sys/sparc64/sparc64/intr_machdep.c	Mon Jul 25 18:23:24 2011	(r224358)
+++ stable/7/sys/sparc64/sparc64/intr_machdep.c	Mon Jul 25 18:24:17 2011	(r224359)
@@ -84,10 +84,11 @@ CTASSERT((1 << IV_SHIFT) == sizeof(struc
 
 ih_func_t *intr_handlers[PIL_MAX];
 uint16_t pil_countp[PIL_MAX];
+static uint16_t pil_stray_count[PIL_MAX];
 
 struct intr_vector intr_vectors[IV_MAX];
 uint16_t intr_countp[IV_MAX];
-static u_long intr_stray_count[IV_MAX];
+static uint16_t intr_stray_count[IV_MAX];
 
 static const char *const pil_names[] = {
 	"stray",
@@ -199,22 +200,32 @@ intr_setup(int pri, ih_func_t *ihf, int 
 static void
 intr_stray_level(struct trapframe *tf)
 {
+	uint64_t level;
 
-	printf("stray level interrupt %ld\n", tf->tf_level);
+	level = tf->tf_level;
+	if (pil_stray_count[level] < MAX_STRAY_LOG) {
+		printf("stray level interrupt %ld\n", level);
+		pil_stray_count[level]++;
+		if (pil_stray_count[level] >= MAX_STRAY_LOG)
+			printf("got %d stray level interrupt %ld's: not "
+			    "logging anymore\n", MAX_STRAY_LOG, level);
+	}
 }
 
 static void
 intr_stray_vector(void *cookie)
 {
 	struct intr_vector *iv;
+	u_int vec;
 
 	iv = cookie;
-	if (intr_stray_count[iv->iv_vec] < MAX_STRAY_LOG) {
-		printf("stray vector interrupt %d\n", iv->iv_vec);
-		intr_stray_count[iv->iv_vec]++;
-		if (intr_stray_count[iv->iv_vec] >= MAX_STRAY_LOG)
-			printf("got %d stray interrupt %d's: not logging "
-			    "anymore\n", MAX_STRAY_LOG, iv->iv_vec);
+	vec = iv->iv_vec;
+	if (intr_stray_count[vec] < MAX_STRAY_LOG) {
+		printf("stray vector interrupt %d\n", vec);
+		intr_stray_count[vec]++;
+		if (intr_stray_count[vec] >= MAX_STRAY_LOG)
+			printf("got %d stray vector interrupt %d's: not "
+			    "logging anymore\n", MAX_STRAY_LOG, vec);
 	}
 }
 



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