changeset 11264:99b4beb4e9f6

6891395 libfmd_agent does not scale to large numbers of cpu's 6898698 Add timer constrain to discard_fatal fault prop statement
author Adrian Frost <Adrian.Frost@Sun.COM>
date Mon, 07 Dec 2009 02:51:44 -0800
parents bb51174e4c6c
children bbb5455309f3
files usr/src/cmd/fm/eversholt/files/i386/i86pc/intel.esc usr/src/lib/fm/libfmd_agent/common/fmd_agent.c usr/src/uts/common/io/devfm.c usr/src/uts/common/sys/devfm.h
diffstat 4 files changed, 42 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/cmd/fm/eversholt/files/i386/i86pc/intel.esc	Sun Dec 06 18:55:00 2009 -0800
+++ b/usr/src/cmd/fm/eversholt/files/i386/i86pc/intel.esc	Mon Dec 07 02:51:44 2009 -0800
@@ -938,7 +938,7 @@
       payloadprop_defined("bank_number") && 5 == payloadprop("bank_number") &&
       payloadprop_defined("processor_context_corrupt") &&
       1 == payloadprop("processor_context_corrupt") } (0)->
-    ereport.cpu.intel.internal_unclassified@chip<>/core<>/strand<>;
+    ereport.cpu.intel.internal_unclassified@chip<>/core<>/strand<> {within(10s)};
 
 prop fault.cpu.intel.internal@chip/core/strand
     { (count(stat.has_poison@motherboard[0]) <= count(stat.discard_fatal@motherboard[0]) ||
--- a/usr/src/lib/fm/libfmd_agent/common/fmd_agent.c	Sun Dec 06 18:55:00 2009 -0800
+++ b/usr/src/lib/fm/libfmd_agent/common/fmd_agent.c	Mon Dec 07 02:51:44 2009 -0800
@@ -20,7 +20,7 @@
  */
 
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -110,26 +110,46 @@
 	}
 
 	if (outnvlp != NULL) {
-		outsz = FM_IOC_MAXBUFSZ;
-		if ((outbuf = umem_alloc(outsz, UMEM_DEFAULT)) == NULL) {
-			err = errno;
-			if (inbuf != NULL)
-				umem_free(inbuf, insz);
-			return (err);
+		outsz = FM_IOC_OUT_BUFSZ;
+	}
+	for (;;) {
+		if (outnvlp != NULL) {
+			outbuf = umem_alloc(outsz, UMEM_DEFAULT);
+			if (outbuf == NULL) {
+				err = errno;
+				break;
+			}
+		}
+
+		fid.fid_version = ver;
+		fid.fid_insz = insz;
+		fid.fid_inbuf = inbuf;
+		fid.fid_outsz = outsz;
+		fid.fid_outbuf = outbuf;
+
+		if (ioctl(hdl->agent_devfd, cmd, &fid) < 0) {
+			if (errno == ENAMETOOLONG && outsz != 0 &&
+			    outsz < (FM_IOC_OUT_MAXBUFSZ / 2)) {
+				umem_free(outbuf, outsz);
+				outsz *= 2;
+				outbuf = umem_alloc(outsz, UMEM_DEFAULT);
+				if (outbuf == NULL) {
+					err = errno;
+					break;
+				}
+			} else {
+				err = errno;
+				break;
+			}
+		} else if (outnvlp != NULL) {
+			err = nvlist_unpack(fid.fid_outbuf, fid.fid_outsz,
+			    outnvlp, 0);
+			break;
+		} else {
+			break;
 		}
 	}
 
-	fid.fid_version = ver;
-	fid.fid_insz = insz;
-	fid.fid_inbuf = inbuf;
-	fid.fid_outsz = outsz;
-	fid.fid_outbuf = outbuf;
-
-	if (ioctl(hdl->agent_devfd, cmd, &fid) < 0)
-		err = errno;
-	else if (outnvlp != NULL)
-		err = nvlist_unpack(fid.fid_outbuf, fid.fid_outsz, outnvlp, 0);
-
 	if (inbuf != NULL)
 		umem_free(inbuf, insz);
 	if (outbuf != NULL)
--- a/usr/src/uts/common/io/devfm.c	Sun Dec 06 18:55:00 2009 -0800
+++ b/usr/src/uts/common/io/devfm.c	Mon Dec 07 02:51:44 2009 -0800
@@ -278,7 +278,7 @@
 
 	if (fid.fid_insz > FM_IOC_MAXBUFSZ)
 		return (ENAMETOOLONG);
-	if (fid.fid_outsz > FM_IOC_MAXBUFSZ)
+	if (fid.fid_outsz > FM_IOC_OUT_MAXBUFSZ)
 		return (EINVAL);
 
 	/*
--- a/usr/src/uts/common/sys/devfm.h	Sun Dec 06 18:55:00 2009 -0800
+++ b/usr/src/uts/common/sys/devfm.h	Mon Dec 07 02:51:44 2009 -0800
@@ -34,6 +34,8 @@
 #endif
 
 #define	FM_IOC_MAXBUFSZ		32768
+#define	FM_IOC_OUT_BUFSZ	32768
+#define	FM_IOC_OUT_MAXBUFSZ	524288
 #define	FM_DRV_VERSION		1
 
 #define	FM_VERSIONS_VERSION	"fm-versions-version"