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