usr/src/uts/common/os/logsubr.c
author Rafael Vanoni <rafael.vanoni@sun.com>
Fri, 13 Nov 2009 01:32:32 -0800
changeset 11066 cebb50cbe4f9
parent 8576 9cdc68d0502f
child 11439 3ae265fa9bca
permissions -rw-r--r--
PSARC/2009/396 Tickless Kernel Architecture / lbolt decoupling 6860030 tickless clock requires a clock() decoupled lbolt / lbolt64 Portions contributed by Chad Mynhier <[email protected]>
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
1401
7127a4968f33 6375189 some ON files need copyright update to 2006
mjnelson
parents: 1259
diff changeset
     5
 * Common Development and Distribution License (the "License").
7127a4968f33 6375189 some ON files need copyright update to 2006
mjnelson
parents: 1259
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
 */
1401
7127a4968f33 6375189 some ON files need copyright update to 2006
mjnelson
parents: 1259
diff changeset
    21
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
8576
9cdc68d0502f 6790536 ONNV copyright needs to be updated to 2009
Nick Todd <Nick.Todd@Sun.COM>
parents: 6769
diff changeset
    23
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
#include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
#include <sys/param.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
#include <sys/varargs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
#include <sys/systm.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
#include <sys/cmn_err.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
#include <sys/stream.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
#include <sys/strsubr.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
#include <sys/strsun.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
#include <sys/sysmacros.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
#include <sys/kmem.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
#include <sys/log.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#include <sys/spl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#include <sys/syslog.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#include <sys/console.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
#include <sys/debug.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
#include <sys/utsname.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
#include <sys/id_space.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
#include <sys/zone.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
log_zone_t log_global;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
queue_t *log_consq;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
queue_t *log_backlogq;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
queue_t *log_intrq;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
#define	LOG_PRISIZE	8	/* max priority size: 7 characters + null */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
#define	LOG_FACSIZE	9	/* max priority size: 8 characters + null */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
static krwlock_t log_rwlock;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
static int log_rwlock_depth;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
static int log_seq_no[SL_CONSOLE + 1];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
static stdata_t log_fakestr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
static id_space_t *log_minorspace;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
static log_t log_backlog;
1259
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
    60
static struct kmem_cache *log_cons_cache;	/* log_t cache */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
static queue_t *log_recentq;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
static queue_t *log_freeq;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
static zone_key_t log_zone_key;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
static char log_overflow_msg[] = "message overflow on /dev/log minor #%d%s\n";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
static char log_pri[LOG_PRIMASK + 1][LOG_PRISIZE] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
	"emerg",	"alert",	"crit",		"error",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
	"warning",	"notice",	"info",		"debug"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
static char log_fac[LOG_NFACILITIES + 1][LOG_FACSIZE] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
	"kern",		"user",		"mail",		"daemon",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
	"auth",		"syslog",	"lpr",		"news",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
	"uucp",		"resv9",	"resv10",	"resv11",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
	"resv12",	"audit",	"resv14",	"cron",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
	"local0",	"local1",	"local2",	"local3",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
	"local4",	"local5",	"local6",	"local7",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
	"unknown"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
};
1259
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
    83
static int log_cons_constructor(void *, void *, int);
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
    84
static void log_cons_destructor(void *, void *);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
 * Get exclusive access to the logging system; this includes all minor
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
 * devices.  We use an rwlock rather than a mutex because hold times
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
 * are potentially long, so we don't want to waste cycles in adaptive mutex
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
 * spin (rwlocks always block when contended).  Note that we explicitly
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
 * support recursive calls (e.g. printf() calls foo() calls printf()).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
 * Clients may use log_enter() / log_exit() to guarantee that a group
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
 * of messages is treated atomically (i.e. they appear in order and are
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
 * not interspersed with any other messages), e.g. for multiline printf().
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
 * This could probably be changed to a per-zone lock if contention becomes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
 * an issue.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
