1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
  23  * Use is subject to license terms.
  24  */
  25 
  26 
  27 #ifndef _SD_TRACE_H
  28 #define _SD_TRACE_H
  29 
  30 #ifdef  __cplusplus
  31 extern "C" {
  32 #endif
  33 
  34 
  35 #ifdef _SD_NOTRACE
  36 #define SDALERT(f, cd, len, fba, flg, ret)
  37 #define SDTRACE(f, cd, len, fba, flg, ret)
  38 #define DATA_LOG_CHAIN(ttype, c_ent, stp, ln)
  39 #define DATA_LOG(ttype, c_ent, stp, ln)
  40 #else
  41 #define SDALERT(f, cd, len, fba, flg, ret) \
  42         _sd_alert(f, (int)cd, (int)len, (nsc_off_t)fba, (int)flg, (int)ret)
  43 #define SDTRACE(f, cd, len, fba, flg, ret) \
  44         if (_sd_trace_mask & (f)) \
  45                 _sd_trace(f, (int)cd, (int)len, (nsc_off_t)fba,\
  46                     (int)flg, (int)ret)
  47 #define DATA_LOG_CHAIN(ttype, c_ent, stp, ln) \
  48         _sd_data_log_chain((int)(ttype), c_ent, (nsc_off_t)(stp), \
  49             (nsc_size_t)(ln))
  50 #if defined(_SD_FBA_DATA_LOG) || defined(lint)
  51 #define DATA_LOG(ttype, c_ent, stp, ln) \
  52         _sd_data_log((int)(ttype), c_ent, (nsc_off_t)(stp), (nsc_size_t)(ln))
  53 #else
  54 #define DATA_LOG(ttype, c_ent, stp, ln) \
  55         SDTRACE(ttype, CENTRY_CD(c_ent), \
  56                 ln, (nsc_off_t)(BLK_TO_FBA_NUM(CENTRY_BLK(c_ent)) + stp), \
  57                 *(int *)((c_ent)->cc_data+FBA_SIZE(stp)), \
  58                 *(int *)((c_ent)->cc_data+FBA_SIZE(stp+ln)-4))
  59 #endif /* (_SD_FBA_DATA_LOG) */
  60 #endif
  61 
  62 #define SDT_INV_CD      -1
  63 #define SDT_ANY_CD      -2
  64 #define SDT_INV_BL      0xffffffff
  65 
  66 typedef struct _sdtr
  67 {
  68         ushort_t t_func;        /* function being traced */
  69         ushort_t t_len;         /* allocation type */
  70         nsc_off_t t_fba;        /* fixed block offset */
  71         int t_flg;              /* buffer size requested */
  72         int t_ret;              /* return value */
  73         int t_time;             /* micro_second timer, or lbolt */
  74                                 /* low order only on LP64 systems */
  75 } _sdtr_t;
  76 
  77 typedef struct _sdtr_table
  78 {
  79         int tt_cd;              /* cache device */
  80         int tt_max;             /* entries in table */
  81         int tt_in;              /* entries added */
  82         int tt_out;             /* entries read */
  83         int tt_cnt;             /* unread entries */
  84         int tt_cntout;          /* tt_cnt after dump */
  85         int tt_mask;            /* copy of _sd_trace_mask */
  86         int tt_lost;            /* lost after alert */
  87         char tt_alert;          /* alert signaled */
  88         char tt_lbolt;          /* use 'lbolt' instead of microsec */
  89         char tt_good;           /* use locking (races with end-action) */
  90         char tt_type;           /* memory region 0 or 1 (_SD_MEM_TRACE) */
  91         _sdtr_t tt_buf[1];      /* per-device trace records [0..tt_max] */
  92 } _sdtr_table_t;
  93 
  94 #if defined(_KERNEL)
  95 typedef struct _sdbc_trace_s {
  96         _sdtr_table_t   *tbl;   /* points to the trace table for a cd */
  97         kmutex_t        *t_lock;  /* the lock for this cd */
  98         } _sdbc_trace_t;
  99 #endif /* _KERNEL */
 100 
 101 /* sd_adump() flags */
 102 #define SD_SET_SIZE     0x01    /* create log if it doesn't exist */
 103 #define SD_SET_MASK     0x02
 104 #define SD_SET_LBOLT    0x04
 105 #define SD_SET_GOOD     0x08
 106 #define SD_ADUMP_WAIT   0x10    /* wakeup for buffer full or alert */
 107 #define SD_ALERT_WAIT   0x20    /* wakeup for alert messages */
 108 
 109 /* Trace function, category, mask bits */
 110 #define ST_FUNC         0x000f  /* functions per category */
 111 #define ST_CATMASK      0x0ff0  /* Category mask        */
 112 
 113 #define ST_BCACHE       0x0010  /* BCACHE entry points */
 114 #define ST_BSUB         0x0020  /* BCACHE subroutines */
 115 #define ST_IO           0x0040  /* IO subsystem */
 116 #define ST_CCIO         0x0080  /* concurrent (dual) copy */
 117 #define ST_FT           0x0100  /* Fault-tolerant subsystem */
 118 #define ST_DL           0x0200  /* Data-logging (debug) */
 119 #define ST_STATS        0x0400  /* cache statistics */
 120 #define ST_CKD          0x0800  /* SIMCKD traces */
 121 
 122 #define ST_ENTER        0x1000  /* function entry */
 123 #define ST_EXIT         0x2000  /* function exit */
 124 #define ST_INFO         0x4000  /* see t_flg */
 125 #define ST_ALERT        0x8000  /* force write to daemon */
 126 
 127 /*
 128  * dump file pseudo-entries
 129  */
 130 #define SDF_LOST        0x0000  /* trace is missing entries */
 131 #define SDF_CD          0x0001  /* new device (following entries) */
 132 
 133 /*
 134  * ST_BCACHE functions
 135  */
 136 #define SDF_OPEN        0x00 | ST_BCACHE
 137 #define SDF_CLOSE       0x01 | ST_BCACHE
 138 #define SDF_HALLOC      0x02 | ST_BCACHE
 139 #define SDF_HFREE       0x03 | ST_BCACHE
 140 #define SDF_ALLOCBUF    0x04 | ST_BCACHE
 141 #define SDF_FREEBUF     0x05 | ST_BCACHE
 142 #define SDF_WRITE       0x06 | ST_BCACHE
 143 #define SDF_READ        0x07 | ST_BCACHE
 144 #define SDF_UNCOMMIT    0x08 | ST_BCACHE
 145 #define SDF_ZERO        0x09 | ST_BCACHE
 146 #define SDF_HINT        0x0a | ST_BCACHE
 147 #define SDF_ATTACH      0x0b | ST_BCACHE | ST_FT
 148 #define SDF_DETACH      0x0c | ST_BCACHE | ST_FT
 149 #define SDF_NOTIFY      0x0d | ST_BCACHE
 150 
 151 /*
 152  * ST_BSUB - bcache subroutines
 153  */
 154 #define SDF_ENT_GET     0x00 | ST_BSUB
 155 #define SDF_ENT_ALLOC   0x01 | ST_BSUB
 156 #define SDF_READ_EA     0x02 | ST_BSUB
 157 #define SDF_ENT_FREE    0x03 | ST_BSUB
 158 #define SDF_WR_ALLOC    0x04 | ST_BSUB
 159 #define SDF_WR_FREE     0x05 | ST_BSUB
 160 #define SDF_WR_ALLOCONE 0x06 | ST_BSUB
 161 
 162 
 163 /*
 164  * SD_IO - I/O subsustem
 165  */
 166 #define SDF_FLCLIST     0x00 | ST_IO
 167 #define SDF_FLCENT      0x01 | ST_IO
 168 #define SDF_FLCLIST_EA  0x02 | ST_IO
 169 #define SDF_FLCENT_EA   0x03 | ST_IO
 170 #define SDF_FLDONE      0x04 | ST_IO
 171 #define SDF_IOB_ALLOC   0x05 | ST_IO
 172 
 173 /*
 174  * ST_FT - Fault-tolerant subsystem
 175  */
 176 #define SDF_AWAITR      0x00 | ST_FT
 177 #define SDF_RECOVER     0x01 | ST_FT
 178 #define SDF_FT_CLONE    0x02 | ST_FT
 179 #define SDF_REFLECT     0x03 | ST_FT
 180 #define SDF_ONLINE      0x04 | ST_FT
 181 
 182 /*
 183  * ST_STATS - Statistics points
 184  */
 185 #define SDF_REPLACE     0x00 | ST_STATS
 186 #define SDF_DISCONNECT  0x01 | ST_STATS
 187 
 188 /*
 189  * ST_INFO
 190  */
 191 #define SDF_COVERAGE    0x00 | ST_INFO
 192 
 193 /*
 194  * ST_DL
 195  */
 196 
 197 #define SDF_ALLOC       0x00 | ST_DL
 198 #define SDF_RD          0x01 | ST_DL
 199 #define SDF_WR          0x02 | ST_DL
 200 #define SDF_WRSYNC      0x03 | ST_DL
 201 #define SDF_FLSHLIST    0x04 | ST_DL
 202 #define SDF_FLSHENT     0x05 | ST_DL
 203 #define SDF_RDIO        0x06 | ST_DL
 204 #define SDF_FLEA        0x07 | ST_DL
 205 #define SDF_FLSTEA      0x08 | ST_DL
 206 #define SDF_WRSYEA      0x09 | ST_DL
 207 
 208 /*
 209  * More entry points
 210  */
 211 
 212 #ifdef _SD_FNAME
 213 /*
 214  * function category names
 215  *      change these when changing functions above
 216  *      compress name to fit in 8 printable characters
 217  */
 218 char *_bcache_fname[16] =
 219 {
 220         "open",
 221         "close",
 222         "al_hndl",
 223         "fr_hndl",
 224         "al_buf",
 225         "fr_buf",
 226         "write",
 227         "read",
 228         "ucommit",
 229         "zero",
 230         "hint",
 231         "attach",
 232         "detach",
 233         "notify",
 234 };
 235 
 236 char *_bsub_fname[16] =
 237 {
 238         "get_cent",
 239         "al_cent",
 240         "read_ea",
 241         "fr_cent",
 242         "al_went",
 243         "fr_went",
 244         "al_wone",
 245 };
 246 
 247 char *_io_fname[16] =
 248 {
 249         "flclist",
 250         "flcent",
 251         "eaclist",
 252         "eacent",
 253         "fldone",
 254         "get_iob",
 255 };
 256 
 257 char *_ccio_fname[16] =
 258 {
 259         "ccio",
 260         "dc_albuf",
 261         "dc_frbuf",
 262         "dc_write",
 263         "dc_read",
 264         "dc_zero",
 265 };
 266 
 267 char *_ft_fname[16] =
 268 {
 269         "wait_rec",
 270         "cache_rc",
 271         "ft_clone",
 272         "reflect",
 273         "online",
 274 };
 275 
 276 char *_stats_fname[16] =
 277 {
 278         "LRU-repl",
 279         "Disconn",
 280 };
 281 
 282 char *_info_fname[16] =
 283 {
 284         "Cover",
 285 };
 286 
 287 char *_dlog_fname[16] =
 288 {
 289         "alloc",
 290         "rd",
 291         "wr",
 292         "wrsync",
 293         "flshlist",
 294         "flshent",
 295         "rdio",
 296         "flea",
 297         "flstea",
 298         "wrsyea",
 299 };
 300 
 301 #endif  /* _ST_NAMES */
 302 #ifdef _KERNEL
 303 
 304 extern int _sd_trace_mask;
 305 
 306 extern void _sdbc_tr_unload(void);
 307 extern int _sdbc_tr_load(void);
 308 extern int _sdbc_tr_configure(int cd);
 309 extern void _sdbc_tr_deconfigure(void);
 310 extern int _sd_adump(void *args, int *rvp);
 311 extern void _sd_alert(int f, int cd, int len, nsc_off_t fba, int flg, int ret);
 312 extern void _sd_trace(int f, int cd, int len, nsc_off_t fba, int flg,
 313     int ret);
 314 #endif /* _KERNEL */
 315 
 316 #ifdef __cplusplus
 317 }
 318 #endif
 319 
 320 #endif /* _SD_TRACE_H */