Mercurial > illumos > illumos-gate
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"