sdbc_stats.c revision 570de38f63910201fdd77246630b7aa8f9dc5661
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * CDDL HEADER START
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * The contents of this file are subject to the terms of the
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * Common Development and Distribution License (the "License").
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * You may not use this file except in compliance with the License.
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * See the License for the specific language governing permissions
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * and limitations under the License.
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * When distributing Covered Code, include this CDDL HEADER in each
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * If applicable, add the following below this CDDL HEADER, with the
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * fields enclosed by brackets "[]" replaced with your own identifying
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * information: Portions Copyright [yyyy] [name of copyright owner]
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * CDDL HEADER END
d3d50737e566cade9a08d73d2af95105ac7cd960Rafael Vanoni * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * Use is subject to license terms.
83c4dfe9546fd839e7a52bca7e9920da918f916ejgvoid center(int, char *);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * sdbc_discover() - looks for new statistics to be monitored.
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * Verifies that any statistics found are now already being
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * monitored.
83c4dfe9546fd839e7a52bca7e9920da918f916ejg static int validated = 0;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * Validate kstat structure
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * Duplicate check
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * Initialize new record
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * Set kstat
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * I/O kstat
83c4dfe9546fd839e7a52bca7e9920da918f916ejg (void) sprintf(kname, "%s%d", SDBC_IOKSTAT_CDSTATS, kinst);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg io_ksp = kstat_lookup(kc, SDBC_KSTAT_MODULE, kinst, kname);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * Check if we got a complete set of stats
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return (0);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * sdbc_update() - updates all of the statistics currently being monitored.
83c4dfe9546fd839e7a52bca7e9920da918f916ejg /* Update global kstat information */
83c4dfe9546fd839e7a52bca7e9920da918f916ejg ksp = kstat_lookup(kc, SDBC_KSTAT_MODULE, -1, SDBC_KSTAT_GSTATS);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * Age off old stats
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * Update set kstat
83c4dfe9546fd839e7a52bca7e9920da918f916ejg set_ksp = kstat_lookup(kc, SDBC_KSTAT_MODULE, kinst, kname);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if ((cur->cur_set = kstat_retrieve(kc, set_ksp)) == NULL)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * Validate set
83c4dfe9546fd839e7a52bca7e9920da918f916ejg pname = kstat_value(cur->pre_set, SDBC_CDKSTAT_VOL_NAME);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg cname = kstat_value(cur->cur_set, SDBC_CDKSTAT_VOL_NAME);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * Update I/O kstat
83c4dfe9546fd839e7a52bca7e9920da918f916ejg io_ksp = kstat_lookup(kc, SDBC_KSTAT_MODULE, kinst, kname);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return (0);
25e8c5aa2b496d9026e958ac731a610167574f59vikram * sdbc_report() - outputs statistics for the statistics currently being
25e8c5aa2b496d9026e958ac731a610167574f59vikram * monitored. Deletes statistics for volumes that have been disabled.
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return (0);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg /* Parse volume name */
83c4dfe9546fd839e7a52bca7e9920da918f916ejg /* Check to see if the user specified this volume */
83c4dfe9546fd839e7a52bca7e9920da918f916ejg for (vslist = vs_top; vslist != NULL; vslist = vslist->next)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg /* Check if volume is offline and zflag applies */
83c4dfe9546fd839e7a52bca7e9920da918f916ejg /* Output volume name */
83c4dfe9546fd839e7a52bca7e9920da918f916ejg offline = kstat_value(cur->cur_set, SDBC_CDKSTAT_FAILED);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg /* Type/status flags */
83c4dfe9546fd839e7a52bca7e9920da918f916ejg /* Output set information */
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return (0);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * sdbc_header() - outputs an appropriate header by referencing the
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * global variables dflsgs
83c4dfe9546fd839e7a52bca7e9920da918f916ejg /* first line header */
83c4dfe9546fd839e7a52bca7e9920da918f916ejg /* second line header */
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * sdbc_getstat() - find cache stat by name matching
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * paraemters
c3b4ae1846dcc50dda26b0cf1a3d787b8077a0ffJerry Gilliam * char *vn - the volume name to match against
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * sdbcstat_t * - the matching strcture, NULL if not found
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * sdbc_addstat() - adds a fully populated sdbcstat_t structure
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * to the linked list of currently monitored kstats. The structure
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * will be added in alphabetical order, using the volume name as the
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * parameters
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * sdbcstat_t *sdbcstat - to be added to the list.
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * If we get to the last item in the list, then just
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * add this one to the end
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * sdbc_delstat() - deallocate memory for the structure being
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * passed in.
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * parameters
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * sdbcstat_t *sdbcstat - structure to be deallocated
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * sdbcstat_t * - pointer to the "next" structures in the
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * linked list. May be NULL if we are removing the last
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * structure in the linked list.
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * sdbc_value_check() - Checks for activity, supports -z switch
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * parameters
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * sdbcstat_t *sdbcstat - structure to be checked
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * 1 - activity
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * 0 - no activity
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (sdbc_getdelta(sdbcstat, SDBC_CDKSTAT_CACHE_READ) != 0)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return (1);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (sdbc_getdelta(sdbcstat, SDBC_CDKSTAT_DISK_READ) != 0)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (sdbc_getdelta(sdbcstat, SDBC_CDKSTAT_CACHE_WRITE) != 0)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return (1);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (sdbc_getdelta(sdbcstat, SDBC_CDKSTAT_DISK_WRITE) != 0)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return (1);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (sdbc_getdelta(sdbcstat, SDBC_CDKSTAT_WRCANCELNS) != 0)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return (1);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return (1);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return (0);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * sdbc_validate() - validates the structure of the kstats by attempting to
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * lookup fields used by this module
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * parameters
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * kstat_t *ksp - kstat to be examined
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * 1 - one or more fields missing
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * 0 - all fields present
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return (1);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return (0);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * sdbc_getvalues() - populates a values structure with data obtained from the
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * sdbcstat_t *sdbcstat - pointer to the structure containing the kstats
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * sdbcvals_t *vals - pointer to the structure that will receive the values
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * int flags - flags that describe adjustments made to the values
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * 1 - failure
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * 0 - success
83c4dfe9546fd839e7a52bca7e9920da918f916ejgsdbc_getvalues(sdbcstat_t *sdbcstat, sdbcvals_t *vals, int flags)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return (1);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg hr_etime = hrtime_delta(pre->rlastupdate, cur->rlastupdate);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg /* read data */
83c4dfe9546fd839e7a52bca7e9920da918f916ejg FBA_SIZE(sdbc_getdelta(sdbcstat, SDBC_CDKSTAT_CACHE_READ));
83c4dfe9546fd839e7a52bca7e9920da918f916ejg FBA_SIZE(sdbc_getdelta(sdbcstat, SDBC_CDKSTAT_DISK_READ));
83c4dfe9546fd839e7a52bca7e9920da918f916ejg /* write data */
c3b4ae1846dcc50dda26b0cf1a3d787b8077a0ffJerry Gilliam FBA_SIZE(sdbc_getdelta(sdbcstat, SDBC_CDKSTAT_CACHE_WRITE));
83c4dfe9546fd839e7a52bca7e9920da918f916ejg FBA_SIZE(sdbc_getdelta(sdbcstat, SDBC_CDKSTAT_DISK_WRITE));
83c4dfe9546fd839e7a52bca7e9920da918f916ejg vals->total_writes = vals->cache_write + vals->disk_write;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg FBA_SIZE(sdbc_getdelta(sdbcstat, SDBC_CDKSTAT_DESTAGED));
83c4dfe9546fd839e7a52bca7e9920da918f916ejg /* miscellaneous */
83c4dfe9546fd839e7a52bca7e9920da918f916ejg FBA_SIZE(sdbc_getdelta(sdbcstat, SDBC_CDKSTAT_WRCANCELNS));
83c4dfe9546fd839e7a52bca7e9920da918f916ejg vals->total_cache = vals->cache_read + vals->cache_write;
c3b4ae1846dcc50dda26b0cf1a3d787b8077a0ffJerry Gilliam /* total cache hit calculation */
83c4dfe9546fd839e7a52bca7e9920da918f916ejg /* adjustments */
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return (0);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * sdbc_getdelta() - calculates the difference between two kstat fields
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * parameters
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * sdbcstat_t *sdbcstat - the SDBC stat strcture containing the two fields
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * char *name - the name of the fields
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * uint32_t value of the differences adjusted for overflow of the data type