configd.c revision 7c478bd95313f5f23a4c958a745db2134aa03244
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon/*
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * CDDL HEADER START
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon *
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * The contents of this file are subject to the terms of the
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * Common Development and Distribution License, Version 1.0 only
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * (the "License"). You may not use this file except in compliance
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * with the License.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon *
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * or http://www.opensolaris.org/os/licensing.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * See the License for the specific language governing permissions
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * and limitations under the License.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon *
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * When distributing Covered Code, include this CDDL HEADER in each
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * If applicable, add the following below this CDDL HEADER, with the
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * fields enclosed by brackets "[]" replaced with your own identifying
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * information: Portions Copyright [yyyy] [name of copyright owner]
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon *
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * CDDL HEADER END
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon */
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon/*
66cd0f60c3182913d379abb730ae755bf6367126Kacheong Poon * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
633fc3a6eed35d918db16925b7048d7a2e28064aSebastien Roy * Use is subject to license terms.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon */
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon#pragma ident "%Z%%M% %I% %E% SMI"
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon#include <mdb/mdb_modapi.h>
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon#include <mdb/mdb_ctf.h>
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon#include <configd.h>
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonmdb_ctf_id_t request_enum;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonmdb_ctf_id_t response_enum;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonmdb_ctf_id_t ptr_type_enum;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonmdb_ctf_id_t thread_state_enum;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonhrtime_t max_time_seen;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonstatic void
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonenum_lookup(char *out, size_t size, mdb_ctf_id_t id, int val,
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon const char *prefix, const char *prefix2)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon{
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon const char *cp;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon size_t len = strlen(prefix);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon size_t len2 = strlen(prefix2);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if ((cp = mdb_ctf_enum_name(id, val)) != NULL) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (strncmp(cp, prefix, len) == 0)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon cp += len;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (strncmp(cp, prefix2, len2) == 0)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon cp += len2;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon (void) strlcpy(out, cp, size);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon } else {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_snprintf(out, size, "? (%d)", val);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon}
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonstatic void
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonmake_lower(char *out, size_t sz)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon{
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon while (*out != 0 && sz > 0) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (*out >= 'A' && *out <= 'Z')
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon *out += 'a' - 'A';
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon out++;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon sz--;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon}
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon/*ARGSUSED*/
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonstatic int
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonconfigd_status(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon{
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon int num_servers;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon int num_started;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (argc != 0)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (DCMD_USAGE);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (mdb_readvar(&num_servers, "num_servers") == -1) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_warn("unable to read num_servers");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (DCMD_ERR);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (mdb_readvar(&num_started, "num_started") == -1) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_warn("unable to read num_started");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (DCMD_ERR);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_printf(
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon "\nserver threads:\t%d running, %d starting\n\n", num_servers,
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon num_started - num_servers);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (mdb_walk_dcmd("configd_threads", "configd_thread", argc,
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon argv) == -1) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_warn("can't walk 'configd_threads'");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (DCMD_ERR);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (DCMD_OK);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon}
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon/*ARGSUSED*/
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonstatic int
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonconfigd_thread(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon{
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon thread_info_t t;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon char state[20];
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon char oldstate[20];
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (!(flags & DCMD_ADDRSPEC)) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (mdb_walk_dcmd("configd_threads", "configd_thread", argc,
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon argv) == -1) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_warn("can't walk 'configd_threads'");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (DCMD_ERR);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (DCMD_OK);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (argc != 0)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (DCMD_USAGE);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (DCMD_HDRSPEC(flags)) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_printf("%<u>%-?s %5s %-12s %-12s %-?s %-?s %-?s%</u>\n",
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon "ADDR", "TID", "STATE", "PREV_STATE", "CLIENT", "CLIENTRQ",
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon "MAINREQ");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (mdb_vread(&t, sizeof (t), addr) == -1) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_warn("failed to read thread_info_t at %p", addr);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (DCMD_ERR);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon enum_lookup(state, sizeof (state), thread_state_enum,
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon t.ti_state, "TI_", "");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon make_lower(state, sizeof (state));
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon enum_lookup(oldstate, sizeof (oldstate), thread_state_enum,
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon t.ti_prev_state, "TI_", "");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon make_lower(oldstate, sizeof (oldstate));
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_printf("%0?p %5d %-12s %-12s %?p %?p %?p\n",
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon (void *)addr, t.ti_thread, state, oldstate,
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon t.ti_active_client, t.ti_client_request, t.ti_main_door_request);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (DCMD_OK);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon}
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonstatic int
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonwalk_thread_info_init(mdb_walk_state_t *wsp)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon{
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (mdb_readvar(&wsp->walk_addr, "thread_list") == -1) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_warn("unable to read thread_list");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (WALK_ERR);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (mdb_layered_walk("uu_list_node", wsp) == -1) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_warn("couldn't walk 'uu_list_node'");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (WALK_ERR);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (WALK_NEXT);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon}
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonstatic int
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonwalk_thread_info_step(mdb_walk_state_t *wsp)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon{
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon uintptr_t addr = wsp->walk_addr;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon thread_info_t ti;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (mdb_vread(&ti, sizeof (ti), addr) == -1) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_warn("unable to read thread_info_t at %p", addr);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (WALK_ERR);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (wsp->walk_callback(addr, &ti, wsp->walk_cbdata));
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon}
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonstatic int
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonrequest_log(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon{
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon request_log_entry_t cur;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon hrtime_t dur;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon hrtime_t dursec;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon hrtime_t durnsec;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon char durstr[20];
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon char stampstr[20];
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon char requstr[30];
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon char respstr[30];
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon char typestr[30];
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon uintptr_t node = 0;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon uintptr_t client = 0;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon uint64_t clientid = 0;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon int idx;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon int opt_v = FALSE; /* verbose */
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (!(flags & DCMD_ADDRSPEC)) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (mdb_walk_dcmd("configd_log", "configd_log", argc,
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon argv) == -1) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_warn("can't walk 'configd_log'");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (DCMD_ERR);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (DCMD_OK);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (mdb_getopts(argc, argv,
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon 'c', MDB_OPT_UINTPTR, &client,
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon 'i', MDB_OPT_UINT64, &clientid,
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon 'n', MDB_OPT_UINTPTR, &node,
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon 'v', MDB_OPT_SETBITS, TRUE, &opt_v, NULL) != argc)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (DCMD_USAGE);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (DCMD_HDRSPEC(flags)) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_printf("%<u>%-?s %-4s %-14s %9s %-22s %-17s\n%</u>",
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon "ADDR", "THRD", "START", "DURATION", "REQUEST",
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon "RESPONSE");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (mdb_vread(&cur, sizeof (cur), addr) == -1) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_warn("couldn't read log entry at %p", addr);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (DCMD_ERR);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon /*
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * apply filters, if any.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon */
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (clientid != 0 && clientid != cur.rl_clientid)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (DCMD_OK);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (client != 0 && client != (uintptr_t)cur.rl_client)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (DCMD_OK);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (node != 0) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon for (idx = 0; idx < MIN(MAX_PTRS, cur.rl_num_ptrs); idx++) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if ((uintptr_t)cur.rl_ptrs[idx].rlp_data == node) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon node = 0; /* found it */
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon break;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (node != 0)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (DCMD_OK);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon enum_lookup(requstr, sizeof (requstr), request_enum, cur.rl_request,
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon "REP_PROTOCOL_", "");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (cur.rl_end != 0) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon enum_lookup(respstr, sizeof (respstr), response_enum,
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon cur.rl_response, "REP_PROTOCOL_", "FAIL_");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon dur = cur.rl_end - cur.rl_start;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon dursec = dur / NANOSEC;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon durnsec = dur % NANOSEC;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (dursec <= 9)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_snprintf(durstr, sizeof (durstr),
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon "%lld.%06lld",
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon dursec, durnsec / (NANOSEC / MICROSEC));
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon else if (dursec <= 9999)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_snprintf(durstr, sizeof (durstr),
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon "%lld.%03lld",
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon dursec, durnsec / (NANOSEC / MILLISEC));
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon else
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_snprintf(durstr, sizeof (durstr),
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon "%lld", dursec);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon } else {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon (void) strcpy(durstr, "-");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon (void) strcpy(respstr, "-");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (max_time_seen != 0 && max_time_seen >= cur.rl_start) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon dur = max_time_seen - cur.rl_start;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon dursec = dur / NANOSEC;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon durnsec = dur % NANOSEC;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (dursec <= 99ULL)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_snprintf(stampstr, sizeof (stampstr),
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon "-%lld.%09lld", dursec, durnsec);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon else if (dursec <= 99999ULL)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_snprintf(stampstr, sizeof (stampstr),
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon "-%lld.%06lld",
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon dursec, durnsec / (NANOSEC / MICROSEC));
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon else if (dursec <= 99999999ULL)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_snprintf(stampstr, sizeof (stampstr),
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon "-%lld.%03lld",
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon dursec, durnsec / (NANOSEC / MILLISEC));
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon else
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_snprintf(stampstr, sizeof (stampstr),
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon "-%lld", dursec);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon } else {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon (void) strcpy(stampstr, "-");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_printf("%0?x %4d T%13s %9s %-22s %-17s\n",
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon addr, cur.rl_tid, stampstr, durstr, requstr, respstr);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (opt_v) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_printf("\tclient: %?p (%d)\tptrs: %d\tstamp: %llx\n",
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon cur.rl_client, cur.rl_clientid, cur.rl_num_ptrs,
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon cur.rl_start);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon for (idx = 0; idx < MIN(MAX_PTRS, cur.rl_num_ptrs); idx++) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon enum_lookup(typestr, sizeof (typestr), ptr_type_enum,
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon cur.rl_ptrs[idx].rlp_type, "RC_PTR_TYPE_", "");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_printf("\t\t%-7s %5d %?p %?p\n", typestr,
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon cur.rl_ptrs[idx].rlp_id, cur.rl_ptrs[idx].rlp_ptr,
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon cur.rl_ptrs[idx].rlp_data);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_printf("\n");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (DCMD_OK);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon}
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonstruct request_log_walk {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon size_t rlw_max;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon size_t rlw_count;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon size_t rlw_cur;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon struct request_entry {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon hrtime_t timestamp;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon uintptr_t addr;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon } *rlw_list;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon};
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon/*
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * we want newer items at the top
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon */
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonstatic int
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonrequest_entry_compare(const void *l, const void *r)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon{
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon const struct request_entry *lp = l;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon const struct request_entry *rp = r;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (rp->timestamp == lp->timestamp)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (0);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon /*
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * 0 timestamps go first.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon */
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (rp->timestamp == 0)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (1);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (lp->timestamp == 0)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (-1);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (lp->timestamp < rp->timestamp)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (1);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (-1);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon}
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon/*ARGSUSED*/
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonstatic int
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonrequest_log_count_thread(uintptr_t addr, thread_info_t *tip, uint_t *arg)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon{
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon (*arg)++;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (WALK_NEXT);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon}
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonstatic int
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonrequest_log_add_thread(uintptr_t addr, thread_info_t *tip,
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon struct request_entry **arg)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon{
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (max_time_seen < tip->ti_log.rl_start)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon max_time_seen = tip->ti_log.rl_start;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (max_time_seen < tip->ti_log.rl_end)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon max_time_seen = tip->ti_log.rl_end;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (tip->ti_log.rl_start != 0) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (tip->ti_log.rl_end)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon (*arg)->timestamp = tip->ti_log.rl_start;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon else
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon (*arg)->timestamp = 0; /* sort to the top */
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon (*arg)->addr = addr + offsetof(thread_info_t, ti_log);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon ++*arg;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (WALK_NEXT);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon}
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonstatic int
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonrequest_log_walk_init(mdb_walk_state_t *wsp)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon{
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon struct request_log_walk *rlw;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon struct request_entry *list, *listp;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon uint_t log_size;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon uint_t size;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon uint_t idx;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon uint_t pos;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon request_log_entry_t *base;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon request_log_entry_t cur;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (mdb_readvar(&base, "request_log") == -1) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_warn("couldn't read 'request_log'");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (WALK_ERR);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (mdb_readvar(&log_size, "request_log_size") == -1) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_warn("couldn't read 'request_log_size'");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (WALK_ERR);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon size = log_size;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (mdb_walk("configd_threads", (mdb_walk_cb_t)request_log_count_thread,
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon &size) == -1) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_warn("couldn't walk 'configd_threads'");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (WALK_ERR);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon list = mdb_zalloc(sizeof (*list) * size, UM_SLEEP);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon listp = list;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (mdb_walk("configd_threads", (mdb_walk_cb_t)request_log_add_thread,
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon &listp) == -1) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_warn("couldn't walk 'configd_threads'");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_free(list, sizeof (*list) * size);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (WALK_ERR);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon pos = listp - list;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon for (idx = 0; idx < log_size; idx++) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon uintptr_t addr = (uintptr_t)&base[idx];
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (mdb_vread(&cur, sizeof (cur), addr) == -1) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_warn("couldn't read log entry at %p", addr);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_free(list, sizeof (*list) * size);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (WALK_ERR);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (max_time_seen < cur.rl_start)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon max_time_seen = cur.rl_start;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (max_time_seen < cur.rl_end)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon max_time_seen = cur.rl_end;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (cur.rl_start != 0) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon list[pos].timestamp = cur.rl_start;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon list[pos].addr = addr;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon pos++;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon qsort(list, pos, sizeof (*list), &request_entry_compare);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon rlw = mdb_zalloc(sizeof (*rlw), UM_SLEEP);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon rlw->rlw_max = size;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon rlw->rlw_count = pos;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon rlw->rlw_cur = 0;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon rlw->rlw_list = list;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon wsp->walk_data = rlw;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (WALK_NEXT);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon}
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonstatic int
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonrequest_log_walk_step(mdb_walk_state_t *wsp)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon{
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon struct request_log_walk *rlw = wsp->walk_data;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon uintptr_t addr;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon request_log_entry_t cur;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (rlw->rlw_cur >= rlw->rlw_count)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (WALK_DONE);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon addr = rlw->rlw_list[rlw->rlw_cur++].addr;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (mdb_vread(&cur, sizeof (cur), addr) == -1) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_warn("couldn't read log entry at %p", addr);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (WALK_ERR);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (wsp->walk_callback(addr, &cur, wsp->walk_cbdata));
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon}
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonstatic void
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonrequest_log_walk_fini(mdb_walk_state_t *wsp)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon{
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon struct request_log_walk *rlw = wsp->walk_data;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_free(rlw->rlw_list, sizeof (*rlw->rlw_list) * rlw->rlw_max);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_free(rlw, sizeof (*rlw));
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon}
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonstatic const mdb_dcmd_t dcmds[] = {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon { "configd_status", NULL, "svc.configd status summary",
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon configd_status },
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon { "configd_thread", "?", "Print a thread_info_t tabularly",
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon configd_thread },
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon { "configd_log", "?[-v] [-c clientptr] [-i clientid]",
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon "Print the request log, or a single entry", request_log },
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon { NULL }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon};
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonstatic const mdb_walker_t walkers[] = {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon { "configd_threads", "walks the thread_info_ts for all "
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon "threads", walk_thread_info_init, walk_thread_info_step },
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon { "configd_log", "walks the request_log_entry_ts",
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon request_log_walk_init, request_log_walk_step,
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon request_log_walk_fini},
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon { NULL }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon};
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonstatic const mdb_modinfo_t modinfo = {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon MDB_API_VERSION, dcmds, walkers
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon};
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonconst mdb_modinfo_t *
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon_mdb_init(void)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon{
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (mdb_ctf_lookup_by_name("enum rep_protocol_requestid",
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon &request_enum) == -1) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_warn("enum rep_protocol_requestid not found");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (mdb_ctf_lookup_by_name("enum rep_protocol_responseid",
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon &response_enum) == -1) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_warn("enum rep_protocol_responseid not found");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (mdb_ctf_lookup_by_name("enum rc_ptr_type",
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon &ptr_type_enum) == -1) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_warn("enum rc_ptr_type not found");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (mdb_ctf_lookup_by_name("enum thread_state",
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon &thread_state_enum) == -1) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_warn("enum thread_state not found");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (&modinfo);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon}
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon