115db2897SKrishnendu Sadhukhan - Sun Microsystems /* 215db2897SKrishnendu Sadhukhan - Sun Microsystems * CDDL HEADER START 315db2897SKrishnendu Sadhukhan - Sun Microsystems * 415db2897SKrishnendu Sadhukhan - Sun Microsystems * The contents of this file are subject to the terms of the 515db2897SKrishnendu Sadhukhan - Sun Microsystems * Common Development and Distribution License (the "License"). 615db2897SKrishnendu Sadhukhan - Sun Microsystems * You may not use this file except in compliance with the License. 715db2897SKrishnendu Sadhukhan - Sun Microsystems * 815db2897SKrishnendu Sadhukhan - Sun Microsystems * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 915db2897SKrishnendu Sadhukhan - Sun Microsystems * or http://www.opensolaris.org/os/licensing. 1015db2897SKrishnendu Sadhukhan - Sun Microsystems * See the License for the specific language governing permissions 1115db2897SKrishnendu Sadhukhan - Sun Microsystems * and limitations under the License. 1215db2897SKrishnendu Sadhukhan - Sun Microsystems * 1315db2897SKrishnendu Sadhukhan - Sun Microsystems * When distributing Covered Code, include this CDDL HEADER in each 1415db2897SKrishnendu Sadhukhan - Sun Microsystems * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 1515db2897SKrishnendu Sadhukhan - Sun Microsystems * If applicable, add the following below this CDDL HEADER, with the 1615db2897SKrishnendu Sadhukhan - Sun Microsystems * fields enclosed by brackets "[]" replaced with your own identifying 1715db2897SKrishnendu Sadhukhan - Sun Microsystems * information: Portions Copyright [yyyy] [name of copyright owner] 1815db2897SKrishnendu Sadhukhan - Sun Microsystems * 1915db2897SKrishnendu Sadhukhan - Sun Microsystems * CDDL HEADER END 2015db2897SKrishnendu Sadhukhan - Sun Microsystems */ 2115db2897SKrishnendu Sadhukhan - Sun Microsystems /* 2215db2897SKrishnendu Sadhukhan - Sun Microsystems * Copyright (c) 2008-2009, Intel Corporation. 2315db2897SKrishnendu Sadhukhan - Sun Microsystems * All Rights Reserved. 2415db2897SKrishnendu Sadhukhan - Sun Microsystems */ 2515db2897SKrishnendu Sadhukhan - Sun Microsystems 2615db2897SKrishnendu Sadhukhan - Sun Microsystems #include <unistd.h> 2715db2897SKrishnendu Sadhukhan - Sun Microsystems #include <getopt.h> 2815db2897SKrishnendu Sadhukhan - Sun Microsystems #include <stdio.h> 2915db2897SKrishnendu Sadhukhan - Sun Microsystems #include <string.h> 3015db2897SKrishnendu Sadhukhan - Sun Microsystems #include <stdlib.h> 3115db2897SKrishnendu Sadhukhan - Sun Microsystems #include <limits.h> 3215db2897SKrishnendu Sadhukhan - Sun Microsystems #include <libgen.h> 3315db2897SKrishnendu Sadhukhan - Sun Microsystems #include <signal.h> 3415db2897SKrishnendu Sadhukhan - Sun Microsystems #include "latencytop.h" 3515db2897SKrishnendu Sadhukhan - Sun Microsystems 3615db2897SKrishnendu Sadhukhan - Sun Microsystems #define CMPOPT(a, b) strncmp((a), (b), sizeof (b)) 3715db2897SKrishnendu Sadhukhan - Sun Microsystems 38*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems /* 39*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems * This variable is used to check if "dynamic variable drop" in dtrace 40*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems * has happened. 41*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems */ 42*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems boolean_t lt_drop_detected = 0; 43*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 4415db2897SKrishnendu Sadhukhan - Sun Microsystems lt_config_t g_config; 4515db2897SKrishnendu Sadhukhan - Sun Microsystems 4615db2897SKrishnendu Sadhukhan - Sun Microsystems typedef enum { 4715db2897SKrishnendu Sadhukhan - Sun Microsystems LT_CMDOPT_INTERVAL, 4815db2897SKrishnendu Sadhukhan - Sun Microsystems LT_CMDOPT_LOG_FILE, 4915db2897SKrishnendu Sadhukhan - Sun Microsystems LT_CMDOPT_LOG_LEVEL, 5015db2897SKrishnendu Sadhukhan - Sun Microsystems LT_CMDOPT_LOG_INTERVAL, 5115db2897SKrishnendu Sadhukhan - Sun Microsystems LT_CMDOPT_CONFIG_FILE, 5215db2897SKrishnendu Sadhukhan - Sun Microsystems LT_CMDOPT_F_FILTER, 5315db2897SKrishnendu Sadhukhan - Sun Microsystems LT_CMDOPT_F_SCHED, 5415db2897SKrishnendu Sadhukhan - Sun Microsystems LT_CMDOPT_F_SOBJ, 5515db2897SKrishnendu Sadhukhan - Sun Microsystems LT_CMDOPT_F_LOW, 5615db2897SKrishnendu Sadhukhan - Sun Microsystems LT_CMDOPT__LAST /* Must be last one */ 5715db2897SKrishnendu Sadhukhan - Sun Microsystems } lt_cmd_option_id_t; 5815db2897SKrishnendu Sadhukhan - Sun Microsystems 5915db2897SKrishnendu Sadhukhan - Sun Microsystems /* 6015db2897SKrishnendu Sadhukhan - Sun Microsystems * Check for duplicate command line options. 6115db2897SKrishnendu Sadhukhan - Sun Microsystems * Returns TRUE if duplicate options with different values are found, 6215db2897SKrishnendu Sadhukhan - Sun Microsystems * returns FALSE otherwise. 6315db2897SKrishnendu Sadhukhan - Sun Microsystems */ 6415db2897SKrishnendu Sadhukhan - Sun Microsystems static int 6515db2897SKrishnendu Sadhukhan - Sun Microsystems check_opt_dup(lt_cmd_option_id_t id, uint64_t value) { 6615db2897SKrishnendu Sadhukhan - Sun Microsystems 6715db2897SKrishnendu Sadhukhan - Sun Microsystems static int opt_set[(int)LT_CMDOPT__LAST]; 6815db2897SKrishnendu Sadhukhan - Sun Microsystems static uint64_t opt_val[(int)LT_CMDOPT__LAST]; 6915db2897SKrishnendu Sadhukhan - Sun Microsystems 7015db2897SKrishnendu Sadhukhan - Sun Microsystems const char *errmsg[] = { 7115db2897SKrishnendu Sadhukhan - Sun Microsystems "-t is set more than once with different values.", 7215db2897SKrishnendu Sadhukhan - Sun Microsystems "-o is set more than once.", 7315db2897SKrishnendu Sadhukhan - Sun Microsystems "-k is set more than once with different values.", 7415db2897SKrishnendu Sadhukhan - Sun Microsystems "-l is set more than once with different values.", 7515db2897SKrishnendu Sadhukhan - Sun Microsystems "-c is set more than once.", 7615db2897SKrishnendu Sadhukhan - Sun Microsystems "-f [no]filter is set more than once with different values.", 7715db2897SKrishnendu Sadhukhan - Sun Microsystems "-f [no]sched is set more than once with different values.", 7815db2897SKrishnendu Sadhukhan - Sun Microsystems "-f [no]sobj is set more than once with different values.", 7915db2897SKrishnendu Sadhukhan - Sun Microsystems "-f [no]low is set more than once with different values.", 8015db2897SKrishnendu Sadhukhan - Sun Microsystems }; 8115db2897SKrishnendu Sadhukhan - Sun Microsystems 8215db2897SKrishnendu Sadhukhan - Sun Microsystems g_assert(sizeof (errmsg)/sizeof (errmsg[0]) == (int)LT_CMDOPT__LAST); 8315db2897SKrishnendu Sadhukhan - Sun Microsystems 8415db2897SKrishnendu Sadhukhan - Sun Microsystems if (!opt_set[(int)id]) { 8515db2897SKrishnendu Sadhukhan - Sun Microsystems opt_set[(int)id] = TRUE; 8615db2897SKrishnendu Sadhukhan - Sun Microsystems opt_val[(int)id] = value; 8715db2897SKrishnendu Sadhukhan - Sun Microsystems return (FALSE); 8815db2897SKrishnendu Sadhukhan - Sun Microsystems } 8915db2897SKrishnendu Sadhukhan - Sun Microsystems 9015db2897SKrishnendu Sadhukhan - Sun Microsystems if (opt_val[(int)id] != value) { 9115db2897SKrishnendu Sadhukhan - Sun Microsystems (void) fprintf(stderr, "%s\n", errmsg[(int)id]); 9215db2897SKrishnendu Sadhukhan - Sun Microsystems return (TRUE); 9315db2897SKrishnendu Sadhukhan - Sun Microsystems } 9415db2897SKrishnendu Sadhukhan - Sun Microsystems 9515db2897SKrishnendu Sadhukhan - Sun Microsystems return (FALSE); 9615db2897SKrishnendu Sadhukhan - Sun Microsystems } 9715db2897SKrishnendu Sadhukhan - Sun Microsystems 9815db2897SKrishnendu Sadhukhan - Sun Microsystems /* 9915db2897SKrishnendu Sadhukhan - Sun Microsystems * Print command-line help message. 10015db2897SKrishnendu Sadhukhan - Sun Microsystems */ 10115db2897SKrishnendu Sadhukhan - Sun Microsystems static void 10215db2897SKrishnendu Sadhukhan - Sun Microsystems print_usage(const char *execname, int long_help) 10315db2897SKrishnendu Sadhukhan - Sun Microsystems { 10415db2897SKrishnendu Sadhukhan - Sun Microsystems char buffer[PATH_MAX]; 10515db2897SKrishnendu Sadhukhan - Sun Microsystems (void) snprintf(buffer, sizeof (buffer), "%s", execname); 10615db2897SKrishnendu Sadhukhan - Sun Microsystems 10715db2897SKrishnendu Sadhukhan - Sun Microsystems if (!long_help) { 10815db2897SKrishnendu Sadhukhan - Sun Microsystems /* Print short help to stderr. */ 10915db2897SKrishnendu Sadhukhan - Sun Microsystems (void) fprintf(stderr, "Usage: %s [option(s)], ", 11015db2897SKrishnendu Sadhukhan - Sun Microsystems basename(buffer)); 11115db2897SKrishnendu Sadhukhan - Sun Microsystems (void) fprintf(stderr, "use '%s -h' for details.\n", 11215db2897SKrishnendu Sadhukhan - Sun Microsystems basename(buffer)); 11315db2897SKrishnendu Sadhukhan - Sun Microsystems return; 11415db2897SKrishnendu Sadhukhan - Sun Microsystems } 11515db2897SKrishnendu Sadhukhan - Sun Microsystems 11615db2897SKrishnendu Sadhukhan - Sun Microsystems (void) printf("Usage: %s [option(s)]\n", basename(buffer)); 11715db2897SKrishnendu Sadhukhan - Sun Microsystems (void) printf("Options:\n" 11815db2897SKrishnendu Sadhukhan - Sun Microsystems " -h, --help\n" 11915db2897SKrishnendu Sadhukhan - Sun Microsystems " Print this help.\n" 12015db2897SKrishnendu Sadhukhan - Sun Microsystems " -t, --interval TIME\n" 12115db2897SKrishnendu Sadhukhan - Sun Microsystems " Set refresh interval to TIME. " 12215db2897SKrishnendu Sadhukhan - Sun Microsystems "Valid range [1...60] seconds, default = 5\n" 12315db2897SKrishnendu Sadhukhan - Sun Microsystems /* 12415db2897SKrishnendu Sadhukhan - Sun Microsystems * Option "-c, --config FILE" is not user-visible for now. 12515db2897SKrishnendu Sadhukhan - Sun Microsystems * When we have chance to properly document the format of translation 12615db2897SKrishnendu Sadhukhan - Sun Microsystems * rules, we'll make it user-visible. 12715db2897SKrishnendu Sadhukhan - Sun Microsystems */ 12815db2897SKrishnendu Sadhukhan - Sun Microsystems " -o, --output-log-file FILE\n" 12915db2897SKrishnendu Sadhukhan - Sun Microsystems " Output kernel log to FILE. Default = " 13015db2897SKrishnendu Sadhukhan - Sun Microsystems DEFAULT_KLOG_FILE "\n" 13115db2897SKrishnendu Sadhukhan - Sun Microsystems " -k, --kernel-log-level LEVEL\n" 13215db2897SKrishnendu Sadhukhan - Sun Microsystems " Set kernel log level to LEVEL.\n" 13315db2897SKrishnendu Sadhukhan - Sun Microsystems " 0(default) = None, 1 = Unmapped, 2 = Mapped, 3 = All.\n" 13415db2897SKrishnendu Sadhukhan - Sun Microsystems " -f, --feature [no]feature1,[no]feature2,...\n" 13515db2897SKrishnendu Sadhukhan - Sun Microsystems " Enable/disable features in LatencyTOP.\n" 13615db2897SKrishnendu Sadhukhan - Sun Microsystems " [no]filter:\n" 13715db2897SKrishnendu Sadhukhan - Sun Microsystems " Filter large interruptible latencies, e.g. sleep.\n" 13815db2897SKrishnendu Sadhukhan - Sun Microsystems " [no]sched:\n" 13915db2897SKrishnendu Sadhukhan - Sun Microsystems " Monitors sched (PID=0).\n" 14015db2897SKrishnendu Sadhukhan - Sun Microsystems " [no]sobj:\n" 14115db2897SKrishnendu Sadhukhan - Sun Microsystems " Monitors synchronization objects.\n" 14215db2897SKrishnendu Sadhukhan - Sun Microsystems " [no]low:\n" 14315db2897SKrishnendu Sadhukhan - Sun Microsystems " Lower overhead by sampling small latencies.\n" 14415db2897SKrishnendu Sadhukhan - Sun Microsystems " -l, --log-period TIME\n" 14515db2897SKrishnendu Sadhukhan - Sun Microsystems " Write and restart log every TIME seconds, TIME >= 60\n"); 14615db2897SKrishnendu Sadhukhan - Sun Microsystems } 14715db2897SKrishnendu Sadhukhan - Sun Microsystems 14815db2897SKrishnendu Sadhukhan - Sun Microsystems /* 14915db2897SKrishnendu Sadhukhan - Sun Microsystems * Properly exit latencytop when it receives SIGINT or SIGTERM. 15015db2897SKrishnendu Sadhukhan - Sun Microsystems */ 15115db2897SKrishnendu Sadhukhan - Sun Microsystems /* ARGSUSED */ 15215db2897SKrishnendu Sadhukhan - Sun Microsystems static void 15315db2897SKrishnendu Sadhukhan - Sun Microsystems signal_handler(int sig) 15415db2897SKrishnendu Sadhukhan - Sun Microsystems { 15515db2897SKrishnendu Sadhukhan - Sun Microsystems lt_gpipe_break("q"); 15615db2897SKrishnendu Sadhukhan - Sun Microsystems } 15715db2897SKrishnendu Sadhukhan - Sun Microsystems 15815db2897SKrishnendu Sadhukhan - Sun Microsystems /* 15915db2897SKrishnendu Sadhukhan - Sun Microsystems * Convert string to integer. It returns error if extra characters are found. 16015db2897SKrishnendu Sadhukhan - Sun Microsystems */ 16115db2897SKrishnendu Sadhukhan - Sun Microsystems static int 16215db2897SKrishnendu Sadhukhan - Sun Microsystems to_int(const char *str, int *result) 16315db2897SKrishnendu Sadhukhan - Sun Microsystems { 16415db2897SKrishnendu Sadhukhan - Sun Microsystems char *tail = NULL; 16515db2897SKrishnendu Sadhukhan - Sun Microsystems long ret; 16615db2897SKrishnendu Sadhukhan - Sun Microsystems 16715db2897SKrishnendu Sadhukhan - Sun Microsystems if (str == NULL || result == NULL) { 16815db2897SKrishnendu Sadhukhan - Sun Microsystems return (-1); 16915db2897SKrishnendu Sadhukhan - Sun Microsystems } 17015db2897SKrishnendu Sadhukhan - Sun Microsystems 17115db2897SKrishnendu Sadhukhan - Sun Microsystems ret = strtol(str, &tail, 10); 17215db2897SKrishnendu Sadhukhan - Sun Microsystems 17315db2897SKrishnendu Sadhukhan - Sun Microsystems if (tail != NULL && *tail != '\0') { 17415db2897SKrishnendu Sadhukhan - Sun Microsystems return (-1); 17515db2897SKrishnendu Sadhukhan - Sun Microsystems } 17615db2897SKrishnendu Sadhukhan - Sun Microsystems 17715db2897SKrishnendu Sadhukhan - Sun Microsystems *result = (int)ret; 17815db2897SKrishnendu Sadhukhan - Sun Microsystems 17915db2897SKrishnendu Sadhukhan - Sun Microsystems return (0); 18015db2897SKrishnendu Sadhukhan - Sun Microsystems } 18115db2897SKrishnendu Sadhukhan - Sun Microsystems 18215db2897SKrishnendu Sadhukhan - Sun Microsystems /* 18315db2897SKrishnendu Sadhukhan - Sun Microsystems * The main function. 18415db2897SKrishnendu Sadhukhan - Sun Microsystems */ 18515db2897SKrishnendu Sadhukhan - Sun Microsystems int 18615db2897SKrishnendu Sadhukhan - Sun Microsystems main(int argc, char *argv[]) 18715db2897SKrishnendu Sadhukhan - Sun Microsystems { 18815db2897SKrishnendu Sadhukhan - Sun Microsystems const char *opt_string = "t:o:k:hf:l:c:"; 18915db2897SKrishnendu Sadhukhan - Sun Microsystems struct option const longopts[] = { 19015db2897SKrishnendu Sadhukhan - Sun Microsystems {"interval", required_argument, NULL, 't'}, 19115db2897SKrishnendu Sadhukhan - Sun Microsystems {"output-log-file", required_argument, NULL, 'o'}, 19215db2897SKrishnendu Sadhukhan - Sun Microsystems {"kernel-log-level", required_argument, NULL, 'k'}, 19315db2897SKrishnendu Sadhukhan - Sun Microsystems {"help", no_argument, NULL, 'h'}, 19415db2897SKrishnendu Sadhukhan - Sun Microsystems {"feature", required_argument, NULL, 'f'}, 19515db2897SKrishnendu Sadhukhan - Sun Microsystems {"log-period", required_argument, NULL, 'l'}, 19615db2897SKrishnendu Sadhukhan - Sun Microsystems {"config", required_argument, NULL, 'c'}, 19715db2897SKrishnendu Sadhukhan - Sun Microsystems {NULL, 0, NULL, 0} 19815db2897SKrishnendu Sadhukhan - Sun Microsystems }; 19915db2897SKrishnendu Sadhukhan - Sun Microsystems 20015db2897SKrishnendu Sadhukhan - Sun Microsystems int optc; 20115db2897SKrishnendu Sadhukhan - Sun Microsystems int longind = 0; 20215db2897SKrishnendu Sadhukhan - Sun Microsystems int running = 1; 20315db2897SKrishnendu Sadhukhan - Sun Microsystems int unknown_option = FALSE; 20415db2897SKrishnendu Sadhukhan - Sun Microsystems int refresh_interval = 5; 20515db2897SKrishnendu Sadhukhan - Sun Microsystems int klog_level = 0; 20615db2897SKrishnendu Sadhukhan - Sun Microsystems int log_interval = 0; 20715db2897SKrishnendu Sadhukhan - Sun Microsystems long long last_logged = 0; 20815db2897SKrishnendu Sadhukhan - Sun Microsystems char *token = NULL; 20915db2897SKrishnendu Sadhukhan - Sun Microsystems int retval = 0; 21015db2897SKrishnendu Sadhukhan - Sun Microsystems int gpipe; 21115db2897SKrishnendu Sadhukhan - Sun Microsystems int err; 21215db2897SKrishnendu Sadhukhan - Sun Microsystems uint64_t collect_end; 21315db2897SKrishnendu Sadhukhan - Sun Microsystems uint64_t current_time; 21415db2897SKrishnendu Sadhukhan - Sun Microsystems uint64_t delta_time; 21515db2897SKrishnendu Sadhukhan - Sun Microsystems char logfile[PATH_MAX] = ""; 216*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems boolean_t no_dtrace_cleanup = B_TRUE; 21715db2897SKrishnendu Sadhukhan - Sun Microsystems 21815db2897SKrishnendu Sadhukhan - Sun Microsystems lt_gpipe_init(); 21915db2897SKrishnendu Sadhukhan - Sun Microsystems (void) signal(SIGINT, signal_handler); 22015db2897SKrishnendu Sadhukhan - Sun Microsystems (void) signal(SIGTERM, signal_handler); 22115db2897SKrishnendu Sadhukhan - Sun Microsystems 22215db2897SKrishnendu Sadhukhan - Sun Microsystems /* Default global settings */ 22315db2897SKrishnendu Sadhukhan - Sun Microsystems g_config.lt_cfg_enable_filter = 0; 22415db2897SKrishnendu Sadhukhan - Sun Microsystems g_config.lt_cfg_trace_sched = 0; 22515db2897SKrishnendu Sadhukhan - Sun Microsystems g_config.lt_cfg_trace_syncobj = 1; 22615db2897SKrishnendu Sadhukhan - Sun Microsystems g_config.lt_cfg_low_overhead_mode = 0; 22715db2897SKrishnendu Sadhukhan - Sun Microsystems /* dtrace snapshot every 1 second */ 22815db2897SKrishnendu Sadhukhan - Sun Microsystems g_config.lt_cfg_snap_interval = 1000; 22915db2897SKrishnendu Sadhukhan - Sun Microsystems #ifdef EMBED_CONFIGS 23015db2897SKrishnendu Sadhukhan - Sun Microsystems g_config.lt_cfg_config_name = NULL; 23115db2897SKrishnendu Sadhukhan - Sun Microsystems #else 23215db2897SKrishnendu Sadhukhan - Sun Microsystems g_config.lt_cfg_config_name = lt_strdup(DEFAULT_CONFIG_NAME); 23315db2897SKrishnendu Sadhukhan - Sun Microsystems #endif 23415db2897SKrishnendu Sadhukhan - Sun Microsystems 23515db2897SKrishnendu Sadhukhan - Sun Microsystems /* Parse command line arguments. */ 23615db2897SKrishnendu Sadhukhan - Sun Microsystems while ((optc = getopt_long(argc, argv, opt_string, 23715db2897SKrishnendu Sadhukhan - Sun Microsystems longopts, &longind)) != -1) { 23815db2897SKrishnendu Sadhukhan - Sun Microsystems switch (optc) { 23915db2897SKrishnendu Sadhukhan - Sun Microsystems case 'h': 24015db2897SKrishnendu Sadhukhan - Sun Microsystems print_usage(argv[0], TRUE); 24115db2897SKrishnendu Sadhukhan - Sun Microsystems goto end_none; 24215db2897SKrishnendu Sadhukhan - Sun Microsystems case 't': 24315db2897SKrishnendu Sadhukhan - Sun Microsystems if (to_int(optarg, &refresh_interval) != 0 || 24415db2897SKrishnendu Sadhukhan - Sun Microsystems refresh_interval < 1 || refresh_interval > 60) { 24515db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error( 24615db2897SKrishnendu Sadhukhan - Sun Microsystems "Invalid refresh interval: %s\n", optarg); 24715db2897SKrishnendu Sadhukhan - Sun Microsystems unknown_option = TRUE; 24815db2897SKrishnendu Sadhukhan - Sun Microsystems } else if (check_opt_dup(LT_CMDOPT_INTERVAL, 24915db2897SKrishnendu Sadhukhan - Sun Microsystems refresh_interval)) { 25015db2897SKrishnendu Sadhukhan - Sun Microsystems unknown_option = TRUE; 25115db2897SKrishnendu Sadhukhan - Sun Microsystems } 25215db2897SKrishnendu Sadhukhan - Sun Microsystems 25315db2897SKrishnendu Sadhukhan - Sun Microsystems break; 25415db2897SKrishnendu Sadhukhan - Sun Microsystems case 'k': 25515db2897SKrishnendu Sadhukhan - Sun Microsystems if (to_int(optarg, &klog_level) != 0 || 25615db2897SKrishnendu Sadhukhan - Sun Microsystems lt_klog_set_log_level(klog_level) != 0) { 25715db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error( 25815db2897SKrishnendu Sadhukhan - Sun Microsystems "Invalid log level: %s\n", optarg); 25915db2897SKrishnendu Sadhukhan - Sun Microsystems unknown_option = TRUE; 26015db2897SKrishnendu Sadhukhan - Sun Microsystems } else if (check_opt_dup(LT_CMDOPT_LOG_LEVEL, 26115db2897SKrishnendu Sadhukhan - Sun Microsystems refresh_interval)) { 26215db2897SKrishnendu Sadhukhan - Sun Microsystems unknown_option = TRUE; 26315db2897SKrishnendu Sadhukhan - Sun Microsystems } 26415db2897SKrishnendu Sadhukhan - Sun Microsystems 26515db2897SKrishnendu Sadhukhan - Sun Microsystems break; 26615db2897SKrishnendu Sadhukhan - Sun Microsystems case 'o': 26715db2897SKrishnendu Sadhukhan - Sun Microsystems if (check_opt_dup(LT_CMDOPT_LOG_FILE, optind)) { 26815db2897SKrishnendu Sadhukhan - Sun Microsystems unknown_option = TRUE; 26915db2897SKrishnendu Sadhukhan - Sun Microsystems } else if (strlen(optarg) >= sizeof (logfile)) { 27015db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error( 27115db2897SKrishnendu Sadhukhan - Sun Microsystems "Log file name is too long: %s\n", 27215db2897SKrishnendu Sadhukhan - Sun Microsystems optarg); 27315db2897SKrishnendu Sadhukhan - Sun Microsystems unknown_option = TRUE; 27415db2897SKrishnendu Sadhukhan - Sun Microsystems } else { 27515db2897SKrishnendu Sadhukhan - Sun Microsystems (void) strncpy(logfile, optarg, 27615db2897SKrishnendu Sadhukhan - Sun Microsystems sizeof (logfile)); 27715db2897SKrishnendu Sadhukhan - Sun Microsystems } 27815db2897SKrishnendu Sadhukhan - Sun Microsystems 27915db2897SKrishnendu Sadhukhan - Sun Microsystems break; 28015db2897SKrishnendu Sadhukhan - Sun Microsystems case 'f': 28115db2897SKrishnendu Sadhukhan - Sun Microsystems for (token = strtok(optarg, ","); token != NULL; 28215db2897SKrishnendu Sadhukhan - Sun Microsystems token = strtok(NULL, ",")) { 28315db2897SKrishnendu Sadhukhan - Sun Microsystems int v = TRUE; 28415db2897SKrishnendu Sadhukhan - Sun Microsystems 28515db2897SKrishnendu Sadhukhan - Sun Microsystems if (strncmp(token, "no", 2) == 0) { 28615db2897SKrishnendu Sadhukhan - Sun Microsystems v = FALSE; 28715db2897SKrishnendu Sadhukhan - Sun Microsystems token = &token[2]; 28815db2897SKrishnendu Sadhukhan - Sun Microsystems } 28915db2897SKrishnendu Sadhukhan - Sun Microsystems 29015db2897SKrishnendu Sadhukhan - Sun Microsystems if (CMPOPT(token, "filter") == 0) { 29115db2897SKrishnendu Sadhukhan - Sun Microsystems if (check_opt_dup(LT_CMDOPT_F_FILTER, 29215db2897SKrishnendu Sadhukhan - Sun Microsystems v)) { 29315db2897SKrishnendu Sadhukhan - Sun Microsystems unknown_option = TRUE; 29415db2897SKrishnendu Sadhukhan - Sun Microsystems } else { 29515db2897SKrishnendu Sadhukhan - Sun Microsystems g_config.lt_cfg_enable_filter 29615db2897SKrishnendu Sadhukhan - Sun Microsystems = v; 29715db2897SKrishnendu Sadhukhan - Sun Microsystems } 29815db2897SKrishnendu Sadhukhan - Sun Microsystems } else if (CMPOPT(token, "sched") == 0) { 29915db2897SKrishnendu Sadhukhan - Sun Microsystems if (check_opt_dup(LT_CMDOPT_F_SCHED, 30015db2897SKrishnendu Sadhukhan - Sun Microsystems v)) { 30115db2897SKrishnendu Sadhukhan - Sun Microsystems unknown_option = TRUE; 30215db2897SKrishnendu Sadhukhan - Sun Microsystems } else { 30315db2897SKrishnendu Sadhukhan - Sun Microsystems g_config.lt_cfg_trace_sched 30415db2897SKrishnendu Sadhukhan - Sun Microsystems = v; 30515db2897SKrishnendu Sadhukhan - Sun Microsystems } 30615db2897SKrishnendu Sadhukhan - Sun Microsystems } else if (CMPOPT(token, "sobj") == 0) { 30715db2897SKrishnendu Sadhukhan - Sun Microsystems if (check_opt_dup(LT_CMDOPT_F_SOBJ, 30815db2897SKrishnendu Sadhukhan - Sun Microsystems v)) { 30915db2897SKrishnendu Sadhukhan - Sun Microsystems unknown_option = TRUE; 31015db2897SKrishnendu Sadhukhan - Sun Microsystems } else { 31115db2897SKrishnendu Sadhukhan - Sun Microsystems g_config.lt_cfg_trace_syncobj 31215db2897SKrishnendu Sadhukhan - Sun Microsystems = v; 31315db2897SKrishnendu Sadhukhan - Sun Microsystems } 31415db2897SKrishnendu Sadhukhan - Sun Microsystems } else if (CMPOPT(token, "low") == 0) { 31515db2897SKrishnendu Sadhukhan - Sun Microsystems if (check_opt_dup(LT_CMDOPT_F_LOW, 31615db2897SKrishnendu Sadhukhan - Sun Microsystems v)) { 31715db2897SKrishnendu Sadhukhan - Sun Microsystems unknown_option = TRUE; 31815db2897SKrishnendu Sadhukhan - Sun Microsystems } else { 31915db2897SKrishnendu Sadhukhan - Sun Microsystems g_config. 32015db2897SKrishnendu Sadhukhan - Sun Microsystems lt_cfg_low_overhead_mode 32115db2897SKrishnendu Sadhukhan - Sun Microsystems = v; 32215db2897SKrishnendu Sadhukhan - Sun Microsystems } 32315db2897SKrishnendu Sadhukhan - Sun Microsystems } else { 32415db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error( 32515db2897SKrishnendu Sadhukhan - Sun Microsystems "Unknown feature: %s\n", token); 32615db2897SKrishnendu Sadhukhan - Sun Microsystems unknown_option = TRUE; 32715db2897SKrishnendu Sadhukhan - Sun Microsystems } 32815db2897SKrishnendu Sadhukhan - Sun Microsystems } 32915db2897SKrishnendu Sadhukhan - Sun Microsystems 33015db2897SKrishnendu Sadhukhan - Sun Microsystems break; 33115db2897SKrishnendu Sadhukhan - Sun Microsystems case 'l': 33215db2897SKrishnendu Sadhukhan - Sun Microsystems if (to_int(optarg, &log_interval) != 0 || 33315db2897SKrishnendu Sadhukhan - Sun Microsystems log_interval < 60) { 33415db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error( 33515db2897SKrishnendu Sadhukhan - Sun Microsystems "Invalid log interval: %s\n", optarg); 33615db2897SKrishnendu Sadhukhan - Sun Microsystems unknown_option = TRUE; 33715db2897SKrishnendu Sadhukhan - Sun Microsystems } else if (check_opt_dup(LT_CMDOPT_LOG_INTERVAL, 33815db2897SKrishnendu Sadhukhan - Sun Microsystems log_interval)) { 33915db2897SKrishnendu Sadhukhan - Sun Microsystems unknown_option = TRUE; 34015db2897SKrishnendu Sadhukhan - Sun Microsystems } 34115db2897SKrishnendu Sadhukhan - Sun Microsystems 34215db2897SKrishnendu Sadhukhan - Sun Microsystems break; 34315db2897SKrishnendu Sadhukhan - Sun Microsystems case 'c': 34415db2897SKrishnendu Sadhukhan - Sun Microsystems if (strlen(optarg) >= PATH_MAX) { 34515db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error( 34615db2897SKrishnendu Sadhukhan - Sun Microsystems "Configuration name is too long.\n"); 34715db2897SKrishnendu Sadhukhan - Sun Microsystems unknown_option = TRUE; 34815db2897SKrishnendu Sadhukhan - Sun Microsystems } else if (check_opt_dup(LT_CMDOPT_CONFIG_FILE, 34915db2897SKrishnendu Sadhukhan - Sun Microsystems optind)) { 35015db2897SKrishnendu Sadhukhan - Sun Microsystems unknown_option = TRUE; 35115db2897SKrishnendu Sadhukhan - Sun Microsystems } else { 35215db2897SKrishnendu Sadhukhan - Sun Microsystems g_config.lt_cfg_config_name = 35315db2897SKrishnendu Sadhukhan - Sun Microsystems lt_strdup(optarg); 35415db2897SKrishnendu Sadhukhan - Sun Microsystems } 35515db2897SKrishnendu Sadhukhan - Sun Microsystems 35615db2897SKrishnendu Sadhukhan - Sun Microsystems break; 35715db2897SKrishnendu Sadhukhan - Sun Microsystems default: 35815db2897SKrishnendu Sadhukhan - Sun Microsystems unknown_option = TRUE; 35915db2897SKrishnendu Sadhukhan - Sun Microsystems break; 36015db2897SKrishnendu Sadhukhan - Sun Microsystems } 36115db2897SKrishnendu Sadhukhan - Sun Microsystems } 36215db2897SKrishnendu Sadhukhan - Sun Microsystems 36315db2897SKrishnendu Sadhukhan - Sun Microsystems if (!unknown_option && strlen(logfile) > 0) { 36415db2897SKrishnendu Sadhukhan - Sun Microsystems err = lt_klog_set_log_file(logfile); 36515db2897SKrishnendu Sadhukhan - Sun Microsystems 36615db2897SKrishnendu Sadhukhan - Sun Microsystems if (err == -1) { 36715db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error("Log file name is too long: %s\n", 36815db2897SKrishnendu Sadhukhan - Sun Microsystems logfile); 36915db2897SKrishnendu Sadhukhan - Sun Microsystems unknown_option = TRUE; 37015db2897SKrishnendu Sadhukhan - Sun Microsystems } else if (err == -2) { 37115db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error("Cannot write to log file: %s\n", 37215db2897SKrishnendu Sadhukhan - Sun Microsystems logfile); 37315db2897SKrishnendu Sadhukhan - Sun Microsystems unknown_option = TRUE; 37415db2897SKrishnendu Sadhukhan - Sun Microsystems } 37515db2897SKrishnendu Sadhukhan - Sun Microsystems } 37615db2897SKrishnendu Sadhukhan - Sun Microsystems 37715db2897SKrishnendu Sadhukhan - Sun Microsystems /* Throw error for invalid/junk arguments */ 37815db2897SKrishnendu Sadhukhan - Sun Microsystems if (optind < argc) { 37915db2897SKrishnendu Sadhukhan - Sun Microsystems int tmpind = optind; 38015db2897SKrishnendu Sadhukhan - Sun Microsystems (void) fprintf(stderr, "Unknown option(s): "); 38115db2897SKrishnendu Sadhukhan - Sun Microsystems 38215db2897SKrishnendu Sadhukhan - Sun Microsystems while (tmpind < argc) { 38315db2897SKrishnendu Sadhukhan - Sun Microsystems (void) fprintf(stderr, "%s ", argv[tmpind++]); 38415db2897SKrishnendu Sadhukhan - Sun Microsystems } 38515db2897SKrishnendu Sadhukhan - Sun Microsystems 38615db2897SKrishnendu Sadhukhan - Sun Microsystems (void) fprintf(stderr, "\n"); 38715db2897SKrishnendu Sadhukhan - Sun Microsystems unknown_option = TRUE; 38815db2897SKrishnendu Sadhukhan - Sun Microsystems } 38915db2897SKrishnendu Sadhukhan - Sun Microsystems 39015db2897SKrishnendu Sadhukhan - Sun Microsystems if (unknown_option) { 39115db2897SKrishnendu Sadhukhan - Sun Microsystems print_usage(argv[0], FALSE); 39215db2897SKrishnendu Sadhukhan - Sun Microsystems retval = 1; 39315db2897SKrishnendu Sadhukhan - Sun Microsystems goto end_none; 39415db2897SKrishnendu Sadhukhan - Sun Microsystems } 39515db2897SKrishnendu Sadhukhan - Sun Microsystems 39615db2897SKrishnendu Sadhukhan - Sun Microsystems (void) printf("%s\n%s\n", TITLE, COPYRIGHT); 39715db2897SKrishnendu Sadhukhan - Sun Microsystems 39815db2897SKrishnendu Sadhukhan - Sun Microsystems /* 39915db2897SKrishnendu Sadhukhan - Sun Microsystems * Initialization 40015db2897SKrishnendu Sadhukhan - Sun Microsystems */ 40115db2897SKrishnendu Sadhukhan - Sun Microsystems lt_klog_init(); 40215db2897SKrishnendu Sadhukhan - Sun Microsystems 40315db2897SKrishnendu Sadhukhan - Sun Microsystems if (lt_table_init() != 0) { 40415db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error("Unable to load configuration table.\n"); 40515db2897SKrishnendu Sadhukhan - Sun Microsystems retval = 1; 40615db2897SKrishnendu Sadhukhan - Sun Microsystems goto end_notable; 40715db2897SKrishnendu Sadhukhan - Sun Microsystems } 40815db2897SKrishnendu Sadhukhan - Sun Microsystems 40915db2897SKrishnendu Sadhukhan - Sun Microsystems if (lt_dtrace_init() != 0) { 41015db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error("Unable to initialize dtrace.\n"); 41115db2897SKrishnendu Sadhukhan - Sun Microsystems retval = 1; 41215db2897SKrishnendu Sadhukhan - Sun Microsystems goto end_nodtrace; 41315db2897SKrishnendu Sadhukhan - Sun Microsystems } 41415db2897SKrishnendu Sadhukhan - Sun Microsystems 41515db2897SKrishnendu Sadhukhan - Sun Microsystems last_logged = lt_millisecond(); 41615db2897SKrishnendu Sadhukhan - Sun Microsystems 41715db2897SKrishnendu Sadhukhan - Sun Microsystems (void) printf("Collecting data for %d seconds...\n", 41815db2897SKrishnendu Sadhukhan - Sun Microsystems refresh_interval); 41915db2897SKrishnendu Sadhukhan - Sun Microsystems 42015db2897SKrishnendu Sadhukhan - Sun Microsystems gpipe = lt_gpipe_readfd(); 42115db2897SKrishnendu Sadhukhan - Sun Microsystems collect_end = last_logged + refresh_interval * 1000; 42215db2897SKrishnendu Sadhukhan - Sun Microsystems for (;;) { 42315db2897SKrishnendu Sadhukhan - Sun Microsystems fd_set read_fd; 42415db2897SKrishnendu Sadhukhan - Sun Microsystems struct timeval timeout; 42515db2897SKrishnendu Sadhukhan - Sun Microsystems int tsleep = collect_end - lt_millisecond(); 42615db2897SKrishnendu Sadhukhan - Sun Microsystems 42715db2897SKrishnendu Sadhukhan - Sun Microsystems if (tsleep <= 0) { 42815db2897SKrishnendu Sadhukhan - Sun Microsystems break; 42915db2897SKrishnendu Sadhukhan - Sun Microsystems } 43015db2897SKrishnendu Sadhukhan - Sun Microsystems 431*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems /* 432*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems * Interval when we call dtrace_status() and collect 433*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems * aggregated data. 434*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems */ 435*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems if (tsleep > g_config.lt_cfg_snap_interval) { 436*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems tsleep = g_config.lt_cfg_snap_interval; 43715db2897SKrishnendu Sadhukhan - Sun Microsystems } 43815db2897SKrishnendu Sadhukhan - Sun Microsystems 43915db2897SKrishnendu Sadhukhan - Sun Microsystems timeout.tv_sec = tsleep / 1000; 44015db2897SKrishnendu Sadhukhan - Sun Microsystems timeout.tv_usec = (tsleep % 1000) * 1000; 44115db2897SKrishnendu Sadhukhan - Sun Microsystems 44215db2897SKrishnendu Sadhukhan - Sun Microsystems FD_ZERO(&read_fd); 44315db2897SKrishnendu Sadhukhan - Sun Microsystems FD_SET(gpipe, &read_fd); 44415db2897SKrishnendu Sadhukhan - Sun Microsystems 44515db2897SKrishnendu Sadhukhan - Sun Microsystems if (select(gpipe + 1, &read_fd, NULL, NULL, &timeout) > 0) { 44615db2897SKrishnendu Sadhukhan - Sun Microsystems goto end_ubreak; 44715db2897SKrishnendu Sadhukhan - Sun Microsystems } 44815db2897SKrishnendu Sadhukhan - Sun Microsystems 44915db2897SKrishnendu Sadhukhan - Sun Microsystems (void) lt_dtrace_work(0); 45015db2897SKrishnendu Sadhukhan - Sun Microsystems } 45115db2897SKrishnendu Sadhukhan - Sun Microsystems 45215db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_init(); 45315db2897SKrishnendu Sadhukhan - Sun Microsystems 45415db2897SKrishnendu Sadhukhan - Sun Microsystems do { 45515db2897SKrishnendu Sadhukhan - Sun Microsystems current_time = lt_millisecond(); 45615db2897SKrishnendu Sadhukhan - Sun Microsystems 45715db2897SKrishnendu Sadhukhan - Sun Microsystems lt_stat_clear_all(); 45815db2897SKrishnendu Sadhukhan - Sun Microsystems (void) lt_dtrace_collect(); 45915db2897SKrishnendu Sadhukhan - Sun Microsystems 46015db2897SKrishnendu Sadhukhan - Sun Microsystems delta_time = current_time; 46115db2897SKrishnendu Sadhukhan - Sun Microsystems current_time = lt_millisecond(); 46215db2897SKrishnendu Sadhukhan - Sun Microsystems delta_time = current_time - delta_time; 46315db2897SKrishnendu Sadhukhan - Sun Microsystems 46415db2897SKrishnendu Sadhukhan - Sun Microsystems if (log_interval > 0 && 46515db2897SKrishnendu Sadhukhan - Sun Microsystems current_time - last_logged > log_interval * 1000) { 46615db2897SKrishnendu Sadhukhan - Sun Microsystems lt_klog_write(); 46715db2897SKrishnendu Sadhukhan - Sun Microsystems last_logged = current_time; 46815db2897SKrishnendu Sadhukhan - Sun Microsystems } 46915db2897SKrishnendu Sadhukhan - Sun Microsystems 47015db2897SKrishnendu Sadhukhan - Sun Microsystems running = lt_display_loop(refresh_interval * 1000 - 47115db2897SKrishnendu Sadhukhan - Sun Microsystems delta_time); 472*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 473*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems /* 474*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems * This is to avoid dynamic variable drop 475*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems * in DTrace. 476*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems */ 477*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems if (lt_drop_detected == B_TRUE) { 478*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems if (lt_dtrace_deinit() != 0) { 479*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems no_dtrace_cleanup = B_FALSE; 480*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems retval = 1; 481*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems break; 482*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems } 483*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 484*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems lt_drop_detected = B_FALSE; 485*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems if (lt_dtrace_init() != 0) { 486*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems retval = 1; 487*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems break; 488*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems } 489*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems } 49015db2897SKrishnendu Sadhukhan - Sun Microsystems } while (running != 0); 49115db2897SKrishnendu Sadhukhan - Sun Microsystems 49215db2897SKrishnendu Sadhukhan - Sun Microsystems lt_klog_write(); 49315db2897SKrishnendu Sadhukhan - Sun Microsystems 49415db2897SKrishnendu Sadhukhan - Sun Microsystems /* Cleanup */ 49515db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_deinit(); 49615db2897SKrishnendu Sadhukhan - Sun Microsystems 49715db2897SKrishnendu Sadhukhan - Sun Microsystems end_ubreak: 498*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems if (no_dtrace_cleanup == B_FALSE || lt_dtrace_deinit() != 0) 499*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems retval = 1; 500*1a1f79f5SKrishnendu Sadhukhan - Sun Microsystems 50115db2897SKrishnendu Sadhukhan - Sun Microsystems lt_stat_free_all(); 50215db2897SKrishnendu Sadhukhan - Sun Microsystems 50315db2897SKrishnendu Sadhukhan - Sun Microsystems end_nodtrace: 50415db2897SKrishnendu Sadhukhan - Sun Microsystems lt_table_deinit(); 50515db2897SKrishnendu Sadhukhan - Sun Microsystems 50615db2897SKrishnendu Sadhukhan - Sun Microsystems end_notable: 50715db2897SKrishnendu Sadhukhan - Sun Microsystems lt_klog_deinit(); 50815db2897SKrishnendu Sadhukhan - Sun Microsystems 50915db2897SKrishnendu Sadhukhan - Sun Microsystems end_none: 51015db2897SKrishnendu Sadhukhan - Sun Microsystems lt_gpipe_deinit(); 51115db2897SKrishnendu Sadhukhan - Sun Microsystems 51215db2897SKrishnendu Sadhukhan - Sun Microsystems if (g_config.lt_cfg_config_name != NULL) { 51315db2897SKrishnendu Sadhukhan - Sun Microsystems free(g_config.lt_cfg_config_name); 51415db2897SKrishnendu Sadhukhan - Sun Microsystems } 51515db2897SKrishnendu Sadhukhan - Sun Microsystems 51615db2897SKrishnendu Sadhukhan - Sun Microsystems return (retval); 51715db2897SKrishnendu Sadhukhan - Sun Microsystems } 518