configd.c revision 7c478bd95313f5f23a4c958a745db2134aa03244
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * CDDL HEADER START
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 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * See the License for the specific language governing permissions
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * and limitations under the License.
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 * CDDL HEADER END
66cd0f60c3182913d379abb730ae755bf6367126Kacheong Poon * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
633fc3a6eed35d918db16925b7048d7a2e28064aSebastien Roy * Use is subject to license terms.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon#pragma ident "%Z%%M% %I% %E% SMI"
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonenum_lookup(char *out, size_t size, mdb_ctf_id_t id, int val,
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon const char *cp;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if ((cp = mdb_ctf_enum_name(id, val)) != NULL) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonconfigd_status(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (mdb_readvar(&num_servers, "num_servers") == -1) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (mdb_readvar(&num_started, "num_started") == -1) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon "\nserver threads:\t%d running, %d starting\n\n", num_servers,
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (mdb_walk_dcmd("configd_threads", "configd_thread", argc,
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonconfigd_thread(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (mdb_walk_dcmd("configd_threads", "configd_thread", argc,
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 mdb_warn("failed to read thread_info_t at %p", addr);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon enum_lookup(state, sizeof (state), thread_state_enum,
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon enum_lookup(oldstate, sizeof (oldstate), thread_state_enum,
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_printf("%0?p %5d %-12s %-12s %?p %?p %?p\n",
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon t.ti_active_client, t.ti_client_request, t.ti_main_door_request);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (mdb_readvar(&wsp->walk_addr, "thread_list") == -1) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (mdb_layered_walk("uu_list_node", wsp) == -1) {
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 (wsp->walk_callback(addr, &ti, wsp->walk_cbdata));
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonrequest_log(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (mdb_walk_dcmd("configd_log", "configd_log", argc,
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon 'v', MDB_OPT_SETBITS, TRUE, &opt_v, NULL) != argc)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_printf("%<u>%-?s %-4s %-14s %9s %-22s %-17s\n%</u>",
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon "ADDR", "THRD", "START", "DURATION", "REQUEST",
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (mdb_vread(&cur, sizeof (cur), addr) == -1) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_warn("couldn't read log entry at %p", addr);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * apply filters, if any.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (clientid != 0 && clientid != cur.rl_clientid)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (client != 0 && client != (uintptr_t)cur.rl_client)
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 enum_lookup(requstr, sizeof (requstr), request_enum, cur.rl_request,
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon enum_lookup(respstr, sizeof (respstr), response_enum,
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon "%lld.%06lld",
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon "%lld.%03lld",
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (max_time_seen != 0 && max_time_seen >= cur.rl_start) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon "-%lld.%06lld",
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon "-%lld.%03lld",
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 mdb_printf("\tclient: %?p (%d)\tptrs: %d\tstamp: %llx\n",
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon cur.rl_client, cur.rl_clientid, cur.rl_num_ptrs,
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 cur.rl_ptrs[idx].rlp_id, cur.rl_ptrs[idx].rlp_ptr,
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * we want newer items at the top
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonrequest_entry_compare(const void *l, const void *r)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * 0 timestamps go first.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonrequest_log_count_thread(uintptr_t addr, thread_info_t *tip, uint_t *arg)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonrequest_log_add_thread(uintptr_t addr, thread_info_t *tip,
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon (*arg)->addr = addr + offsetof(thread_info_t, ti_log);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (mdb_readvar(&base, "request_log") == -1) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (mdb_readvar(&log_size, "request_log_size") == -1) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (mdb_walk("configd_threads", (mdb_walk_cb_t)request_log_count_thread,
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon list = mdb_zalloc(sizeof (*list) * size, UM_SLEEP);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (mdb_walk("configd_threads", (mdb_walk_cb_t)request_log_add_thread,
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (mdb_vread(&cur, sizeof (cur), addr) == -1) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_warn("couldn't read log entry at %p", addr);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon qsort(list, pos, sizeof (*list), &request_entry_compare);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon struct request_log_walk *rlw = wsp->walk_data;
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 (wsp->walk_callback(addr, &cur, wsp->walk_cbdata));
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon struct request_log_walk *rlw = wsp->walk_data;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_free(rlw->rlw_list, sizeof (*rlw->rlw_list) * rlw->rlw_max);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon { "configd_status", NULL, "svc.configd status summary",
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon { "configd_thread", "?", "Print a thread_info_t tabularly",
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon { "configd_log", "?[-v] [-c clientptr] [-i clientid]",
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon "Print the request log, or a single entry", request_log },
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 if (mdb_ctf_lookup_by_name("enum rep_protocol_requestid",
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_warn("enum rep_protocol_requestid not found");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (mdb_ctf_lookup_by_name("enum rep_protocol_responseid",
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mdb_warn("enum rep_protocol_responseid not found");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (mdb_ctf_lookup_by_name("enum rc_ptr_type",
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (mdb_ctf_lookup_by_name("enum thread_state",