da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * CDDL HEADER START
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * The contents of this file are subject to the terms of the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Common Development and Distribution License (the "License").
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * You may not use this file except in compliance with the License.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * or http://www.opensolaris.org/os/licensing.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * See the License for the specific language governing permissions
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * and limitations under the License.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * When distributing Covered Code, include this CDDL HEADER in each
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * If applicable, add the following below this CDDL HEADER, with the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * fields enclosed by brackets "[]" replaced with your own identifying
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * information: Portions Copyright [yyyy] [name of copyright owner]
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * CDDL HEADER END
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * Copyright 2015 Nexenta Systems, Inc. All rights reserved.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * smbstat: Server Message Block File System statistics
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * The statistics this CLI displays come from two sources:
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * 1) The kernel module 'smbsrv'.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * 2) The SMB workers task queue statistics the task queue manager of Solaris
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * maintains.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * The flow of the code is the following:
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * +----------------+
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * | Initialization |
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * +----------------+
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * |
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * |
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * v
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * +--------------------------*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * | Take a snapshot the data | <--------+
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * +--------------------------+ |
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * | |
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * | |
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * v |
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * +----------------------+ |
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * | Process the snapshot | |
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * +----------------------+ |
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * | |
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * | |
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * v |
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * +------------------------------------+ |
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * | Print the result of the processing | |
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * +------------------------------------+ |
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * | |
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * | |
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * v |
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Yes --------------- |
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * +------------ < interval == 0 ? > |
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * | --------------- |
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * | | |
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * | | No |
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * | v |
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * | +------------------------+ |
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * | | Sleep for the duration | ----------+
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * | | of the interval. |
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * | +------------------------+
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * |
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * +---------------------+
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * |
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * v
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Exit
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * There are two sets of snapshots. One set for the smbsrv module and the other
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * for the task queue (SMB workers). Each set contains 2 snapshots. One is
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * labeled 'current' the other one 'previous'. Their role changes after each
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * snapshot. The 'current' becomes 'previous' and vice versa.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * The first snapshot taken is compared against the data gathered since the
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * smbsrv module was loaded. Subsequent snapshots will be compared against the
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * previous snapshot.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <stdio.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <stdlib.h>
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright#include <unistd.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <kstat.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <stdarg.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <errno.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <inttypes.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <strings.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <utility.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <libintl.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <zone.h>
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright#include <termios.h>
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright#include <stropts.h>
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright#include <math.h>
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright#include <umem.h>
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright#include <locale.h>
6537f381d2d9e7b4e2f7b29c3e7a3f13be036f2eas#include <smbsrv/smb_kstat.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright#if !defined(TEXT_DOMAIN)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright#define TEXT_DOMAIN "SYS_TEST"
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright#endif /* TEXT_DOMAIN */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright#define SMBSTAT_ID_NO_CPU -1
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright#define SMBSTAT_SNAPSHOT_COUNT 2 /* Must be a power of 2 */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright#define SMBSTAT_SNAPSHOT_MASK (SMBSTAT_SNAPSHOT_COUNT - 1)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright#define SMBSTAT_HELP \
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright "Usage: smbstat [-acnrtuz] [interval]\n" \
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright " -c: display counters\n" \
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright " -t: display throughput\n" \
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright " -u: display utilization\n" \
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright " -r: display requests\n" \
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright " -a: all the requests (supported and unsupported)\n" \
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright " -z: skip the requests not received\n" \
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright " -n: display in alphabetic order\n" \
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright " interval: refresh cycle in seconds\n"
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright#define SMBSRV_COUNTERS_BANNER "\n nbt tcp users trees files pipes\n"
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright#define SMBSRV_COUNTERS_FORMAT "%5d %5d %5d %5d %5d %5d\n"
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright#define SMBSRV_THROUGHPUT_BANNER \
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright "\nrbytes/s tbytes/s reqs/s reads/s writes/s\n"
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright#define SMBSRV_THROUGHPUT_FORMAT \
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright "%1.3e %1.3e %1.3e %1.3e %1.3e\n"
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright#define SMBSRV_UTILIZATION_BANNER \
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright "\n wcnt rcnt wtime rtime" \
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright " w%% r%% u%% sat usr%% sys%% idle%%\n"
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright#define SMBSRV_UTILIZATION_FORMAT \
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright "%1.3e %1.3e %1.3e %1.3e %3.0f %3.0f %3.0f %s " \
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright "%3.0f %3.0f %3.0f\n"
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright#define SMBSRV_REQUESTS_BANNER \
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright "\n%30s code %% rbytes/s tbytes/s req/s rt-mean" \
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright " rt-stddev\n"
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright#define SMBSRV_REQUESTS_FORMAT \
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright "%30s %02X %3.0f %1.3e %1.3e %1.3e %1.3e %1.3e\n"
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrighttypedef enum {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright CPU_TICKS_IDLE = 0,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright CPU_TICKS_USER,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright CPU_TICKS_KERNEL,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright CPU_TICKS_SENTINEL
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright} cpu_state_idx_t;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrighttypedef struct smbstat_cpu_snapshot {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright processorid_t cs_id;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright int cs_state;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright uint64_t cs_ticks[CPU_TICKS_SENTINEL];
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright} smbstat_cpu_snapshot_t;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrighttypedef struct smbstat_srv_snapshot {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright hrtime_t ss_snaptime;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbsrv_kstats_t ss_data;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright} smbstat_srv_snapshot_t;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrighttypedef struct smbstat_wrk_snapshot {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright uint64_t ws_maxthreads;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright uint64_t ws_bnalloc;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright} smbstat_wrk_snapshot_t;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrighttypedef struct smbstat_req_info {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright char ri_name[KSTAT_STRLEN];
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright int ri_opcode;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright double ri_pct;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright double ri_tbs;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright double ri_rbs;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright double ri_rqs;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright double ri_stddev;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright double ri_mean;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright} smbstat_req_info_t;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrighttypedef struct smbstat_srv_info {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright double si_hretime;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright double si_etime;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright double si_total_nreqs;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright /*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Counters
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright uint32_t si_nbt_sess; /* NBT sessions */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright uint32_t si_tcp_sess; /* TCP sessions */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright uint32_t si_users; /* Users logged in */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright uint32_t si_trees; /* Trees connected */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright uint32_t si_files; /* Open files */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright uint32_t si_pipes; /* Open pipes */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright /*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Throughput of the server
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright double si_tbs; /* Bytes transmitted / second */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright double si_rbs; /* Bytes received / second */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright double si_rqs; /* Requests treated / second */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright double si_rds; /* Reads treated / second */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright double si_wrs; /* Writes treated / second */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright /*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Utilization of the server
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright double si_wpct; /* */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright double si_rpct; /* */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright double si_upct; /* Utilization in % */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright double si_avw; /* Average number of requests waiting */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright double si_avr; /* Average number of requests running */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright double si_wserv; /* Average waiting time */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright double si_rserv; /* Average running time */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright boolean_t si_sat;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright double si_ticks[CPU_TICKS_SENTINEL];
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright /*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Latency & Throughput per request
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smbstat_req_info_t si_reqs1[SMB_COM_NUM];
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smbstat_req_info_t si_reqs2[SMB2__NCMDS];
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright} smbstat_srv_info_t;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
6537f381d2d9e7b4e2f7b29c3e7a3f13be036f2easstatic void smbstat_init(void);
6537f381d2d9e7b4e2f7b29c3e7a3f13be036f2easstatic void smbstat_fini(void);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void smbstat_kstat_snapshot(void);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void smbstat_kstat_process(void);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void smbstat_kstat_print(void);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void smbstat_print_counters(void);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void smbstat_print_throughput(void);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void smbstat_print_utilization(void);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void smbstat_print_requests(void);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void smbstat_cpu_init(void);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void smbstat_cpu_fini(void);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic smbstat_cpu_snapshot_t *smbstat_cpu_current_snapshot(void);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic smbstat_cpu_snapshot_t *smbstat_cpu_previous_snapshot(void);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void smbstat_cpu_snapshot(void);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void smbstat_cpu_process(void);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void smbstat_wrk_init(void);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void smbstat_wrk_fini(void);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void smbstat_wrk_snapshot(void);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void smbstat_wrk_process(void);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic smbstat_wrk_snapshot_t *smbstat_wrk_current_snapshot(void);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void smbstat_srv_init(void);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void smbstat_srv_fini(void);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void smbstat_srv_snapshot(void);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void smbstat_srv_process(void);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void smbstat_srv_process_counters(smbstat_srv_snapshot_t *);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void smbstat_srv_process_throughput(smbstat_srv_snapshot_t *,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_snapshot_t *);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void smbstat_srv_process_utilization(smbstat_srv_snapshot_t *,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_snapshot_t *);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void smbstat_srv_process_requests(smbstat_srv_snapshot_t *,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_snapshot_t *);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic void smbstat_srv_process_one_req(smbstat_req_info_t *,
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_kstat_req_t *, smb_kstat_req_t *, boolean_t);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic smbstat_srv_snapshot_t *smbstat_srv_current_snapshot(void);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic smbstat_srv_snapshot_t *smbstat_srv_previous_snapshot(void);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void *smbstat_zalloc(size_t);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void smbstat_free(void *, size_t);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic void smbstat_fail(int, char *, ...);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void smbstat_snapshot_inc_idx(void);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void smbstat_usage(FILE *, int);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic uint_t smbstat_strtoi(char const *, char *);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic double smbstat_hrtime_delta(hrtime_t, hrtime_t);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic double smbstat_sub_64(uint64_t, uint64_t);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void smbstat_req_order(void);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic double smbstat_zero(double);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void smbstat_termio_init(void);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright#pragma does_not_return(smbstat_fail, smbstat_usage)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic char *smbstat_cpu_states[CPU_TICKS_SENTINEL] = {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright "cpu_ticks_idle",
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright "cpu_ticks_user",
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright "cpu_ticks_kernel"
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright};
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic boolean_t smbstat_opt_a = B_FALSE; /* all */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic boolean_t smbstat_opt_c = B_FALSE; /* counters */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic boolean_t smbstat_opt_n = B_FALSE; /* by name */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic boolean_t smbstat_opt_u = B_FALSE; /* utilization */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic boolean_t smbstat_opt_t = B_FALSE; /* throughput */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic boolean_t smbstat_opt_r = B_FALSE; /* requests */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic boolean_t smbstat_opt_z = B_FALSE; /* non-zero requests */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic uint_t smbstat_interval = 0;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic long smbstat_nrcpus = 0;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic kstat_ctl_t *smbstat_ksc = NULL;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic kstat_t *smbstat_srv_ksp = NULL;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic kstat_t *smbstat_wrk_ksp = NULL;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic struct winsize smbstat_ws;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic uint16_t smbstat_rows = 0;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic int smbstat_snapshot_idx = 0;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic smbstat_cpu_snapshot_t *smbstat_cpu_snapshots[SMBSTAT_SNAPSHOT_COUNT];
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic smbstat_srv_snapshot_t smbstat_srv_snapshots[SMBSTAT_SNAPSHOT_COUNT];
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic smbstat_wrk_snapshot_t smbstat_wrk_snapshots[SMBSTAT_SNAPSHOT_COUNT];
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic smbstat_srv_info_t smbstat_srv_info;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * main
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwint
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwmain(int argc, char *argv[])
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright int c;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) setlocale(LC_ALL, "");
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) textdomain(TEXT_DOMAIN);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (is_system_labeled()) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) fprintf(stderr,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw gettext("%s: Trusted Extensions not supported.\n"),
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw argv[0]);
8622ec4569457733001d4982ef7f5b44427069beGordon Ross return (1);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright while ((c = getopt(argc, argv, "achnrtuz")) != EOF) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw switch (c) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright case 'a':
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_opt_a = B_TRUE;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright case 'n':
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_opt_n = B_TRUE;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright case 'u':
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_opt_u = B_TRUE;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright break;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright case 'c':
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_opt_c = B_TRUE;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright break;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright case 'r':
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_opt_r = B_TRUE;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright break;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright case 't':
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_opt_t = B_TRUE;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright break;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright case 'z':
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_opt_z = B_TRUE;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright break;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright case 'h':
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_usage(stdout, 0);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw default:
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_usage(stderr, 1);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (!smbstat_opt_u &&
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright !smbstat_opt_c &&
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright !smbstat_opt_r &&
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright !smbstat_opt_t) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright /* Default options when none is specified. */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_opt_u = B_TRUE;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_opt_t = B_TRUE;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (optind < argc) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_interval =
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_strtoi(argv[optind], "invalid count");
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright optind++;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if ((argc - optind) > 1)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_usage(stderr, 1);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) atexit(smbstat_fini);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_init();
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright for (;;) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_kstat_snapshot();
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_kstat_process();
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_kstat_print();
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (smbstat_interval == 0)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright break;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) sleep(smbstat_interval);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_snapshot_inc_idx();
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (0);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * smbstat_init
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Global initialization.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmbstat_init(void)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if ((smbstat_ksc = kstat_open()) == NULL)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_fail(1, gettext("kstat_open(): can't open /dev/kstat"));
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_cpu_init();
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_init();
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_wrk_init();
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_req_order();
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * smbstat_fini
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Releases the resources smbstat_init() allocated.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmbstat_fini(void)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_wrk_fini();
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_fini();
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_cpu_fini();
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) kstat_close(smbstat_ksc);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * smbstat_kstat_snapshot
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Takes a snapshot of the data.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmbstat_kstat_snapshot(void)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_cpu_snapshot();
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_snapshot();
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_wrk_snapshot();
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * smbstat_kstat_process
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmbstat_kstat_process(void)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_cpu_process();
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_process();
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_wrk_process();
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * smbstat_kstat_print
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Print the data processed.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmbstat_kstat_print(void)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_termio_init();
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_print_counters();
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_print_throughput();
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_print_utilization();
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_print_requests();
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross (void) fflush(stdout);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * smbstat_print_counters
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Displays the SMB server counters (session, users...).
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmbstat_print_counters(void)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (!smbstat_opt_c)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (smbstat_opt_u || smbstat_opt_r || smbstat_opt_t ||
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (smbstat_rows == 0) || (smbstat_rows >= smbstat_ws.ws_row)) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) printf(SMBSRV_COUNTERS_BANNER);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_rows = 1;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) printf(SMBSRV_COUNTERS_FORMAT,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_nbt_sess,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_tcp_sess,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_users,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_trees,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_files,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_pipes);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright ++smbstat_rows;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * smbstat_print_throughput
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Formats the SMB server throughput output.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmbstat_print_throughput(void)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (!smbstat_opt_t)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (smbstat_opt_u || smbstat_opt_r || smbstat_opt_c ||
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (smbstat_rows == 0) || (smbstat_rows >= smbstat_ws.ws_row)) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) printf(SMBSRV_THROUGHPUT_BANNER);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_rows = 1;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) printf(SMBSRV_THROUGHPUT_FORMAT,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_zero(smbstat_srv_info.si_rbs),
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_zero(smbstat_srv_info.si_tbs),
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_zero(smbstat_srv_info.si_rqs),
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_zero(smbstat_srv_info.si_rds),
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_zero(smbstat_srv_info.si_wrs));
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright ++smbstat_rows;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * smbstat_print_utilization
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmbstat_print_utilization(void)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright char *sat;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (!smbstat_opt_u)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (smbstat_opt_t || smbstat_opt_r || smbstat_opt_c ||
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (smbstat_rows == 0) || (smbstat_rows >= smbstat_ws.ws_row)) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) printf(SMBSRV_UTILIZATION_BANNER);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_rows = 1;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (smbstat_srv_info.si_sat)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright sat = "yes";
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright else
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright sat = "no ";
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) printf(SMBSRV_UTILIZATION_FORMAT,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_avw,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_avr,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_wserv,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_rserv,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_zero(smbstat_srv_info.si_wpct),
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_zero(smbstat_srv_info.si_rpct),
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_zero(smbstat_srv_info.si_upct),
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright sat,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_ticks[CPU_TICKS_USER],
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_ticks[CPU_TICKS_KERNEL],
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_ticks[CPU_TICKS_IDLE]);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright ++smbstat_rows;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * smbstat_print_requests
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic void
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmbstat_print_requests(void)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_req_info_t *prq;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright int i;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (!smbstat_opt_r)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) printf(SMBSRV_REQUESTS_BANNER, " ");
6537f381d2d9e7b4e2f7b29c3e7a3f13be036f2eas
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross prq = smbstat_srv_info.si_reqs1;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright for (i = 0; i < SMB_COM_NUM; i++) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (!smbstat_opt_a &&
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright strncmp(prq[i].ri_name, "Invalid", sizeof ("Invalid")) == 0)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright continue;
6537f381d2d9e7b4e2f7b29c3e7a3f13be036f2eas
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (!smbstat_opt_z || (prq[i].ri_pct != 0)) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) printf(SMBSRV_REQUESTS_FORMAT,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright prq[i].ri_name,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright prq[i].ri_opcode,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_zero(prq[i].ri_pct),
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_zero(prq[i].ri_rbs),
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_zero(prq[i].ri_tbs),
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_zero(prq[i].ri_rqs),
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright prq[i].ri_mean,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright prq[i].ri_stddev);
6537f381d2d9e7b4e2f7b29c3e7a3f13be036f2eas }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross prq = smbstat_srv_info.si_reqs2;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross for (i = 0; i < SMB2__NCMDS; i++) {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (!smbstat_opt_a && i == SMB2_INVALID_CMD)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross continue;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (!smbstat_opt_z || (prq[i].ri_pct != 0)) {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross (void) printf(SMBSRV_REQUESTS_FORMAT,
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross prq[i].ri_name,
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross prq[i].ri_opcode,
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smbstat_zero(prq[i].ri_pct),
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smbstat_zero(prq[i].ri_rbs),
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smbstat_zero(prq[i].ri_tbs),
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smbstat_zero(prq[i].ri_rqs),
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross prq[i].ri_mean,
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross prq[i].ri_stddev);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross }
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * smbstat_cpu_init
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmbstat_cpu_init(void)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright size_t size;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright int i;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_nrcpus = sysconf(_SC_CPUID_MAX) + 1;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright size = smbstat_nrcpus * sizeof (smbstat_cpu_snapshot_t);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright for (i = 0; i < SMBSTAT_SNAPSHOT_COUNT; i++)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_cpu_snapshots[i] = smbstat_zalloc(size);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * smbstat_cpu_fini
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmbstat_cpu_fini(void)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright size_t size;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright int i;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright size = smbstat_nrcpus * sizeof (smbstat_cpu_snapshot_t);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright for (i = 0; i < SMBSTAT_SNAPSHOT_COUNT; i++)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_free(smbstat_cpu_snapshots[i], size);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * smbstat_cpu_current_snapshot
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic smbstat_cpu_snapshot_t *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmbstat_cpu_current_snapshot(void)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return (smbstat_cpu_snapshots[smbstat_snapshot_idx]);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * smbstat_cpu_previous_snapshot
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic smbstat_cpu_snapshot_t *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmbstat_cpu_previous_snapshot(void)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright int idx;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idx = (smbstat_snapshot_idx - 1) & SMBSTAT_SNAPSHOT_MASK;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return (smbstat_cpu_snapshots[idx]);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * smbstat_cpu_snapshot
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmbstat_cpu_snapshot(void)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright kstat_t *ksp;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright kstat_named_t *ksn;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_cpu_snapshot_t *curr;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright long i;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright int j;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright curr = smbstat_cpu_current_snapshot();
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright for (i = 0; i < smbstat_nrcpus; i++, curr++) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright curr->cs_id = SMBSTAT_ID_NO_CPU;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright curr->cs_state = p_online(i, P_STATUS);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright /* If no valid CPU is present, move on to the next one */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (curr->cs_state == -1)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright continue;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright curr->cs_id = i;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright ksp = kstat_lookup(smbstat_ksc, "cpu", i, "sys");
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (ksp == NULL)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_fail(1,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright gettext("kstat_lookup('cpu sys %d') failed"), i);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (kstat_read(smbstat_ksc, ksp, NULL) == -1)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_fail(1,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright gettext("kstat_read('cpu sys %d') failed"), i);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright for (j = 0; j < CPU_TICKS_SENTINEL; j++) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright ksn = kstat_data_lookup(ksp, smbstat_cpu_states[j]);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (ksn == NULL)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_fail(1,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright gettext("kstat_data_lookup('%s') failed"),
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_cpu_states[j]);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright curr->cs_ticks[j] = ksn->value.ui64;
6537f381d2d9e7b4e2f7b29c3e7a3f13be036f2eas }
6537f381d2d9e7b4e2f7b29c3e7a3f13be036f2eas }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * smbstat_cpu_process
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic void
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmbstat_cpu_process(void)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_cpu_snapshot_t *curr, *prev;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright double total_ticks;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright double agg_ticks[CPU_TICKS_SENTINEL];
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright int i, j;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright curr = smbstat_cpu_current_snapshot();
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright prev = smbstat_cpu_previous_snapshot();
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright bzero(agg_ticks, sizeof (agg_ticks));
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright total_ticks = 0;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright for (i = 0; i < smbstat_nrcpus; i++, curr++, prev++) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright for (j = 0; j < CPU_TICKS_SENTINEL; j++) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright agg_ticks[j] += smbstat_sub_64(curr->cs_ticks[j],
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright prev->cs_ticks[j]);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright total_ticks += smbstat_sub_64(curr->cs_ticks[j],
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright prev->cs_ticks[j]);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright for (j = 0; j < CPU_TICKS_SENTINEL; j++)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_ticks[j] =
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (agg_ticks[j] * 100.0) / total_ticks;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * smbstat_wrk_init
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic void
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmbstat_wrk_init(void)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_wrk_ksp =
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright kstat_lookup(smbstat_ksc, "unix", -1, SMBSRV_KSTAT_WORKERS);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (smbstat_wrk_ksp == NULL)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_fail(1,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright gettext("cannot retrieve smbsrv workers kstat\n"));
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
6537f381d2d9e7b4e2f7b29c3e7a3f13be036f2eas
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmbstat_wrk_fini(void)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_wrk_ksp = NULL;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
6537f381d2d9e7b4e2f7b29c3e7a3f13be036f2eas
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * smbstat_wrk_snapshot
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmbstat_wrk_snapshot(void)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_wrk_snapshot_t *curr;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright kstat_named_t *kn;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright curr = smbstat_wrk_current_snapshot();
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (kstat_read(smbstat_ksc, smbstat_wrk_ksp, NULL) == -1)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_fail(1, gettext("kstat_read('%s') failed"),
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_wrk_ksp->ks_name);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright kn = kstat_data_lookup(smbstat_wrk_ksp, "maxthreads");
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if ((kn == NULL) || (kn->data_type != KSTAT_DATA_UINT64))
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_fail(1, gettext("kstat_read('%s') failed"),
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright "maxthreads");
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright curr->ws_maxthreads = kn->value.ui64;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright kn = kstat_data_lookup(smbstat_wrk_ksp, "bnalloc");
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if ((kn == NULL) || (kn->data_type != KSTAT_DATA_UINT64))
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_fail(1, gettext("kstat_read('%s') failed"),
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright "bnalloc");
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright curr->ws_bnalloc = kn->value.ui64;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * smbstat_wrk_process
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
6537f381d2d9e7b4e2f7b29c3e7a3f13be036f2easstatic void
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmbstat_wrk_process(void)
6537f381d2d9e7b4e2f7b29c3e7a3f13be036f2eas{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_wrk_snapshot_t *curr;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright curr = smbstat_wrk_current_snapshot();
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (curr->ws_bnalloc >= curr->ws_maxthreads)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_sat = B_TRUE;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright else
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_sat = B_FALSE;
6537f381d2d9e7b4e2f7b29c3e7a3f13be036f2eas}
6537f381d2d9e7b4e2f7b29c3e7a3f13be036f2eas
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * smbstat_wrk_current_snapshot
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic smbstat_wrk_snapshot_t *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmbstat_wrk_current_snapshot(void)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return (&smbstat_wrk_snapshots[smbstat_snapshot_idx]);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * smbstat_srv_init
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmbstat_srv_init(void)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_ksp = kstat_lookup(smbstat_ksc, SMBSRV_KSTAT_MODULE,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright getzoneid(), SMBSRV_KSTAT_STATISTICS);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (smbstat_srv_ksp == NULL)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_fail(1, gettext("cannot retrieve smbsrv kstat\n"));
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * smbstat_srv_fini
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmbstat_srv_fini(void)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_ksp = NULL;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * smbstat_srv_snapshot
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Take a snapshot of the smbsrv module statistics.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmbstat_srv_snapshot(void)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_snapshot_t *curr;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright curr = smbstat_srv_current_snapshot();
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if ((kstat_read(smbstat_ksc, smbstat_srv_ksp, NULL) == -1) ||
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (smbstat_srv_ksp->ks_data_size != sizeof (curr->ss_data)))
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_fail(1, gettext("kstat_read('%s') failed"),
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_ksp->ks_name);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright curr->ss_snaptime = smbstat_srv_ksp->ks_snaptime;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright bcopy(smbstat_srv_ksp->ks_data, &curr->ss_data, sizeof (curr->ss_data));
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * smbstat_srv_process
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Processes the snapshot data.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmbstat_srv_process(void)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_snapshot_t *curr, *prev;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright curr = smbstat_srv_current_snapshot();
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright prev = smbstat_srv_previous_snapshot();
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (prev->ss_snaptime == 0)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_hretime =
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_hrtime_delta(curr->ss_data.ks_start_time,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright curr->ss_snaptime);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright else
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_hretime =
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_hrtime_delta(prev->ss_snaptime, curr->ss_snaptime);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_etime = smbstat_srv_info.si_hretime / NANOSEC;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_total_nreqs =
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_sub_64(curr->ss_data.ks_nreq, prev->ss_data.ks_nreq);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (smbstat_opt_c)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_process_counters(curr);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (smbstat_opt_t)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_process_throughput(curr, prev);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (smbstat_opt_u)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_process_utilization(curr, prev);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (smbstat_opt_r)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_process_requests(curr, prev);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * smbstat_srv_process_counters
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmbstat_srv_process_counters(smbstat_srv_snapshot_t *curr)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_nbt_sess = curr->ss_data.ks_nbt_sess;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_tcp_sess = curr->ss_data.ks_tcp_sess;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_users = curr->ss_data.ks_users;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_trees = curr->ss_data.ks_trees;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_files = curr->ss_data.ks_files;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_pipes = curr->ss_data.ks_pipes;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * smbstat_srv_process_throughput
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Processes the data relative to the throughput of the smbsrv module and
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * stores the results in the structure smbstat_srv_info.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmbstat_srv_process_throughput(
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_snapshot_t *curr,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_snapshot_t *prev)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_tbs =
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_sub_64(curr->ss_data.ks_txb, prev->ss_data.ks_txb);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_tbs /= smbstat_srv_info.si_etime;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_rbs =
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_sub_64(curr->ss_data.ks_rxb, prev->ss_data.ks_rxb);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_rbs /= smbstat_srv_info.si_etime;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_rqs = smbstat_srv_info.si_total_nreqs;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_rqs /= smbstat_srv_info.si_etime;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_rds = smbstat_sub_64(
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross curr->ss_data.ks_reqs1[SMB_COM_READ].kr_nreq,
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross prev->ss_data.ks_reqs1[SMB_COM_READ].kr_nreq);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smbstat_srv_info.si_rds += smbstat_sub_64(
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross curr->ss_data.ks_reqs1[SMB_COM_LOCK_AND_READ].kr_nreq,
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross prev->ss_data.ks_reqs1[SMB_COM_LOCK_AND_READ].kr_nreq);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_rds += smbstat_sub_64(
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross curr->ss_data.ks_reqs1[SMB_COM_READ_RAW].kr_nreq,
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross prev->ss_data.ks_reqs1[SMB_COM_READ_RAW].kr_nreq);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_rds += smbstat_sub_64(
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross curr->ss_data.ks_reqs1[SMB_COM_READ_ANDX].kr_nreq,
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross prev->ss_data.ks_reqs1[SMB_COM_READ_ANDX].kr_nreq);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_rds += smbstat_sub_64(
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross curr->ss_data.ks_reqs2[SMB2_READ].kr_nreq,
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross prev->ss_data.ks_reqs2[SMB2_READ].kr_nreq);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_rds /= smbstat_srv_info.si_etime;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_wrs = smbstat_sub_64(
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross curr->ss_data.ks_reqs1[SMB_COM_WRITE].kr_nreq,
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross prev->ss_data.ks_reqs1[SMB_COM_WRITE].kr_nreq);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_wrs += smbstat_sub_64(
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross curr->ss_data.ks_reqs1[SMB_COM_WRITE_AND_UNLOCK].kr_nreq,
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross prev->ss_data.ks_reqs1[SMB_COM_WRITE_AND_UNLOCK].kr_nreq);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_wrs += smbstat_sub_64(
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross curr->ss_data.ks_reqs1[SMB_COM_WRITE_RAW].kr_nreq,
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross prev->ss_data.ks_reqs1[SMB_COM_WRITE_RAW].kr_nreq);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_wrs += smbstat_sub_64(
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross curr->ss_data.ks_reqs1[SMB_COM_WRITE_AND_CLOSE].kr_nreq,
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross prev->ss_data.ks_reqs1[SMB_COM_WRITE_AND_CLOSE].kr_nreq);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_wrs += smbstat_sub_64(
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross curr->ss_data.ks_reqs1[SMB_COM_WRITE_ANDX].kr_nreq,
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross prev->ss_data.ks_reqs1[SMB_COM_WRITE_ANDX].kr_nreq);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smbstat_srv_info.si_wrs += smbstat_sub_64(
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross curr->ss_data.ks_reqs2[SMB2_WRITE].kr_nreq,
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross prev->ss_data.ks_reqs2[SMB2_WRITE].kr_nreq);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_wrs /= smbstat_srv_info.si_etime;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * smbstat_srv_process_utilization
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Processes the data relative to the utilization of the smbsrv module and
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * stores the results in the structure smbstat_srv_info.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmbstat_srv_process_utilization(
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_snapshot_t *curr,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_snapshot_t *prev)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright double tw_delta, tr_delta;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright double w_delta, r_delta;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright double tps, rqs;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright w_delta = smbstat_hrtime_delta(prev->ss_data.ks_utilization.ku_wlentime,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright curr->ss_data.ks_utilization.ku_wlentime);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright r_delta = smbstat_hrtime_delta(prev->ss_data.ks_utilization.ku_rlentime,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright curr->ss_data.ks_utilization.ku_rlentime);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright tw_delta = smbstat_hrtime_delta(prev->ss_data.ks_utilization.ku_wtime,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright curr->ss_data.ks_utilization.ku_wtime);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright tr_delta = smbstat_hrtime_delta(prev->ss_data.ks_utilization.ku_rtime,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright curr->ss_data.ks_utilization.ku_rtime);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright rqs = smbstat_srv_info.si_total_nreqs / smbstat_srv_info.si_etime;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright /* Average number of requests waiting */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (w_delta != 0)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_avw = w_delta / smbstat_srv_info.si_hretime;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright else
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_avw = 0.0;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright /* Average number of request running */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (r_delta != 0)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_avr = r_delta / smbstat_srv_info.si_hretime;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright else
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_avr = 0.0;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright /* Utilization */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_upct =
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (smbstat_srv_info.si_avr / curr->ss_data.ks_maxreqs) * 100;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright /* Average wait service time in milliseconds */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_rserv = 0.0;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_wserv = 0.0;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (rqs > 0.0 &&
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (smbstat_srv_info.si_avw != 0.0 ||
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_avr != 0.0)) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright tps = 1 / rqs;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (smbstat_srv_info.si_avw != 0.0)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_wserv =
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_avw * tps;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (smbstat_srv_info.si_avr != 0.0)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_rserv =
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_avr * tps;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright /* % of time there is a transaction waiting for service */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (tw_delta != 0) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_wpct = tw_delta;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_wpct /= smbstat_srv_info.si_hretime;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_wpct *= 100.0;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright } else {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_wpct = 0.0;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright /* % of time there is a transaction running */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (tr_delta != 0) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_rpct = tr_delta;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_rpct /= smbstat_srv_info.si_hretime;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_rpct *= 100.0;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright } else {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_info.si_rpct = 0.0;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * smbstat_srv_process_requests
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Processes the data relative to the SMB requests and stores the results in
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * the structure smbstat_srv_info.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic void
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmbstat_srv_process_requests(
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_snapshot_t *curr,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_snapshot_t *prev)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_req_info_t *info;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_kstat_req_t *curr_req;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_kstat_req_t *prev_req;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright int i, idx;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross boolean_t firstcall = (prev->ss_snaptime == 0);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright for (i = 0; i < SMB_COM_NUM; i++) {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross info = &smbstat_srv_info.si_reqs1[i];
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross idx = info[i].ri_opcode & 0xFF;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross curr_req = &curr->ss_data.ks_reqs1[idx];
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross prev_req = &prev->ss_data.ks_reqs1[idx];
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smbstat_srv_process_one_req(
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross info, curr_req, prev_req, firstcall);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross }
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross for (i = 0; i < SMB2__NCMDS; i++) {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross info = &smbstat_srv_info.si_reqs2[i];
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross curr_req = &curr->ss_data.ks_reqs2[i];
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross prev_req = &prev->ss_data.ks_reqs2[i];
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smbstat_srv_process_one_req(
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross info, curr_req, prev_req, firstcall);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross }
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross}
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic void
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rosssmbstat_srv_process_one_req(
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smbstat_req_info_t *info,
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_kstat_req_t *curr_req,
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_kstat_req_t *prev_req,
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross boolean_t firstcall)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross double nrqs;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross nrqs = smbstat_sub_64(curr_req->kr_nreq,
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross prev_req->kr_nreq);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross info->ri_rqs = nrqs / smbstat_srv_info.si_etime;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross info->ri_rbs = smbstat_sub_64(
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross curr_req->kr_rxb,
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross prev_req->kr_rxb) /
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smbstat_srv_info.si_etime;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross info->ri_tbs = smbstat_sub_64(
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross curr_req->kr_txb,
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross prev_req->kr_txb) /
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smbstat_srv_info.si_etime;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross info->ri_pct = nrqs * 100;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (smbstat_srv_info.si_total_nreqs > 0)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross info->ri_pct /= smbstat_srv_info.si_total_nreqs;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (firstcall) {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross /* First time. Take the aggregate */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross info->ri_stddev =
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross curr_req->kr_a_stddev;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross info->ri_mean = curr_req->kr_a_mean;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross } else {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross /* Take the differential */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross info->ri_stddev =
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross curr_req->kr_d_stddev;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross info->ri_mean = curr_req->kr_d_mean;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross }
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (nrqs > 0) {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross info->ri_stddev /= nrqs;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross info->ri_stddev = sqrt(info->ri_stddev);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross } else {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross info->ri_stddev = 0;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross info->ri_stddev /= NANOSEC;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross info->ri_mean /= NANOSEC;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * smbstat_srv_current_snapshot
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Returns the current snapshot.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic smbstat_srv_snapshot_t *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmbstat_srv_current_snapshot(void)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return (&smbstat_srv_snapshots[smbstat_snapshot_idx]);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * smbstat_srv_previous_snapshot
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Returns the previous snapshot.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic smbstat_srv_snapshot_t *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmbstat_srv_previous_snapshot(void)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright int idx;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idx = (smbstat_snapshot_idx - 1) & SMBSTAT_SNAPSHOT_MASK;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return (&smbstat_srv_snapshots[idx]);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * smbstat_usage
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Prints out a help message.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic void
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmbstat_usage(FILE *fd, int exit_code)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) fprintf(fd, gettext(SMBSTAT_HELP));
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright exit(exit_code);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * smbstat_fail
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Prints out to stderr an error message and exits the process.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic void
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsmbstat_fail(int do_perror, char *message, ...)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw va_list args;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw va_start(args, message);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) fprintf(stderr, gettext("smbstat: "));
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* LINTED E_SEC_PRINTF_VAR_FMT */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) vfprintf(stderr, message, args);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw va_end(args);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (do_perror)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) fprintf(stderr, ": %s", strerror(errno));
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) fprintf(stderr, "\n");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw exit(1);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * smbstat_sub_64
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Substract 2 uint64_t and returns a double.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic double
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmbstat_sub_64(uint64_t a, uint64_t b)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return ((double)(a - b));
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * smbstat_zero
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Returns zero if the value passed in is less than 1.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic double
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmbstat_zero(double value)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (value < 1)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright value = 0;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return (value);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * smbstat_strtoi
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Converts a string representing an integer value into its binary value.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * If the conversion fails this routine exits the process.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic uint_t
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmbstat_strtoi(char const *val, char *errmsg)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright char *end;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright long tmp;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright errno = 0;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright tmp = strtol(val, &end, 10);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (*end != '\0' || errno)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_fail(1, "%s %s", errmsg, val);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return ((uint_t)tmp);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * smbstat_termio_init
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Determines the size of the terminal associated with the process.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmbstat_termio_init(void)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright char *envp;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &smbstat_ws) != -1) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (smbstat_ws.ws_row == 0) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright envp = getenv("LINES");
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (envp != NULL)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_ws.ws_row = atoi(envp);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (smbstat_ws.ws_col == 0) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright envp = getenv("COLUMNS");
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (envp != NULL)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_ws.ws_row = atoi(envp);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (smbstat_ws.ws_col == 0)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_ws.ws_col = 80;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (smbstat_ws.ws_row == 0)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_ws.ws_row = 25;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * smbstat_snapshot_idx_inc
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Increments the snapshot index.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmbstat_snapshot_inc_idx(void)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_snapshot_idx++;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_snapshot_idx &= SMBSTAT_SNAPSHOT_MASK;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * smbstat_req_cmp_name
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Call back function passed to qsort() when the list of requests must be sorted
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * by name.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic int
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmbstat_req_cmp_name(const void *obj1, const void *obj2)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return (strncasecmp(
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright ((smbstat_req_info_t *)obj1)->ri_name,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright ((smbstat_req_info_t *)obj2)->ri_name,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright sizeof (((smbstat_req_info_t *)obj2)->ri_name)));
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * smbstat_req_order
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Snapshots the smbsrv module statistics once to get the name of the requests.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * The request list is smbstat_srv_info is then sorted by name or by code
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * depending on the boolean smbstat_opt_a.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * The function should be called once during initialization.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmbstat_req_order(void)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smbstat_srv_snapshot_t *ss;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_req_info_t *info;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smb_kstat_req_t *reqs;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright int i;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_srv_snapshot();
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross ss = smbstat_srv_current_snapshot();
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross reqs = ss->ss_data.ks_reqs1;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross info = smbstat_srv_info.si_reqs1;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright for (i = 0; i < SMB_COM_NUM; i++) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) strlcpy(info[i].ri_name, reqs[i].kr_name,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright sizeof (reqs[i].kr_name));
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright info[i].ri_opcode = i;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (smbstat_opt_n)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright qsort(info, SMB_COM_NUM, sizeof (smbstat_req_info_t),
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_req_cmp_name);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross reqs = ss->ss_data.ks_reqs2;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross info = smbstat_srv_info.si_reqs2;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross for (i = 0; i < SMB2__NCMDS; i++) {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross (void) strlcpy(info[i].ri_name, reqs[i].kr_name,
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross sizeof (reqs[i].kr_name));
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross info[i].ri_opcode = i;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross }
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (smbstat_opt_n)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross qsort(info, SMB2__NCMDS, sizeof (smbstat_req_info_t),
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smbstat_req_cmp_name);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Return the number of ticks delta between two hrtime_t
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * values. Attempt to cater for various kinds of overflow
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * in hrtime_t - no matter how improbable.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic double
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmbstat_hrtime_delta(hrtime_t old, hrtime_t new)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright uint64_t del;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if ((new >= old) && (old >= 0L))
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return ((double)(new - old));
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright /*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * We've overflowed the positive portion of an hrtime_t.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (new < 0L) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright /*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * The new value is negative. Handle the case where the old
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * value is positive or negative.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright uint64_t n1;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright uint64_t o1;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright n1 = -new;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (old > 0L)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return ((double)(n1 - old));
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright o1 = -old;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright del = n1 - o1;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return ((double)del);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright /*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Either we've just gone from being negative to positive *or* the last
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * entry was positive and the new entry is also positive but *less* than
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * the old entry. This implies we waited quite a few days on a very fast
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * system between displays.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (old < 0L) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright uint64_t o2;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright o2 = -old;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright del = UINT64_MAX - o2;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright } else {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright del = UINT64_MAX - old;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright del += new;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return ((double)del);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmbstat_zalloc(size_t size)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright void *ptr;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright ptr = umem_zalloc(size, UMEM_DEFAULT);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (ptr == NULL)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smbstat_fail(1, gettext("out of memory"));
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return (ptr);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmbstat_free(void *ptr, size_t size)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright umem_free(ptr, size);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}