usr/src/uts/common/os/logsubr.c
author Nick Todd <Nick.Todd@Sun.COM>
Tue, 20 Jan 2009 09:49:28 +0000
changeset 8576 9cdc68d0502f
parent 6769 c1faa4d16a30
child 11066 cebb50cbe4f9
permissions -rw-r--r--
6790536 ONNV copyright needs to be updated to 2009
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;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
		hlc->ttime = gethrestime_sec() - (lbolt - hlc->ltime) / hz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
		(void) putq(dst->log_q, hmp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
		hmp = tmp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
	dst->log_overflow = src->log_overflow;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
	src->log_flags = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
	dst->log_flags = SL_CONSOLE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
	log_consq = dst->log_q;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
}
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
 * Set the fields in the 'target' clone to the specified values.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
 * Then, look at all clones to determine which message types are
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
 * currently active and which clone is the primary console queue.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
 * If the primary console queue changes to or from the backlog
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
 * queue, copy all messages from backlog to primary or vice versa.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
log_update(log_t *target, queue_t *q, short flags, log_filter_t *filter)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
	log_t *lp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
	short active = SL_CONSOLE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
	zone_t *zptr = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
	log_zone_t *lzp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
	zoneid_t zoneid = target->log_zoneid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
	int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
	log_enter();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
	if (q != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
		target->log_q = q;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
	target->log_wanted = filter;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
	target->log_flags = flags;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
	target->log_overflow = 0;
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
	 * Need to special case the global zone here since this may be
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
	 * called before zone_init.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
	if (zoneid == GLOBAL_ZONEID) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
		lzp = &log_global;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
	} else if ((zptr = zone_find_by_id(zoneid)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
		log_exit();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
		return;		/* zone is being destroyed, ignore update */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
		lzp = zone_getspecific(log_zone_key, zptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
	ASSERT(lzp != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
	for (i = LOG_LOGMAXIDX; i >= LOG_LOGMINIDX; i--) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
		lp = &lzp->lz_clones[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
		if (zoneid == GLOBAL_ZONEID && (lp->log_flags & SL_CONSOLE))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
			log_consq = lp->log_q;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
		active |= lp->log_flags;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
	lzp->lz_active = active;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
	if (zptr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
		zone_rele(zptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
	if (log_consq == target->log_q) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
		if (flags & SL_CONSOLE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
			log_conswitch(&log_backlog, target);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
			log_conswitch(target, &log_backlog);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
	target->log_q = q;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
	log_exit();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
/*ARGSUSED*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
log_error(log_t *lp, log_ctl_t *lc)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
	if ((lc->pri & LOG_FACMASK) == LOG_KERN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
		lc->pri = LOG_KERN | LOG_ERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
	return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
log_trace(log_t *lp, log_ctl_t *lc)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
	trace_ids_t *tid = (trace_ids_t *)lp->log_data->b_rptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
	trace_ids_t *tidend = (trace_ids_t *)lp->log_data->b_wptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
	 * We use `tid + 1 <= tidend' here rather than the more traditional
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
	 * `tid < tidend', since the former ensures that there's at least
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
	 * `sizeof (trace_ids_t)' bytes available before executing the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
	 * loop, whereas the latter only ensures that there's a single byte.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
	for (; tid + 1 <= tidend; tid++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
		if (tid->ti_level < lc->level && tid->ti_level >= 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
		if (tid->ti_mid != lc->mid && tid->ti_mid >= 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
		if (tid->ti_sid != lc->sid && tid->ti_sid >= 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
		if ((lc->pri & LOG_FACMASK) == LOG_KERN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
			lc->pri = LOG_KERN | LOG_DEBUG;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
		return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
/*ARGSUSED*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
log_console(log_t *lp, log_ctl_t *lc)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
	if ((lc->pri & LOG_FACMASK) == LOG_KERN) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
		if (lc->flags & SL_FATAL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
			lc->pri = LOG_KERN | LOG_CRIT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
		else if (lc->flags & SL_ERROR)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
			lc->pri = LOG_KERN | LOG_ERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
		else if (lc->flags & SL_WARN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
			lc->pri = LOG_KERN | LOG_WARNING;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
		else if (lc->flags & SL_NOTE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
			lc->pri = LOG_KERN | LOG_NOTICE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
		else if (lc->flags & SL_TRACE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
			lc->pri = LOG_KERN | LOG_DEBUG;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
			lc->pri = LOG_KERN | LOG_INFO;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
	return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
mblk_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
log_makemsg(int mid, int sid, int level, int sl, int pri, void *msg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
	size_t size, int on_intr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
	mblk_t *mp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
	mblk_t *mp2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
	log_ctl_t *lc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
	if (size <= LOG_MSGSIZE &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
	    (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
   501
		mp = getq_noenab(log_freeq, 0);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
	if (mp == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
		if (on_intr ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
		    (mp = allocb(sizeof (log_ctl_t), BPRI_HI)) == NULL ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
		    (mp2 = allocb(MAX(size, LOG_MSGSIZE), BPRI_HI)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
			freemsg(mp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
			return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
		DB_TYPE(mp) = M_PROTO;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
		mp->b_wptr += sizeof (log_ctl_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
		mp->b_cont = mp2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
		mp2 = mp->b_cont;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
		mp2->b_wptr = mp2->b_rptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
	lc = (log_ctl_t *)mp->b_rptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
	lc->mid = mid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
	lc->sid = sid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
	lc->level = level;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
	lc->flags = sl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   523
	lc->pri = pri;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
	bcopy(msg, mp2->b_wptr, size - 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
	mp2->b_wptr[size - 1] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
	mp2->b_wptr += strlen((char *)mp2->b_wptr) + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
	return (mp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   532
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   533
log_freemsg(mblk_t *mp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   534
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
	mblk_t *mp2 = mp->b_cont;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   536
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
	ASSERT(MBLKL(mp) == sizeof (log_ctl_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   538
	ASSERT(mp2->b_rptr == mp2->b_datap->db_base);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   539
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   540
	if ((log_freeq->q_flag & QFULL) == 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   541
	    MBLKL(mp2) <= LOG_MSGSIZE && MBLKSIZE(mp2) >= LOG_MSGSIZE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   542
		(void) putq(log_freeq, mp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   543
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   544
		freemsg(mp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   545
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   546
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   547
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   548
log_sendmsg(mblk_t *mp, zoneid_t zoneid)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
	log_t *lp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
	char *src, *dst;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   552
	mblk_t *mp2 = mp->b_cont;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   553
	log_ctl_t *lc = (log_ctl_t *)mp->b_rptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   554
	int flags, fac;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   555
	off_t facility = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
	off_t body = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   557
	zone_t *zptr = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   558
	log_zone_t *lzp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   559
	int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   560
	int backlog;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   561
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   562
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   563
	 * Need to special case the global zone here since this may be
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   564
	 * called before zone_init.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   565
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   566
	if (zoneid == GLOBAL_ZONEID) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   567
		lzp = &log_global;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   568
	} else if ((zptr = zone_find_by_id(zoneid)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   569
		/* specified zone doesn't exist, free message and return */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   570
		log_freemsg(mp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   571
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   572
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   573
		lzp = zone_getspecific(log_zone_key, zptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   574
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   575
	ASSERT(lzp != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   576
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   577
	if ((lc->flags & lzp->lz_active) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   578
		if (zptr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   579
			zone_rele(zptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   580
		log_freemsg(mp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   581
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   582
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   583
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   584
	if (panicstr) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   585
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   586
		 * Raise the console queue's q_hiwat to ensure that we
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   587
		 * capture all panic messages.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   588
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   589
		log_consq->q_hiwat = 2 * LOG_HIWAT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   590
		log_consq->q_flag &= ~QFULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   591
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   592
		/* Message was created while panicking. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   593
		lc->flags |= SL_PANICMSG;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   594
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   595
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   596
	src = (char *)mp2->b_rptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   597
	dst = strstr(src, "FACILITY_AND_PRIORITY] ");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   598
	if (dst != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   599
		facility = dst - src;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   600
		body = facility + 23; /* strlen("FACILITY_AND_PRIORITY] ") */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   601
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   602
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   603
	log_enter();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   604
2771
3414606edb08 6464408 Timestamp on /var/adm/messages is wrong after 248 days
kk112340
parents: 1401
diff changeset
   605
	/*
4123
e5cb484f034e backout 6265036/6531693: causes 6544953
dm120769
parents: 3816
diff changeset
   606
	 * In the early boot phase hrestime is invalid, then timechanged is 0.
e5cb484f034e backout 6265036/6531693: causes 6544953
dm120769
parents: 3816
diff changeset
   607
	 * 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
   608
	 * ttime is calculated in log_conswitch() later. The log_conswitch()
e5cb484f034e backout 6265036/6531693: causes 6544953
dm120769
parents: 3816
diff changeset
   609
	 * calculation to determine the correct ttime does not use ttime data
e5cb484f034e backout 6265036/6531693: causes 6544953
dm120769
parents: 3816
diff changeset
   610
	 * 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
   611
	 * that contain good data.
e5cb484f034e backout 6265036/6531693: causes 6544953
dm120769
parents: 3816
diff changeset
   612
	 *
2771
3414606edb08 6464408 Timestamp on /var/adm/messages is wrong after 248 days
kk112340
parents: 1401
diff changeset
   613
	 */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   614
	lc->ltime = lbolt;
4123
e5cb484f034e backout 6265036/6531693: causes 6544953
dm120769
parents: 3816
diff changeset
   615
	if (timechanged) {
2771
3414606edb08 6464408 Timestamp on /var/adm/messages is wrong after 248 days
kk112340
parents: 1401
diff changeset
   616
		lc->ttime = gethrestime_sec();
3414606edb08 6464408 Timestamp on /var/adm/messages is wrong after 248 days
kk112340
parents: 1401
diff changeset
   617
	} else {
3414606edb08 6464408 Timestamp on /var/adm/messages is wrong after 248 days
kk112340
parents: 1401
diff changeset
   618
		lc->ttime = 0;
3414606edb08 6464408 Timestamp on /var/adm/messages is wrong after 248 days
kk112340
parents: 1401
diff changeset
   619
	}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   620
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   621
	flags = lc->flags & lzp->lz_active;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   622
	log_seq_no[flags & SL_ERROR]++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   623
	log_seq_no[flags & SL_TRACE]++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   624
	log_seq_no[flags & SL_CONSOLE]++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   625
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   626
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   627
	 * If this is in the global zone, start with the backlog, then
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   628
	 * walk through the clone logs.  If not, just do the clone logs.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   629
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   630
	backlog = (zoneid == GLOBAL_ZONEID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   631
	i = LOG_LOGMINIDX;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   632
	while (i <= LOG_LOGMAXIDX) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   633
		if (backlog) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   634
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   635
			 * Do the backlog this time, then start on the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   636
			 * others.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   637
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   638
			backlog = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   639
			lp = &log_backlog;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   640
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   641
			lp = &lzp->lz_clones[i++];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   642
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   643
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   644
		if ((lp->log_flags & flags) && lp->log_wanted(lp, lc)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   645
			if (canput(lp->log_q)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   646
				lp->log_overflow = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   647
				lc->seq_no = log_seq_no[lp->log_flags];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   648
				if ((mp2 = copymsg(mp)) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   649
					break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   650
				if (facility != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   651
					src = (char *)mp2->b_cont->b_rptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   652
					dst = src + facility;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   653
					fac = (lc->pri & LOG_FACMASK) >> 3;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   654
					dst += snprintf(dst,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   655
					    LOG_FACSIZE + LOG_PRISIZE, "%s.%s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   656
					    log_fac[MIN(fac, LOG_NFACILITIES)],
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   657
					    log_pri[lc->pri & LOG_PRIMASK]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   658
					src += body - 2; /* copy "] " too */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   659
					while (*src != '\0')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   660
						*dst++ = *src++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   661
					*dst++ = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   662
					mp2->b_cont->b_wptr = (uchar_t *)dst;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   663
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   664
				(void) putq(lp->log_q, mp2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   665
			} else if (++lp->log_overflow == 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   666
				if (lp->log_q == log_consq) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   667
					console_printf(log_overflow_msg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   668
					    lp->log_minor,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   669
					    " -- is syslogd(1M) running?");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   670
				} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   671
					printf(log_overflow_msg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   672
					    lp->log_minor, "");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   673
				}
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
	if (zptr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   679
		zone_rele(zptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   680
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   681
	if ((flags & SL_CONSOLE) && (lc->pri & LOG_FACMASK) == LOG_KERN) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   682
		if ((mp2 == NULL || log_consq == log_backlogq || panicstr) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   683
		    (lc->flags & SL_LOGONLY) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   684
			console_printf("%s", (char *)mp->b_cont->b_rptr + body);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   685
		if ((lc->flags & SL_CONSONLY) == 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   686
		    (mp2 = copymsg(mp)) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   687
			mp2->b_cont->b_rptr += body;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   688
			if (log_recentq->q_flag & QFULL)
6769
c1faa4d16a30 6666472 Network performance regression under heavy load (introduced by 4868863)
ja97890
parents: 5954
diff changeset
   689
				freemsg(getq_noenab(log_recentq, 0));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   690
			(void) putq(log_recentq, mp2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   691
		}
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
	log_freemsg(mp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   695
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   696
	log_exit();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   697
}
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
 * Print queued messages to console.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   701
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   702
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   703
log_printq(queue_t *qfirst)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   704
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   705
	mblk_t *mp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   706
	queue_t *q, *qlast;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   707
	char *cp, *msgp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   708
	log_ctl_t *lc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   709
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   710
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   711
	 * Look ahead to first queued message in the stream.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   712
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   713
	qlast = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   714
	do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   715
		for (q = qfirst; q->q_next != qlast; q = q->q_next)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   716
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   717
		for (mp = q->q_first; mp != NULL; mp = mp->b_next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   718
			lc = (log_ctl_t *)mp->b_rptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   719
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   720
			 * Check if message is already displayed at
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   721
			 * /dev/console.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   722
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   723
			if (lc->flags & SL_PANICMSG)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   724
				continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   725
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   726
			cp = (char *)mp->b_cont->b_rptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   727
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   728
			/* Strip off the message ID. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   729
			if ((msgp = strstr(cp, "[ID ")) != NULL &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   730
			    (msgp = strstr(msgp,  "] ")) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   731
				cp = msgp + 2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   732
			}
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
			 * Using console_printf instead of printf to avoid
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   736
			 * queueing messages to log_consq.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   737
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   738
			console_printf("%s", cp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   739
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   740
	} while ((qlast = q) != qfirst);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   741
}
1259
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   742
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   743
/* ARGSUSED */
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   744
static int
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   745
log_cons_constructor(void *buf, void *cdrarg, int kmflags)
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   746
{
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   747
	struct log *lp = buf;
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   748
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   749
	lp->log_zoneid = GLOBAL_ZONEID;
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   750
	lp->log_major = LOG_CONSMIN;	/* Indicate which device type */
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   751
	lp->log_data = NULL;
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   752
	return (0);
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   753
}
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
/* ARGSUSED */
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   756
static void
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   757
log_cons_destructor(void *buf, void *cdrarg)
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   758
{
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   759
	struct log *lp = buf;
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   760
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   761
	ASSERT(lp->log_zoneid == GLOBAL_ZONEID);
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   762
	ASSERT(lp->log_major == LOG_CONSMIN);
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   763
	ASSERT(lp->log_data == NULL);
8e7e69328588 6266921 /dev/conslog should be clonable
ns92644
parents: 850
diff changeset
   764
}