annotate usr/src/cmd/fm/fmd/common/fmd_sysevent.c @ 12979:ab9ae749152f

PSARC/2009/617 Software Events Notification Parameters CLI PSARC/2009/618 snmp-notify: SNMP Notification Daemon for Software Events PSARC/2009/619 smtp-notify: Email Notification Daemon for Software Events PSARC/2010/225 fmd for non-global Solaris zones PSARC/2010/226 Solaris Instance UUID PSARC/2010/227 nvlist_nvflag(3NVPAIR) PSARC/2010/228 libfmevent additions PSARC/2010/257 sysevent_evc_setpropnvl and sysevent_evc_getpropnvl PSARC/2010/265 FMRI and FMA Event Stabilty, 'ireport' category 1 event class, and the 'sw' FMRI scheme PSARC/2010/278 FMA/SMF integration: instance state transitions PSARC/2010/279 Modelling panics within FMA PSARC/2010/290 logadm.conf upgrade 6392476 fmdump needs to pretty-print 6393375 userland ereport/ireport event generation interfaces 6445732 Add email notification agent for FMA and software events 6804168 RFE: Allow an efficient means to monitor SMF services status changes 6866661 scf_values_destroy(3SCF) will segfault if is passed NULL 6884709 Add snmp notification agent for FMA and software events 6884712 Add private interface to tap into libfmd_msg macro expansion capabilities 6897919 fmd to run in a non-global zone 6897937 fmd use of non-private doors is not safe 6900081 add a UUID to Solaris kernel image for use in crashdump identification 6914884 model panic events as a defect diagnosis in FMA 6944862 fmd_case_open_uuid, fmd_case_uuisresolved, fmd_nvl_create_defect 6944866 log legacy sysevents in fmd 6944867 enumerate svc scheme in topo 6944868 software-diagnosis and software-response fmd modules 6944870 model SMF maintenance state as a defect diagnosis in FMA 6944876 savecore runs in foreground for systems with zfs root and dedicated dump 6965796 Implement notification parameters for SMF state transitions and FMA events 6968287 SUN-FM-MIB.mib needs to be updated to reflect Oracle information 6972331 logadm.conf upgrade PSARC/2010/290
author Gavin Maltby <gavin.maltby@oracle.com>
date Fri, 30 Jul 2010 17:04:17 +1000
parents b91faef0c984
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
4 * The contents of this file are subject to the terms of the
2914
266e6e5b5218 6446415 sysevent-transport publishes out-of-sequence ereports after panic
stephh
parents: 1414
diff changeset
5 * Common Development and Distribution License (the "License").
266e6e5b5218 6446415 sysevent-transport publishes out-of-sequence ereports after panic
stephh
parents: 1414
diff changeset
6 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
7 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
9 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
10 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
11 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
12 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
13 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
15 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
16 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
17 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
18 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
19 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
20 */
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
21
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
22 /*
12979
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11102
diff changeset
23 * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
24 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
25
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
26 #include <sys/sysevent/eventdefs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
27 #include <sys/sysevent.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
28 #include <sys/sysevent_impl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
29 #include <sys/fm/protocol.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
30 #include <sys/sysmacros.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
31 #include <sys/dumphdr.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
32 #include <sys/dumpadm.h>
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents: 1193
diff changeset
33 #include <sys/fm/util.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
34
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
35 #include <libsysevent.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
36 #include <libnvpair.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
37 #include <alloca.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
38 #include <limits.h>
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
39 #include <strings.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
40 #include <unistd.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
41 #include <fcntl.h>
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
42 #include <errno.h>
12979
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11102
diff changeset
43 #include <zone.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
44
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
45 #undef MUTEX_HELD
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
46 #undef RW_READ_HELD
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
47 #undef RW_WRITE_HELD
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
48
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
49 #include <fmd_api.h>
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
50 #include <fmd_log.h>
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
51 #include <fmd_subr.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
52 #include <fmd_dispq.h>
7171
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
53 #include <fmd_dr.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
54 #include <fmd_module.h>
7171
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
55 #include <fmd_protocol.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
56 #include <fmd_scheme.h>
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
57 #include <fmd_error.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
58
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
59 #include <fmd.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
60
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
61 static char *sysev_channel; /* event channel to which we are subscribed */
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
62 static char *sysev_class; /* event class to which we are subscribed */
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
63 static char *sysev_device; /* device path to use for replaying events */
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
64 static char *sysev_sid; /* event channel subscriber identifier */
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
65 static void *sysev_evc; /* event channel cookie from evc_bind */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
66
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
67 static fmd_xprt_t *sysev_xprt;
6081
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
68 static int sysev_xprt_refcnt;
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
69 static fmd_hdl_t *sysev_hdl;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
70
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
71 static struct sysev_stats {
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
72 fmd_stat_t dump_replay;
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
73 fmd_stat_t dump_lost;
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
74 fmd_stat_t bad_class;
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
75 fmd_stat_t bad_attr;
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
76 fmd_stat_t eagain;
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
77 } sysev_stats = {
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
78 { "dump_replay", FMD_TYPE_UINT64, "events replayed from dump device" },
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
79 { "dump_lost", FMD_TYPE_UINT64, "events lost from dump device" },
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
80 { "bad_class", FMD_TYPE_UINT64, "events dropped due to invalid class" },
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
81 { "bad_attr", FMD_TYPE_UINT64, "events dropped due to invalid nvlist" },
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
82 { "eagain", FMD_TYPE_UINT64, "events retried due to low memory" },
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
83 };
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
84
6081
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
85 static pthread_cond_t sysev_cv = PTHREAD_COND_INITIALIZER;
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
86 static pthread_mutex_t sysev_mutex = PTHREAD_MUTEX_INITIALIZER;
2914
266e6e5b5218 6446415 sysevent-transport publishes out-of-sequence ereports after panic
stephh
parents: 1414
diff changeset
87 static int sysev_replay_wait = 1;
6081
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
88 static int sysev_exiting;
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
89
12979
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11102
diff changeset
90 static sysevent_subattr_t *subattr;
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11102
diff changeset
91
7171
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
92 /*
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
93 * Entry point for legacy sysevents. This function is responsible for two
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
94 * things: passing off interesting events to the DR handler, and converting
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
95 * sysevents into resource events that modules can then subscribe to.
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
96 */
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
97 static void
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
98 sysev_legacy(sysevent_t *sep)
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
99 {
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
100 const char *class = sysevent_get_class_name(sep);
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
101 const char *subclass = sysevent_get_subclass_name(sep);
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
102 char *fullclass;
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
103 size_t len;
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
104 nvlist_t *attr, *nvl;
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
105 hrtime_t hrt;
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
106
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
107 /* notify the DR subsystem of the event */
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
108 fmd_dr_event(sep);
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
109
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
110 /* get the matching sysevent name */
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
111 len = snprintf(NULL, 0, "%s%s.%s", SYSEVENT_RSRC_CLASS,
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
112 class, subclass);
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
113 fullclass = alloca(len + 1);
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
114 (void) snprintf(fullclass, len + 1, "%s%s.%s",
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
115 SYSEVENT_RSRC_CLASS, class, subclass);
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
116
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
117 /* construct the event payload */
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
118 (void) nvlist_xalloc(&nvl, NV_UNIQUE_NAME, &fmd.d_nva);
7243
2f11e164daec PSARC 2008/428 Extending libnvpair for type double
robj
parents: 7171
diff changeset
119 if (sysevent_get_attr_list(sep, &attr) == 0) {
7171
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
120 (void) nvlist_merge(nvl, attr, 0);
7243
2f11e164daec PSARC 2008/428 Extending libnvpair for type double
robj
parents: 7171
diff changeset
121 nvlist_free(attr);
2f11e164daec PSARC 2008/428 Extending libnvpair for type double
robj
parents: 7171
diff changeset
122 }
7171
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
123
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
124 /*
9967
e0258b956de2 6849551 Many duplicated ereports are delivered to the DE
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 9120
diff changeset
125 * Add class and version after the nvlist_merge() just in case
e0258b956de2 6849551 Many duplicated ereports are delivered to the DE
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 9120
diff changeset
126 * the sysevent has an attribute called class or version.
e0258b956de2 6849551 Many duplicated ereports are delivered to the DE
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 9120
diff changeset
127 */
e0258b956de2 6849551 Many duplicated ereports are delivered to the DE
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 9120
diff changeset
128 (void) nvlist_add_string(nvl, FM_CLASS, fullclass);
e0258b956de2 6849551 Many duplicated ereports are delivered to the DE
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 9120
diff changeset
129 (void) nvlist_add_uint8(nvl, FM_VERSION, FM_RSRC_VERSION);
e0258b956de2 6849551 Many duplicated ereports are delivered to the DE
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 9120
diff changeset
130
e0258b956de2 6849551 Many duplicated ereports are delivered to the DE
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 9120
diff changeset
131 /*
12979
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11102
diff changeset
132 * Dispatch the event. Because we have used sysevent_bind_xhandle
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11102
diff changeset
133 * the delivery thread is blessed as a proper fmd thread so
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11102
diff changeset
134 * we may use regular fmd api calls.
7171
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
135 */
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
136 sysevent_get_time(sep, &hrt);
12979
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11102
diff changeset
137 fmd_xprt_post(sysev_hdl, sysev_xprt, nvl, hrt);
7171
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
138 }
2914
266e6e5b5218 6446415 sysevent-transport publishes out-of-sequence ereports after panic
stephh
parents: 1414
diff changeset
139
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
140 /*
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
141 * Receive an event from the SysEvent channel and post it to our transport.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
142 * Under extreme low-memory situations where we cannot event unpack the event,
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
143 * we can request that SysEvent redeliver the event later by returning EAGAIN.
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
144 * If we do this too many times, the kernel will drop the event. Rather than
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
145 * keeping state per-event, we simply attempt a garbage-collect, hoping that
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
146 * enough free memory will be available by the time the event is redelivered.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
147 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
148 static int
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
149 sysev_recv(sysevent_t *sep, void *arg)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
150 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
151 uint64_t seq = sysevent_get_seq(sep);
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
152 fmd_xprt_t *xp = arg;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
153 nvlist_t *nvl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
154 hrtime_t hrt;
6081
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
155 int rc = 0;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
156
6081
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
157 (void) pthread_mutex_lock(&sysev_mutex);
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
158 if (sysev_exiting == 1) {
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
159 while (sysev_xprt_refcnt > 0)
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
160 (void) pthread_cond_wait(&sysev_cv, &sysev_mutex);
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
161 (void) pthread_mutex_unlock(&sysev_mutex);
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
162 return (EAGAIN);
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
163 }
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
164 sysev_xprt_refcnt++;
2914
266e6e5b5218 6446415 sysevent-transport publishes out-of-sequence ereports after panic
stephh
parents: 1414
diff changeset
165 while (sysev_replay_wait)
6081
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
166 (void) pthread_cond_wait(&sysev_cv, &sysev_mutex);
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
167 (void) pthread_mutex_unlock(&sysev_mutex);
2914
266e6e5b5218 6446415 sysevent-transport publishes out-of-sequence ereports after panic
stephh
parents: 1414
diff changeset
168
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
169 if (strcmp(sysevent_get_class_name(sep), EC_FM) != 0) {
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
170 fmd_hdl_error(sysev_hdl, "discarding event 0x%llx: unexpected"
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
171 " transport class %s\n", seq, sysevent_get_class_name(sep));
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
172 sysev_stats.bad_class.fmds_value.ui64++;
6081
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
173 } else if (sysevent_get_attr_list(sep, &nvl) != 0) {
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
174 if (errno == EAGAIN || errno == ENOMEM) {
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
175 fmd_modhash_tryapply(fmd.d_mod_hash, fmd_module_trygc);
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
176 fmd_scheme_hash_trygc(fmd.d_schemes);
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
177 sysev_stats.eagain.fmds_value.ui64++;
6081
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
178 rc = EAGAIN;
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
179 } else {
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
180 fmd_hdl_error(sysev_hdl, "discarding event 0x%llx: "
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
181 "missing or invalid payload", seq);
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
182 sysev_stats.bad_attr.fmds_value.ui64++;
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
183 }
6081
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
184 } else {
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
185 sysevent_get_time(sep, &hrt);
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
186 fmd_xprt_post(sysev_hdl, xp, nvl, hrt);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
187 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
188
6081
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
189 (void) pthread_mutex_lock(&sysev_mutex);
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
190 if (--sysev_xprt_refcnt == 0 && sysev_exiting == 1)
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
191 (void) pthread_cond_broadcast(&sysev_cv);
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
192 (void) pthread_mutex_unlock(&sysev_mutex);
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
193
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
194 return (rc);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
195 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
196
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
197 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
198 * Checksum algorithm used by the dump transport for verifying the content of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
199 * error reports saved on the dump device (copy of the kernel's checksum32()).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
200 */
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
201 static uint32_t
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
202 sysev_checksum(void *cp_arg, size_t length)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
203 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
204 uchar_t *cp, *ep;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
205 uint32_t sum = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
206
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
207 for (cp = cp_arg, ep = cp + length; cp < ep; cp++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
208 sum = ((sum >> 1) | (sum << 31)) + *cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
209
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
210 return (sum);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
211 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
212
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
213 /*
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
214 * Replay saved events from the dump transport. This function is installed as
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
215 * the timer callback and is called only once during the module's lifetime.
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
216 */
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
217 /*ARGSUSED*/
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
218 static void
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
219 sysev_replay(fmd_hdl_t *hdl, id_t id, void *arg)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
220 {
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
221 char *dumpdev;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
222 off64_t off, off0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
223 int fd, err;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
224
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
225 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
226 * Determine the appropriate dump device to use for replaying pending
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
227 * error reports. If the device property is NULL (default), we
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
228 * open and query /dev/dump to determine the current dump device.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
229 */
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
230 if ((dumpdev = sysev_device) == NULL) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
231 if ((fd = open("/dev/dump", O_RDONLY)) == -1) {
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
232 fmd_hdl_error(hdl, "failed to open /dev/dump "
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
233 "to locate dump device for event replay");
2914
266e6e5b5218 6446415 sysevent-transport publishes out-of-sequence ereports after panic
stephh
parents: 1414
diff changeset
234 goto done;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
235 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
236
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
237 dumpdev = alloca(PATH_MAX);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
238 err = ioctl(fd, DIOCGETDEV, dumpdev);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
239 (void) close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
240
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
241 if (err == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
242 if (errno != ENODEV) {
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
243 fmd_hdl_error(hdl, "failed to obtain "
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
244 "path to dump device for event replay");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
245 }
2914
266e6e5b5218 6446415 sysevent-transport publishes out-of-sequence ereports after panic
stephh
parents: 1414
diff changeset
246 goto done;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
247 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
248 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
249
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
250 if (strcmp(dumpdev, "/dev/null") == 0)
2914
266e6e5b5218 6446415 sysevent-transport publishes out-of-sequence ereports after panic
stephh
parents: 1414
diff changeset
251 goto done; /* return silently and skip replay for /dev/null */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
252
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
253 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
254 * Open the appropriate device and then determine the offset of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
255 * start of the ereport dump region located at the end of the device.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
256 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
257 if ((fd = open64(dumpdev, O_RDWR | O_DSYNC)) == -1) {
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
258 fmd_hdl_error(hdl, "failed to open dump transport %s "
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
259 "(pending events will not be replayed)", dumpdev);
2914
266e6e5b5218 6446415 sysevent-transport publishes out-of-sequence ereports after panic
stephh
parents: 1414
diff changeset
260 goto done;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
261 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
262
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
263 off = DUMP_OFFSET + DUMP_LOGSIZE + DUMP_ERPTSIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
264 off = off0 = lseek64(fd, -off, SEEK_END) & -DUMP_OFFSET;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
265
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
266 if (off == (off64_t)-1LL) {
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
267 fmd_hdl_error(hdl, "failed to seek dump transport %s "
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
268 "(pending events will not be replayed)", dumpdev);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
269 (void) close(fd);
2914
266e6e5b5218 6446415 sysevent-transport publishes out-of-sequence ereports after panic
stephh
parents: 1414
diff changeset
270 goto done;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
271 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
272
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
273 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
274 * The ereport dump region is a sequence of erpt_dump_t headers each of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
275 * which is followed by packed nvlist data. We iterate over them in
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
276 * order, unpacking and dispatching each one to our dispatch queue.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
277 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
278 for (;;) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
279 char nvbuf[ERPT_DATA_SZ];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
280 uint32_t chksum;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
281 erpt_dump_t ed;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
282 nvlist_t *nvl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
283
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
284 fmd_timeval_t ftv, tod;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
285 hrtime_t hrt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
286 uint64_t ena;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
287
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
288 if (pread64(fd, &ed, sizeof (ed), off) != sizeof (ed)) {
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
289 fmd_hdl_error(hdl, "failed to read from dump "
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
290 "transport %s (pending events lost)", dumpdev);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
291 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
292 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
293
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
294 if (ed.ed_magic == 0 && ed.ed_size == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
295 break; /* end of list: all zero */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
296
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
297 if (ed.ed_magic == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
298 off += sizeof (ed) + ed.ed_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
299 continue; /* continue searching */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
300 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
301
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
302 if (ed.ed_magic != ERPT_MAGIC) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
303 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
304 * Stop reading silently if the first record has the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
305 * wrong magic number; this likely indicates that we
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
306 * rebooted from non-FMA bits or paged over the dump.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
307 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
308 if (off == off0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
309 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
310
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
311 fmd_hdl_error(hdl, "invalid dump transport "
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
312 "record at %llx (magic number %x, expected %x)\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
313 (u_longlong_t)off, ed.ed_magic, ERPT_MAGIC);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
314 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
315 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
316
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
317 if (ed.ed_size > ERPT_DATA_SZ) {
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
318 fmd_hdl_error(hdl, "invalid dump transport "
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
319 "record at %llx size (%u exceeds limit)\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
320 (u_longlong_t)off, ed.ed_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
321 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
322 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
323
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
324 if (pread64(fd, nvbuf, ed.ed_size,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
325 off + sizeof (ed)) != ed.ed_size) {
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
326 fmd_hdl_error(hdl, "failed to read dump "
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
327 "transport event (offset %llx)", (u_longlong_t)off);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
328
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
329 sysev_stats.dump_lost.fmds_value.ui64++;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
330 goto next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
331 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
332
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
333 if ((chksum = sysev_checksum(nvbuf,
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
334 ed.ed_size)) != ed.ed_chksum) {
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
335 fmd_hdl_error(hdl, "dump transport event at "
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
336 "offset %llx is corrupt (checksum %x != %x)\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
337 (u_longlong_t)off, chksum, ed.ed_chksum);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
338
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
339 sysev_stats.dump_lost.fmds_value.ui64++;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
340 goto next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
341 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
342
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
343 if ((err = nvlist_xunpack(nvbuf,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
344 ed.ed_size, &nvl, &fmd.d_nva)) != 0) {
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
345 fmd_hdl_error(hdl, "failed to unpack dump "
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
346 "transport event at offset %llx: %s\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
347 (u_longlong_t)off, fmd_strerror(err));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
348
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
349 sysev_stats.dump_lost.fmds_value.ui64++;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
350 goto next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
351 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
352
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
353 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
354 * If ed_hrt_nsec is set it contains the gethrtime() value from
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
355 * when the event was originally enqueued for the transport.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
356 * If it is zero, we use the weaker bound ed_hrt_base instead.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
357 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
358 if (ed.ed_hrt_nsec != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
359 hrt = ed.ed_hrt_nsec;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
360 else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
361 hrt = ed.ed_hrt_base;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
362
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
363 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
364 * If this is an FMA protocol event of class "ereport.*" that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
365 * contains valid ENA, we can improve the precision of 'hrt'.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
366 */
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
367 if (nvlist_lookup_uint64(nvl, FM_EREPORT_ENA, &ena) == 0)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
368 hrt = fmd_time_ena2hrt(hrt, ena);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
369
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
370 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
371 * Now convert 'hrt' to an adjustable TOD based on the values
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
372 * in ed_tod_base which correspond to one another and are
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
373 * sampled before reboot using the old gethrtime() clock.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
374 * fmd_event_recreate() will use this TOD value to re-assign
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
375 * the event an updated gethrtime() value based on the current
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
376 * value of the non-adjustable gethrtime() clock. Phew.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
377 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
378 tod.ftv_sec = ed.ed_tod_base.sec;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
379 tod.ftv_nsec = ed.ed_tod_base.nsec;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
380 fmd_time_hrt2tod(ed.ed_hrt_base, &tod, hrt, &ftv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
381
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
382 (void) nvlist_remove_all(nvl, FMD_EVN_TOD);
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
383 (void) nvlist_add_uint64_array(nvl,
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
384 FMD_EVN_TOD, (uint64_t *)&ftv, 2);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
385
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
386 fmd_xprt_post(hdl, sysev_xprt, nvl, 0);
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
387 sysev_stats.dump_replay.fmds_value.ui64++;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
388
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
389 next:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
390 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
391 * Reset the magic number for the event record to zero so that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
392 * we do not replay the same event multiple times.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
393 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
394 ed.ed_magic = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
395
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
396 if (pwrite64(fd, &ed, sizeof (ed), off) != sizeof (ed)) {
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
397 fmd_hdl_error(hdl, "failed to mark dump "
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
398 "transport event (offset %llx)", (u_longlong_t)off);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
399 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
400
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
401 off += sizeof (ed) + ed.ed_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
402 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
403
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
404 (void) close(fd);
2914
266e6e5b5218 6446415 sysevent-transport publishes out-of-sequence ereports after panic
stephh
parents: 1414
diff changeset
405 done:
6081
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
406 (void) pthread_mutex_lock(&sysev_mutex);
2914
266e6e5b5218 6446415 sysevent-transport publishes out-of-sequence ereports after panic
stephh
parents: 1414
diff changeset
407 sysev_replay_wait = 0;
6081
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
408 (void) pthread_cond_broadcast(&sysev_cv);
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
409 (void) pthread_mutex_unlock(&sysev_mutex);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
410 }
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
411
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
412 static const fmd_prop_t sysev_props[] = {
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
413 { "class", FMD_TYPE_STRING, EC_ALL }, /* event class */
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
414 { "device", FMD_TYPE_STRING, NULL }, /* replay device */
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
415 { "channel", FMD_TYPE_STRING, FM_ERROR_CHAN }, /* channel name */
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
416 { "sid", FMD_TYPE_STRING, "fmd" }, /* subscriber id */
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
417 { NULL, 0, NULL }
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
418 };
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
419
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
420 static const fmd_hdl_ops_t sysev_ops = {
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
421 NULL, /* fmdo_recv */
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
422 sysev_replay, /* fmdo_timeout */
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
423 NULL, /* fmdo_close */
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
424 NULL, /* fmdo_stats */
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
425 NULL, /* fmdo_gc */
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
426 NULL, /* fmdo_send */
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
427 };
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
428
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
429 static const fmd_hdl_info_t sysev_info = {
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
430 "SysEvent Transport Agent", "1.0", &sysev_ops, sysev_props
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
431 };
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
432
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
433 /*
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
434 * Bind to the sysevent channel we use for listening for error events and then
7171
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
435 * subscribe to appropriate events received over this channel. Setup the
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
436 * legacy sysevent handler for creating sysevent resources and forwarding DR
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
437 * events.
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
438 */
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
439 void
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
440 sysev_init(fmd_hdl_t *hdl)
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
441 {
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
442 uint_t flags;
7171
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
443 const char *subclasses[] = { EC_SUB_ALL };
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
444
12979
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11102
diff changeset
445 /* This builtin is for the global zone only */
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11102
diff changeset
446 if (getzoneid() != GLOBAL_ZONEID)
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11102
diff changeset
447 return;
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11102
diff changeset
448
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
449 if (fmd_hdl_register(hdl, FMD_API_VERSION, &sysev_info) != 0)
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
450 return; /* invalid property settings */
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
451
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
452 (void) fmd_stat_create(hdl, FMD_STAT_NOALLOC, sizeof (sysev_stats) /
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
453 sizeof (fmd_stat_t), (fmd_stat_t *)&sysev_stats);
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
454
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
455 sysev_channel = fmd_prop_get_string(hdl, "channel");
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
456 sysev_class = fmd_prop_get_string(hdl, "class");
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
457 sysev_device = fmd_prop_get_string(hdl, "device");
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
458 sysev_sid = fmd_prop_get_string(hdl, "sid");
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
459
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
460 if (sysev_channel == NULL)
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
461 fmd_hdl_abort(hdl, "channel property must be defined\n");
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
462
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
463 if (sysev_sid == NULL)
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
464 fmd_hdl_abort(hdl, "sid property must be defined\n");
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
465
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
466 if ((errno = sysevent_evc_bind(sysev_channel, &sysev_evc,
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
467 EVCH_CREAT | EVCH_HOLD_PEND)) != 0) {
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
468 fmd_hdl_abort(hdl, "failed to bind to event transport "
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
469 "channel %s", sysev_channel);
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
470 }
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
471
9120
fe1f7d8cd967 6533823 need better way of proxying faults across event transport
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 7243
diff changeset
472 sysev_xprt = fmd_xprt_open(hdl, FMD_XPRT_RDONLY |
fe1f7d8cd967 6533823 need better way of proxying faults across event transport
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 7243
diff changeset
473 FMD_XPRT_CACHE_AS_LOCAL, NULL, NULL);
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
474 sysev_hdl = hdl;
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
475
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
476 /*
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
477 * If we're subscribing to the default channel, keep our subscription
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
478 * active even if we die unexpectedly so we continue queuing events.
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
479 * If we're not (e.g. running under fmsim), do not specify SUB_KEEP so
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
480 * that our event channel will be destroyed if we die unpleasantly.
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
481 */
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
482 if (strcmp(sysev_channel, FM_ERROR_CHAN) == 0)
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
483 flags = EVCH_SUB_KEEP | EVCH_SUB_DUMP;
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
484 else
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
485 flags = EVCH_SUB_DUMP;
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
486
12979
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11102
diff changeset
487 if ((subattr = sysevent_subattr_alloc()) == NULL)
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11102
diff changeset
488 fmd_hdl_abort(hdl, "failed to allocate subscription "
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11102
diff changeset
489 "attributes");
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11102
diff changeset
490
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11102
diff changeset
491 sysevent_subattr_thrcreate(subattr, fmd_doorthr_create, NULL);
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11102
diff changeset
492 sysevent_subattr_thrsetup(subattr, fmd_doorthr_setup, NULL);
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11102
diff changeset
493
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11102
diff changeset
494 errno = sysevent_evc_xsubscribe(sysev_evc,
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11102
diff changeset
495 sysev_sid, sysev_class, sysev_recv, sysev_xprt, flags, subattr);
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
496
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
497 if (errno != 0) {
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
498 if (errno == EEXIST) {
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
499 fmd_hdl_abort(hdl, "another fault management daemon is "
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
500 "active on transport channel %s\n", sysev_channel);
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
501 } else {
12979
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11102
diff changeset
502 fmd_hdl_abort(hdl, "failed to xsubscribe to %s on "
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
503 "transport channel %s", sysev_class, sysev_channel);
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
504 }
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
505 }
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
506
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
507 /*
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
508 * Once the transport is open, install a single timer to fire at once
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
509 * in the context of the module's thread to run sysev_replay(). This
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
510 * thread will block in its first fmd_xprt_post() until fmd is ready.
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
511 */
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
512 fmd_hdl_debug(hdl, "transport '%s' open\n", sysev_channel);
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
513 (void) fmd_timer_install(hdl, NULL, NULL, 0);
7171
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
514
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
515 /*
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
516 * Open the legacy sysevent handle and subscribe to all events. These
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
517 * are automatically converted to "resource.sysevent.*" events so that
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
518 * modules can manage these events without additional infrastructure.
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
519 */
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
520 if (geteuid() != 0)
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
521 return;
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
522
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
523 if ((fmd.d_sysev_hdl =
12979
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11102
diff changeset
524 sysevent_bind_xhandle(sysev_legacy, subattr)) == NULL)
7171
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
525 fmd_hdl_abort(hdl, "failed to bind to legacy sysevent channel");
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
526
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
527 if (sysevent_subscribe_event(fmd.d_sysev_hdl, EC_ALL,
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
528 subclasses, 1) != 0)
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
529 fmd_hdl_abort(hdl, "failed to subscribe to legacy sysevents");
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
530 }
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
531
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
532 /*
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
533 * Close the channel by unsubscribing and unbinding. We only do this when a
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
534 * a non-default channel has been selected. If we're using FM_ERROR_CHAN,
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
535 * the system default, we do *not* want to unsubscribe because the kernel will
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
536 * remove the subscriber queue and any events published in our absence will
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
537 * therefore be lost. This scenario may occur when, for example, fmd is sent
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
538 * a SIGTERM by init(1M) during reboot but an error is detected and makes it
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
539 * into the sysevent channel queue before init(1M) manages to call uadmin(2).
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
540 */
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
541 void
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
542 sysev_fini(fmd_hdl_t *hdl)
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
543 {
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
544 if (strcmp(sysev_channel, FM_ERROR_CHAN) != 0) {
11102
b91faef0c984 PSARC/2009/554 door_xcreate - extended door creation interface for private doors
Gavin Maltby <Gavin.Maltby@Sun.COM>
parents: 9967
diff changeset
545 (void) sysevent_evc_unsubscribe(sysev_evc, sysev_sid);
b91faef0c984 PSARC/2009/554 door_xcreate - extended door creation interface for private doors
Gavin Maltby <Gavin.Maltby@Sun.COM>
parents: 9967
diff changeset
546 (void) sysevent_evc_unbind(sysev_evc);
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
547 }
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
548
7171
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
549 if (fmd.d_sysev_hdl != NULL)
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
550 sysevent_unbind_handle(fmd.d_sysev_hdl);
b35d9b69c7d3 PSARC 2008/456 Sysevent resources in fmd
eschrock
parents: 6081
diff changeset
551
12979
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11102
diff changeset
552 if (subattr != NULL) {
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11102
diff changeset
553 sysevent_subattr_free(subattr);
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11102
diff changeset
554 subattr = NULL;
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11102
diff changeset
555 }
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11102
diff changeset
556
6081
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
557 if (sysev_xprt != NULL) {
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
558 /*
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
559 * Wait callback returns before destroy the transport.
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
560 */
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
561 (void) pthread_mutex_lock(&sysev_mutex);
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
562 sysev_exiting = 1;
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
563 while (sysev_xprt_refcnt > 0)
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
564 (void) pthread_cond_wait(&sysev_cv, &sysev_mutex);
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
565 (void) pthread_mutex_unlock(&sysev_mutex);
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
566 fmd_xprt_close(hdl, sysev_xprt);
6081
e21b9c494333 6641803 fmd deadlock in fmd_case_hash_lookup and fmd_case_rele
cy152378
parents: 2914
diff changeset
567 }
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
568
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
569 fmd_prop_free_string(hdl, sysev_class);
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
570 fmd_prop_free_string(hdl, sysev_channel);
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
571 fmd_prop_free_string(hdl, sysev_device);
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
572 fmd_prop_free_string(hdl, sysev_sid);
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
573 }