log_enter(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
	if (rw_owner(&log_rwlock) != curthread)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
		rw_enter(&log_rwlock, RW_WRITER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
	log_rwlock_depth++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
log_exit(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
	if (--log_rwlock_depth == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
		rw_exit(&log_rwlock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
log_flushq(queue_t *q)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
	mblk_t *mp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
	log_t *lp = (log_t *)q->q_ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
	/* lp will be NULL if the queue was created via log_makeq */
6769
c1faa4d16a30 6666472 Network performance regression under heavy load (introduced by 4868863)
ja97890
parents: 5954
diff changeset
   122
	while ((mp = getq_noenab(q, 0)) != NULL)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
		log_sendmsg(mp, lp == NULL ? GLOBAL_ZONEID : lp->log_zoneid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
 * Create a minimal queue with just enough fields filled in to support
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
 * canput(9F), putq(9F), and getq_noenab(9F).  We set QNOENB to ensure
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
 * that the queue will never be enabled.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
static queue_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
log_makeq(size_t lowat, size_t hiwat, void *ibc)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
	queue_t *q;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
	q = kmem_zalloc(sizeof (queue_t), KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
	q->q_stream = &log_fakestr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
	q->q_flag = QISDRV | QMTSAFE | QNOENB | QREADR | QUSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
	q->q_nfsrv = q;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
	q->q_lowat = lowat;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
	q->q_hiwat = hiwat;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
	mutex_init(QLOCK(q), NULL, MUTEX_DRIVER, ibc);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
	return (q);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
 * Initialize the log structure for a new zone.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
static void *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
log_zoneinit(zoneid_t zoneid)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
	int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
	log_zone_t *lzp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
	if (zoneid == GLOBAL_ZONEID)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
		lzp = &log_global;	/* use statically allocated struct */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
		lzp = kmem_zalloc(sizeof (log_zone_t), KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
	for (i = 0; i < LOG_NUMCLONES; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
		lzp->lz_clones[i].log_minor =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
		    (minor_t)id_alloc(log_minorspace);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
		lzp->lz_clones[i].log_zoneid = zoneid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
	return (lzp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
/*ARGSUSED*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
log_zonefree(zoneid_t zoneid, void *arg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
	log_zone_t *lzp = arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
	int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
	ASSERT(lzp != &log_global && zoneid != GLOBAL_ZONEID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
	if (lzp == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
	for (i = 0; i < LOG_NUMCLONES; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
		id_free(log_minorspace, lzp->lz_clones[i].log_minor);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
	kmem_free(lzp, sizeof (log_zone_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
log_init(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
	int log_maxzones;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
	 * Create a backlog queue to consume console messages during periods
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
	 * when there is no console reader (e.g. before syslogd(1M) starts).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
	log_backlogq = log_consq = log_makeq(0, LOG_HIWAT, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
	 * Create a queue to hold free message of size <= LOG_MSGSIZE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
	 * Calls from high-level interrupt handlers will do a getq_noenab()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
	 * from this queue, so its q_lock must be a maximum SPL spin lock.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
	log_freeq = log_makeq(LOG_MINFREE, LOG_MAXFREE, (void *)ipltospl(SPL8));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
	 * Create a queue for messages from high-level interrupt context.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
	 * These messages are drained via softcall, or explicitly by panic().
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
	log_intrq = log_makeq(0, LOG_HIWAT, (void *)ipltospl(SPL8));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
	 * Create a queue to hold the most recent 8K of console messages.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
	 * Useful for debugging.  Required by the "$<msgbuf" adb macro.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
	log_recentq = log_makeq(0, LOG_RECENTSIZE, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
	 * Create an id space for clone devices opened via /dev/log.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
	 * Need to limit the number of zones to avoid exceeding the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
	 * available minor number space.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
	log_maxzones = (L_MAXMIN32 - LOG_LOGMIN) / LOG_NUMCLONES - 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
	if (log_maxzones < maxzones)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
		maxzones = log_maxzones;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
	log_minorspace = id_space_create("logminor_space", LOG_LOGMIN + 1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
	    L_MAXMIN32);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
	 * Put ourselves on the ZSD list.  Note that zones have not been
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
	 * initialized yet, but our constructor will be called on the global
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
	 * zone when they are.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
	zone_key_create(&log_zone_key, log_zoneinit, NULL, log_zonefree);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
	 * Initialize backlog structure.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
	log_backlog.log_zoneid = GLOBAL_ZONEID;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
	log_backlog.log_minor = LOG_BACKLOG;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
1259
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   237
	/* Allocate kmem cache for conslog's log structures */
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   238
	log_cons_cache = kmem_cache_create("log_cons_cache",
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   239
	    sizeof (struct log), 0, log_cons_constructor, log_cons_destructor,
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   240
	    NULL, NULL, NULL, 0);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
	 * Let the logging begin.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
	log_update(&log_backlog, log_backlogq, SL_CONSOLE, log_console);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
	 * Now that logging is enabled, emit the SunOS banner.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
	printf("\rSunOS Release %s Version %s %u-bit\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
	    utsname.release, utsname.version, NBBY * (uint_t)sizeof (void *));
8576
9cdc68d0502f 6790536 ONNV copyright needs to be updated to 2009
Nick Todd <Nick.Todd@Sun.COM>
parents: 6769
diff changeset
   252
	printf("Copyright 1983-2009 Sun Microsystems, Inc.  "
5954
46cb71c8d628 6647284 ONNV copyright needs to be updated to 2008
nickto
parents: 5630
diff changeset
   253
	    "All rights reserved.\nUse is subject to license terms.\n");
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
#ifdef DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
	printf("DEBUG enabled\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
/*
1259
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   260
 * Allocate a log device corresponding to supplied device type.
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   261
 * Both devices are clonable. /dev/log devices are allocated per zone.
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   262
 * /dev/conslog devices are allocated from kmem cache.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
log_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
log_alloc(minor_t type)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
	zone_t *zptr = curproc->p_zone;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
	log_zone_t *lzp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
	log_t *lp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
	int i;
1259
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   271
	minor_t minor;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
	if (type == LOG_CONSMIN) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
1259
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   275
		/*
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   276
		 * Return a write-only /dev/conslog device.
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   277
		 * No point allocating log_t until there's a free minor number.
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   278
		 */
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   279
		minor = (minor_t)id_alloc(log_minorspace);
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   280
		lp = kmem_cache_alloc(log_cons_cache, KM_SLEEP);
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   281
		lp->log_minor = minor;
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   282
		return (lp);
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   283
	} else {
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   284
		ASSERT(type == LOG_LOGMIN);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
1259
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   286
		lzp = zone_getspecific(log_zone_key, zptr);
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   287
		ASSERT(lzp != NULL);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
1259
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   289
		/* search for an available /dev/log device for the zone */
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   290
		for (i = LOG_LOGMINIDX; i <= LOG_LOGMAXIDX; i++) {
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   291
			lp = &lzp->lz_clones[i];
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   292
			if (lp->log_inuse == 0)
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   293
				break;
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   294
		}
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   295
		if (i > LOG_LOGMAXIDX)
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   296
			lp = NULL;
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   297
		else
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   298
			/* Indicate which device type */
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   299
			lp->log_major = LOG_LOGMIN;
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   300
		return (lp);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
	}
1259
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   302
}
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   303
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   304
void
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   305
log_free(log_t *lp)
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   306
{
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   307
	id_free(log_minorspace, lp->log_minor);
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   308
	kmem_cache_free(log_cons_cache, lp);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
 * Move console messages from src to dst.  The time of day isn't known
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
 * early in boot, so fix up the message timestamps if necessary.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
log_conswitch(log_t *src, log_t *dst)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
	mblk_t *mp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
	mblk_t *hmp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
	mblk_t *tmp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
	log_ctl_t *hlc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
6769
c1faa4d16a30 6666472 Network performance regression under heavy load (introduced by 4868863)
ja97890
parents: 5954
diff changeset
   323
	while ((mp = getq_noenab(src->log_q, 0)) != NULL) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
		log_ctl_t *lc = (log_ctl_t *)mp->b_rptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
		lc->flags |= SL_LOGONLY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
		/*
4123
e5cb484f034e backout 6265036/6531693: causes 6544953
dm120769
parents: 3816
diff changeset
   328
		 * The ttime is written with 0 in log_sensmsg() only when
2771
3414606edb08 6464408 Timestamp on /var/adm/messages is wrong after 248 days
kk112340
parents: 1401
diff changeset
   329
		 * good gethrestime_sec() data is not available to store in
3414606edb08 6464408 Timestamp on /var/adm/messages is wrong after 248 days
kk112340
parents: 1401
diff changeset
   330
		 * the log_ctl_t in the early boot phase.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
		 */
2771
3414606edb08 6464408 Timestamp on /var/adm/messages is wrong after 248 days
kk112340
parents: 1401
diff changeset
   332
		if (lc->ttime == 0) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
			 * Look ahead to first early boot message with time.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
			if (hmp) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
				tmp->b_next = mp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
				tmp = mp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
			} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
				hmp = tmp = mp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
		while (hmp) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
			tmp = hmp->b_next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
			hmp->b_next = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
			hlc = (log_ctl_t *)hmp->b_rptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
			 * Calculate hrestime for an early log message with
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
			 * an invalid time stamp. We know:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
			 *  - the lbolt of the invalid time stamp.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
			 *  - the hrestime and lbolt of the first valid
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
			 *    time stamp.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
			hlc->ttime = lc->ttime - (lc->ltime - hlc->ltime) / hz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
			(void) putq(dst->log_q, hmp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
			hmp = tmp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
		(void) putq(dst->log_q, mp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
	while (hmp) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
		tmp = hmp->b_next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
		hmp->b_next = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
		hlc = (log_ctl_t *)hmp->b_rptr;
11066
cebb50cbe4f9 PSARC/2009/396 Tickless Kernel Architecture / lbolt decoupling
Rafael Vanoni <rafael.vanoni@sun.com>
parents: 8576
diff changeset
   365
		hlc->ttime = gethrestime_sec() -
cebb50cbe4f9 PSARC/2009/396 Tickless Kernel Architecture / lbolt decoupling
Rafael Vanoni <rafael.vanoni@sun.com>
parents: 8576
diff changeset
   366
		    (ddi_get_lbolt() - hlc->ltime) / hz;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
		(void) putq(dst->log_q, hmp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
		hmp = tmp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
	dst->log_overflow = src->log_overflow;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
	src->log_flags = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
	dst->log_flags = SL_CONSOLE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
	log_consq = dst->log_q;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
 * Set the fields in the 'target' clone to the specified values.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
 * Then, look at all clones to determine which message types are
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
 * currently active and which clone is the primary console queue.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
 * If the primary console queue changes to or from the backlog
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
 * queue, copy all messages from backlog to primary or vice versa.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
log_update(log_t *target, queue_t *q, short flags, log_filter_t *filter)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
	log_t *lp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
	short active = SL_CONSOLE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
	zone_t *zptr = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
	log_zone_t *lzp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
	zoneid_t zoneid = target->log_zoneid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
	int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
	log_enter();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
	if (q != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
		target->log_q = q;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
	target->log_wanted = filter;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
	target->log_flags = flags;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
	target->log_overflow = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
	 * Need to special case the global zone here since this may be
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
	 * called before zone_init.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
	if (zoneid == GLOBAL_ZONEID) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
		lzp = &log_global;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
	} else if ((zptr = zone_find_by_id(zoneid)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
		log_exit();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
		return;		/* zone is being destroyed, ignore update */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
		lzp = zone_getspecific(log_zone_key, zptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
	ASSERT(lzp != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
	for (i = LOG_LOGMAXIDX; i >= LOG_LOGMINIDX; i--) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
		lp = &lzp->lz_clones[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
		if (zoneid == GLOBAL_ZONEID && (lp->log_flags & SL_CONSOLE))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
			log_consq = lp->log_q;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
		active |= lp->log_flags;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
	lzp->lz_active = active;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
	if (zptr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
		zone_rele(zptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
	if (log_consq == target->log_q) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
		if (flags & SL_CONSOLE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
			log_conswitch(&log_backlog, target);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
			log_conswitch(target, &log_backlog);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
	target->log_q = q;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
	log_exit();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
/*ARGSUSED*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
log_error(log_t *lp, log_ctl_t *lc)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
	if ((lc->pri & LOG_FACMASK) == LOG_KERN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
		lc->pri = LOG_KERN | LOG_ERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
	return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
log_trace(log_t *lp, log_ctl_t *lc)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
	trace_ids_t *tid = (trace_ids_t *)lp->log_data->b_rptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
	trace_ids_t *tidend = (trace_ids_t *)lp->log_data->b_wptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
	 * We use `tid + 1 <= tidend' here rather than the more traditional
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
	 * `tid < tidend', since the former ensures that there's at least
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
	 * `sizeof (trace_ids_t)' bytes available before executing the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
	 * loop, whereas the latter only ensures that there's a single byte.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
	for (; tid + 1 <= tidend; tid++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
		if (tid->ti_level < lc->level && tid->ti_level >= 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
		if (tid->ti_mid != lc->mid && tid->ti_mid >= 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
		if (tid->ti_sid != lc->sid && tid->ti_sid >= 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
		if ((lc->pri & LOG_FACMASK) == LOG_KERN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
			lc->pri = LOG_KERN | LOG_DEBUG;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
		return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
/*ARGSUSED*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
log_console(log_t *lp, log_ctl_t *lc)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
	if ((lc->pri & LOG_FACMASK) == LOG_KERN) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
		if (lc->flags & SL_FATAL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
			lc->pri = LOG_KERN | LOG_CRIT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
		else if (lc->flags & SL_ERROR)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
			lc->pri = LOG_KERN | LOG_ERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
		else if (lc->flags & SL_WARN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
			lc->pri = LOG_KERN | LOG_WARNING;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
		else if (lc->flags & SL_NOTE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
			lc->pri = LOG_KERN | LOG_NOTICE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
		else if (lc->flags & SL_TRACE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
			lc->pri = LOG_KERN | LOG_DEBUG;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
			lc->pri = LOG_KERN | LOG_INFO;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
	return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
mblk_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
log_makemsg(int mid, int sid, int level, int sl, int pri, void *msg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
	size_t size, int on_intr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
	mblk_t *mp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
	mblk_t *mp2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
	log_ctl_t *lc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
	if (size <= LOG_MSGSIZE &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
	    (on_intr || log_freeq->q_count > log_freeq->q_lowat))
6769
c1faa4d16a30 6666472 Network performance regression under heavy load (introduced by 4868863)
ja97890
parents: 5954
diff changeset
   502
		mp = getq_noenab(log_freeq, 0);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
	if (mp == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
		if (on_intr ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
		    (mp = allocb(sizeof (log_ctl_t), BPRI_HI)) == NULL ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
		    (mp2 = allocb(MAX(size, LOG_MSGSIZE), BPRI_HI)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
			freemsg(mp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
			return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
		DB_TYPE(mp) = M_PROTO;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
		mp->b_wptr += sizeof (log_ctl_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
		mp->b_cont = mp2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
		mp2 = mp->b_cont;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
		mp2->b_wptr = mp2->b_rptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
	lc = (log_ctl_t *)mp->b_rptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
	lc->mid = mid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
	lc->sid = sid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
	lc->level = level;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   523
	lc->flags = sl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
	lc->pri = pri;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
	bcopy(msg, mp2->b_wptr, size - 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
	mp2->b_wptr[size - 1] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
	mp2->b_wptr += strlen((char *)mp2->b_wptr) + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
	return (mp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   532
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   533
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   534
log_freemsg(mblk_t *mp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   536
	mblk_t *mp2 = mp->b_cont;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   538
	ASSERT(MBLKL(mp) == sizeof (log_ctl_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   539
	ASSERT(mp2->b_rptr == mp2->b_datap->db_base);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   540
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   541
	if ((log_freeq->q_flag & QFULL) == 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   542
	    MBLKL(mp2) <= LOG_MSGSIZE && MBLKSIZE(mp2) >= LOG_MSGSIZE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   543
		(void) putq(log_freeq, mp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   544
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   545
		freemsg(mp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   546
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   547
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   548
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
log_sendmsg(mblk_t *mp, zoneid_t zoneid)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
	log_t *lp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   552
	char *src, *dst;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   553
	mblk_t *mp2 = mp->b_cont;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   554
	log_ctl_t *lc = (log_ctl_t *)mp->b_rptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   555
	int flags, fac;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
	off_t facility = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   557
	off_t body = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   558
	zone_t *zptr = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   559
	log_zone_t *lzp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   560
	int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   561
	int backlog;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   562
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   563
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   564
	 * Need to special case the global zone here since this may be
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   565
	 * called before zone_init.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   566
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   567
	if (zoneid == GLOBAL_ZONEID) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   568
		lzp = &log_global;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   569
	} else if ((zptr = zone_find_by_id(zoneid)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   570
		/* specified zone doesn't exist, free message and return */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   571
		log_freemsg(mp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   572
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   573
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   574
		lzp = zone_getspecific(log_zone_key, zptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   575
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   576
	ASSERT(lzp != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   577
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   578
	if ((lc->flags & lzp->lz_active) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   579
		if (zptr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   580
			zone_rele(zptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   581
		log_freemsg(mp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   582
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   583
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   584
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   585
	if (panicstr) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   586
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   587
		 * Raise the console queue's q_hiwat to ensure that we
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   588
		 * capture all panic messages.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   589
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   590
		log_consq->q_hiwat = 2 * LOG_HIWAT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   591
		log_consq->q_flag &= ~QFULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   592
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   593
		/* Message was created while panicking. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   594
		lc->flags |= SL_PANICMSG;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   595
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   596
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   597
	src = (char *)mp2->b_rptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   598
	dst = strstr(src, "FACILITY_AND_PRIORITY] ");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   599
	if (dst != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   600
		facility = dst - src;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   601
		body = facility + 23; /* strlen("FACILITY_AND_PRIORITY] ") */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   602
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   603
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   604
	log_enter();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   605
2771
3414606edb08 6464408 Timestamp on /var/adm/messages is wrong after 248 days
kk112340
parents: 1401
diff changeset
   606
	/*
4123
e5cb484f034e backout 6265036/6531693: causes 6544953
dm120769
parents: 3816
diff changeset
   607
	 * In the early boot phase hrestime is invalid, then timechanged is 0.
e5cb484f034e backout 6265036/6531693: causes 6544953
dm120769
parents: 3816
diff changeset
   608
	 * If hrestime is not valid, the ttime is set to 0 here and the correct
e5cb484f034e backout 6265036/6531693: causes 6544953
dm120769
parents: 3816
diff changeset
   609
	 * ttime is calculated in log_conswitch() later. The log_conswitch()
e5cb484f034e backout 6265036/6531693: causes 6544953
dm120769
parents: 3816
diff changeset
   610
	 * calculation to determine the correct ttime does not use ttime data
e5cb484f034e backout 6265036/6531693: causes 6544953
dm120769
parents: 3816
diff changeset
   611
	 * from these log_ctl_t structures; it only uses ttime from log_ctl_t's
e5cb484f034e backout 6265036/6531693: causes 6544953
dm120769
parents: 3816
diff changeset
   612
	 * that contain good data.
e5cb484f034e backout 6265036/6531693: causes 6544953
dm120769
parents: 3816
diff changeset
   613
	 *
2771
3414606edb08 6464408 Timestamp on /var/adm/messages is wrong after 248 days
kk112340
parents: 1401
diff changeset
   614
	 */
11066
cebb50cbe4f9 PSARC/2009/396 Tickless Kernel Architecture / lbolt decoupling
Rafael Vanoni <rafael.vanoni@sun.com>
parents: 8576
diff changeset
   615
	lc->ltime = ddi_get_lbolt();
4123
e5cb484f034e backout 6265036/6531693: causes 6544953
dm120769
parents: 3816
diff changeset
   616
	if (timechanged) {
2771
3414606edb08 6464408 Timestamp on /var/adm/messages is wrong after 248 days
kk112340
parents: 1401
diff changeset
   617
		lc->ttime = gethrestime_sec();
3414606edb08 6464408 Timestamp on /var/adm/messages is wrong after 248 days
kk112340
parents: 1401
diff changeset
   618
	} else {
3414606edb08 6464408 Timestamp on /var/adm/messages is wrong after 248 days
kk112340
parents: 1401
diff changeset
   619
		lc->ttime = 0;
3414606edb08 6464408 Timestamp on /var/adm/messages is wrong after 248 days
kk112340
parents: 1401
diff changeset
   620
	}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   621
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   622
	flags = lc->flags & lzp->lz_active;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   623
	log_seq_no[flags & SL_ERROR]++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   624
	log_seq_no[flags & SL_TRACE]++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   625
	log_seq_no[flags & SL_CONSOLE]++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   626
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   627
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   628
	 * If this is in the global zone, start with the backlog, then
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   629
	 * walk through the clone logs.  If not, just do the clone logs.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   630
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   631
	backlog = (zoneid == GLOBAL_ZONEID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   632
	i = LOG_LOGMINIDX;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   633
	while (i <= LOG_LOGMAXIDX) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   634
		if (backlog) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   635
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   636
			 * Do the backlog this time, then start on the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   637
			 * others.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   638
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   639
			backlog = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   640
			lp = &log_backlog;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   641
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   642
			lp = &lzp->lz_clones[i++];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   643
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   644
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   645
		if ((lp->log_flags & flags) && lp->log_wanted(lp, lc)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   646
			if (canput(lp->log_q)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   647
				lp->log_overflow = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   648
				lc->seq_no = log_seq_no[lp->log_flags];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   649
				if ((mp2 = copymsg(mp)) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   650
					break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   651
				if (facility != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   652
					src = (char *)mp2->b_cont->b_rptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   653
					dst = src + facility;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   654
					fac = (lc->pri & LOG_FACMASK) >> 3;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   655
					dst += snprintf(dst,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   656
					    LOG_FACSIZE + LOG_PRISIZE, "%s.%s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   657
					    log_fac[MIN(fac, LOG_NFACILITIES)],
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   658
					    log_pri[lc->pri & LOG_PRIMASK]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   659
					src += body - 2; /* copy "] " too */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   660
					while (*src != '\0')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   661
						*dst++ = *src++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   662
					*dst++ = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   663
					mp2->b_cont->b_wptr = (uchar_t *)dst;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   664
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   665
				(void) putq(lp->log_q, mp2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   666
			} else if (++lp->log_overflow == 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   667
				if (lp->log_q == log_consq) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   668
					console_printf(log_overflow_msg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   669
					    lp->log_minor,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   670
					    " -- is syslogd(1M) running?");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   671
				} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   672
					printf(log_overflow_msg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   673
					    lp->log_minor, "");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   674
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   675
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   676
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   677
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   678
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   679
	if (zptr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   680
		zone_rele(zptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   681
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   682
	if ((flags & SL_CONSOLE) && (lc->pri & LOG_FACMASK) == LOG_KERN) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   683
		if ((mp2 == NULL || log_consq == log_backlogq || panicstr) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   684
		    (lc->flags & SL_LOGONLY) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   685
			console_printf("%s", (char *)mp->b_cont->b_rptr + body);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   686
		if ((lc->flags & SL_CONSONLY) == 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   687
		    (mp2 = copymsg(mp)) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   688
			mp2->b_cont->b_rptr += body;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   689
			if (log_recentq->q_flag & QFULL)
6769
c1faa4d16a30 6666472 Network performance regression under heavy load (introduced by 4868863)
ja97890
parents: 5954
diff changeset
   690
				freemsg(getq_noenab(log_recentq, 0));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   691
			(void) putq(log_recentq, mp2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   692
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   693
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   694
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   695
	log_freemsg(mp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   696
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   697
	log_exit();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   698
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   699
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   700
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   701
 * Print queued messages to console.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   702
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   703
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   704
log_printq(queue_t *qfirst)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   705
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   706
	mblk_t *mp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   707
	queue_t *q, *qlast;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   708
	char *cp, *msgp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   709
	log_ctl_t *lc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   710
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   711
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   712
	 * Look ahead to first queued message in the stream.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   713
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   714
	qlast = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   715
	do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   716
		for (q = qfirst; q->q_next != qlast; q = q->q_next)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   717
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   718
		for (mp = q->q_first; mp != NULL; mp = mp->b_next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   719
			lc = (log_ctl_t *)mp->b_rptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   720
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   721
			 * Check if message is already displayed at
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   722
			 * /dev/console.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   723
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   724
			if (lc->flags & SL_PANICMSG)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   725
				continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   726
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   727
			cp = (char *)mp->b_cont->b_rptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   728
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   729
			/* Strip off the message ID. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   730
			if ((msgp = strstr(cp, "[ID ")) != NULL &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   731
			    (msgp = strstr(msgp,  "] ")) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   732
				cp = msgp + 2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   733
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   734
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   735
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   736
			 * Using console_printf instead of printf to avoid
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   737
			 * queueing messages to log_consq.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   738
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   739
			console_printf("%s", cp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   740
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   741
	} while ((qlast = q) != qfirst);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   742
}
1259
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   743
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   744
/* ARGSUSED */
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   745
static int
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   746
log_cons_constructor(void *buf, void *cdrarg, int kmflags)
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   747
{
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   748
	struct log *lp = buf;
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   749
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   750
	lp->log_zoneid = GLOBAL_ZONEID;
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   751
	lp->log_major = LOG_CONSMIN;	/* Indicate which device type */
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   752
	lp->log_data = NULL;
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   753
	return (0);
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   754
}
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   755
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   756
/* ARGSUSED */
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   757
static void
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   758
log_cons_destructor(void *buf, void *cdrarg)
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   759
{
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   760
	struct log *lp = buf;
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   761
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   762
	ASSERT(lp->log_zoneid == GLOBAL_ZONEID);
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   763
	ASSERT(lp->log_major == LOG_CONSMIN);
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   764
	ASSERT(lp->log_data == NULL);
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   765
}