1*7836SJohn.Forte@Sun.COM /* 2*7836SJohn.Forte@Sun.COM * CDDL HEADER START 3*7836SJohn.Forte@Sun.COM * 4*7836SJohn.Forte@Sun.COM * The contents of this file are subject to the terms of the 5*7836SJohn.Forte@Sun.COM * Common Development and Distribution License (the "License"). 6*7836SJohn.Forte@Sun.COM * You may not use this file except in compliance with the License. 7*7836SJohn.Forte@Sun.COM * 8*7836SJohn.Forte@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*7836SJohn.Forte@Sun.COM * or http://www.opensolaris.org/os/licensing. 10*7836SJohn.Forte@Sun.COM * See the License for the specific language governing permissions 11*7836SJohn.Forte@Sun.COM * and limitations under the License. 12*7836SJohn.Forte@Sun.COM * 13*7836SJohn.Forte@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each 14*7836SJohn.Forte@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*7836SJohn.Forte@Sun.COM * If applicable, add the following below this CDDL HEADER, with the 16*7836SJohn.Forte@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying 17*7836SJohn.Forte@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner] 18*7836SJohn.Forte@Sun.COM * 19*7836SJohn.Forte@Sun.COM * CDDL HEADER END 20*7836SJohn.Forte@Sun.COM */ 21*7836SJohn.Forte@Sun.COM /* 22*7836SJohn.Forte@Sun.COM * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 23*7836SJohn.Forte@Sun.COM * Use is subject to license terms. 24*7836SJohn.Forte@Sun.COM */ 25*7836SJohn.Forte@Sun.COM 26*7836SJohn.Forte@Sun.COM #ifndef _RDC_DISKQ_H 27*7836SJohn.Forte@Sun.COM #define _RDC_DISKQ_H 28*7836SJohn.Forte@Sun.COM 29*7836SJohn.Forte@Sun.COM #ifdef __cplusplus 30*7836SJohn.Forte@Sun.COM extern "C" { 31*7836SJohn.Forte@Sun.COM #endif 32*7836SJohn.Forte@Sun.COM 33*7836SJohn.Forte@Sun.COM #ifdef _KERNEL 34*7836SJohn.Forte@Sun.COM 35*7836SJohn.Forte@Sun.COM #define RDC_DISKQ_HEADER_OFF 0 /* beginning of disk */ 36*7836SJohn.Forte@Sun.COM #define RDC_DISKQ_DATA_OFF FBA_LEN(1024) /* beginning of queue */ 37*7836SJohn.Forte@Sun.COM 38*7836SJohn.Forte@Sun.COM typedef struct qentry { 39*7836SJohn.Forte@Sun.COM int magic; 40*7836SJohn.Forte@Sun.COM int type; /* special data ? io? bitmap? */ 41*7836SJohn.Forte@Sun.COM nsc_off_t pos; /* position it will be in the rdc_aio_t */ 42*7836SJohn.Forte@Sun.COM nsc_off_t hpos; /* starting pos of orig nsc_buf_t */ 43*7836SJohn.Forte@Sun.COM nsc_off_t qpos; /* where this info is in the queue */ 44*7836SJohn.Forte@Sun.COM nsc_size_t len; /* len */ 45*7836SJohn.Forte@Sun.COM int flag; 46*7836SJohn.Forte@Sun.COM int iostatus; 47*7836SJohn.Forte@Sun.COM uint32_t setid; /* krdc */ 48*7836SJohn.Forte@Sun.COM time_t time; 49*7836SJohn.Forte@Sun.COM void *next; 50*7836SJohn.Forte@Sun.COM } q_data; 51*7836SJohn.Forte@Sun.COM 52*7836SJohn.Forte@Sun.COM typedef union io_dat { 53*7836SJohn.Forte@Sun.COM q_data dat; 54*7836SJohn.Forte@Sun.COM char dummy[512]; 55*7836SJohn.Forte@Sun.COM } io_hdr; 56*7836SJohn.Forte@Sun.COM 57*7836SJohn.Forte@Sun.COM #define RDC_IOHDR_MAGIC 0x494F4844 /* IOHD */ 58*7836SJohn.Forte@Sun.COM #define RDC_IOHDR_DONE 0xDEADCAFE /* this q entry has been flushed */ 59*7836SJohn.Forte@Sun.COM #define RDC_IOHDR_WAITING 0xBEEFCAFE /* this q entry is waiting for ack */ 60*7836SJohn.Forte@Sun.COM 61*7836SJohn.Forte@Sun.COM /* type */ 62*7836SJohn.Forte@Sun.COM #define RDC_QUEUEIO 0x02 63*7836SJohn.Forte@Sun.COM 64*7836SJohn.Forte@Sun.COM #define RDC_DISKQ_MAGIC 0x44534B51 65*7836SJohn.Forte@Sun.COM #define RDC_DISKQ_VER_ORIG 0x01 66*7836SJohn.Forte@Sun.COM #define RDC_DISKQ_VER_64BIT 0x02 67*7836SJohn.Forte@Sun.COM 68*7836SJohn.Forte@Sun.COM #ifdef NSC_MULTI_TERABYTE 69*7836SJohn.Forte@Sun.COM #define RDC_DISKQ_VERS RDC_DISKQ_VER_64BIT 70*7836SJohn.Forte@Sun.COM #else 71*7836SJohn.Forte@Sun.COM #define RDC_DISKQ_VERS RDC_DISKQ_VER_ORIG 72*7836SJohn.Forte@Sun.COM #endif 73*7836SJohn.Forte@Sun.COM 74*7836SJohn.Forte@Sun.COM typedef struct diskqheader1 { 75*7836SJohn.Forte@Sun.COM int magic; 76*7836SJohn.Forte@Sun.COM int vers; 77*7836SJohn.Forte@Sun.COM int state; 78*7836SJohn.Forte@Sun.COM int head_offset; /* offset of meta-info of head (fbas) */ 79*7836SJohn.Forte@Sun.COM int tail_offset; /* addr of next write (fbas) */ 80*7836SJohn.Forte@Sun.COM int disk_size; /* allow growing ? (fbas) */ 81*7836SJohn.Forte@Sun.COM long nitems; /* items */ 82*7836SJohn.Forte@Sun.COM long blocks; /* fbas */ 83*7836SJohn.Forte@Sun.COM int qwrap; /* where the tail wrapped */ 84*7836SJohn.Forte@Sun.COM int auxqwrap; /* if the tail wraps again, before head wraps once */ 85*7836SJohn.Forte@Sun.COM uint_t seq_last; /* last sequence before suspend */ 86*7836SJohn.Forte@Sun.COM uint_t ack_last; /* last ack before suspend */ 87*7836SJohn.Forte@Sun.COM } diskq_header1; 88*7836SJohn.Forte@Sun.COM 89*7836SJohn.Forte@Sun.COM typedef struct diskqheader2 { 90*7836SJohn.Forte@Sun.COM int magic; 91*7836SJohn.Forte@Sun.COM int vers; 92*7836SJohn.Forte@Sun.COM int state; 93*7836SJohn.Forte@Sun.COM uint64_t head_offset; /* offset of meta-info of head (fbas) */ 94*7836SJohn.Forte@Sun.COM uint64_t tail_offset; /* addr of next write (fbas) */ 95*7836SJohn.Forte@Sun.COM uint64_t disk_size; /* allow growing ? (fbas) */ 96*7836SJohn.Forte@Sun.COM uint64_t nitems; /* items */ 97*7836SJohn.Forte@Sun.COM uint64_t blocks; /* fbas */ 98*7836SJohn.Forte@Sun.COM uint64_t qwrap; /* where the tail wrapped */ 99*7836SJohn.Forte@Sun.COM uint64_t auxqwrap; /* if the tail wraps again, before head wraps once */ 100*7836SJohn.Forte@Sun.COM uint_t seq_last; /* last sequence before suspend */ 101*7836SJohn.Forte@Sun.COM uint_t ack_last; /* last ack before suspend */ 102*7836SJohn.Forte@Sun.COM } diskq_header2; 103*7836SJohn.Forte@Sun.COM 104*7836SJohn.Forte@Sun.COM #ifdef NSC_MULTI_TERABYTE 105*7836SJohn.Forte@Sun.COM typedef diskq_header2 diskq_header; 106*7836SJohn.Forte@Sun.COM #ifdef _LP64 107*7836SJohn.Forte@Sun.COM #define RDC_DQFMT "lu" 108*7836SJohn.Forte@Sun.COM #else 109*7836SJohn.Forte@Sun.COM #define RDC_DQFMT "llu" 110*7836SJohn.Forte@Sun.COM #endif 111*7836SJohn.Forte@Sun.COM #else 112*7836SJohn.Forte@Sun.COM typedef diskq_header1 diskq_header; 113*7836SJohn.Forte@Sun.COM #define RDC_DQFMT "ld" 114*7836SJohn.Forte@Sun.COM #endif 115*7836SJohn.Forte@Sun.COM typedef union headr { 116*7836SJohn.Forte@Sun.COM diskq_header h; 117*7836SJohn.Forte@Sun.COM char dummy[512]; 118*7836SJohn.Forte@Sun.COM } dqheader; 119*7836SJohn.Forte@Sun.COM 120*7836SJohn.Forte@Sun.COM /* flags for the state field in the header */ 121*7836SJohn.Forte@Sun.COM 122*7836SJohn.Forte@Sun.COM #define RDC_SHUTDOWN_OK 0x01 123*7836SJohn.Forte@Sun.COM #define RDC_SHUTDOWN_BAD 0x02 124*7836SJohn.Forte@Sun.COM #define QNXTIOWRAPD 0x04 125*7836SJohn.Forte@Sun.COM #define QHEADWRAPD 0x08 126*7836SJohn.Forte@Sun.COM #define QTAILBUSY 0x10 /* tell flusher not to grab, incomplete */ 127*7836SJohn.Forte@Sun.COM #define RDC_QNOBLOCK 0x10000 /* can also be passed out by status */ 128*7836SJohn.Forte@Sun.COM #define RDC_QBADRESUME 0x20 /* don't resume bit ref */ 129*7836SJohn.Forte@Sun.COM #define RDC_QFULL 0x40 /* the queue is in a full delay loop */ 130*7836SJohn.Forte@Sun.COM #define RDC_STOPPINGFLUSH 0x80 131*7836SJohn.Forte@Sun.COM 132*7836SJohn.Forte@Sun.COM #define RDC_QFILLSTOP 0x01 /* diskq->memq flusher kill switch */ 133*7836SJohn.Forte@Sun.COM #define RDC_QFILLSLEEP 0x02 /* explicit diskq->memq flusher sleep */ 134*7836SJohn.Forte@Sun.COM 135*7836SJohn.Forte@Sun.COM #define RDC_MAX_DISKQREAD 0x1000 /* max 2 mb q read */ 136*7836SJohn.Forte@Sun.COM 137*7836SJohn.Forte@Sun.COM typedef struct diskqueue { /* the incore info about the diskq */ 138*7836SJohn.Forte@Sun.COM dqheader disk_hdr; /* info about the queue */ 139*7836SJohn.Forte@Sun.COM long nitems_hwm; 140*7836SJohn.Forte@Sun.COM long blocks_hwm; 141*7836SJohn.Forte@Sun.COM long throttle_delay; 142*7836SJohn.Forte@Sun.COM nsc_off_t last_tail; /* pos of the last tail write */ 143*7836SJohn.Forte@Sun.COM volatile int inflbls; /* number of inflight blocks */ 144*7836SJohn.Forte@Sun.COM volatile int inflitems; /* number of inflight blocks */ 145*7836SJohn.Forte@Sun.COM 146*7836SJohn.Forte@Sun.COM kmutex_t disk_qlock; /* protects all things in diskq */ 147*7836SJohn.Forte@Sun.COM /* and all things in dqheader */ 148*7836SJohn.Forte@Sun.COM 149*7836SJohn.Forte@Sun.COM kmutex_t head_lock; 150*7836SJohn.Forte@Sun.COM kcondvar_t busycv; 151*7836SJohn.Forte@Sun.COM int busycnt; 152*7836SJohn.Forte@Sun.COM nsc_off_t nxt_io; /* flushers head pointer */ 153*7836SJohn.Forte@Sun.COM int hdrcnt; /* number of io_hdrs on list */ 154*7836SJohn.Forte@Sun.COM nsc_off_t coalesc_bounds; /* don't coalesce below this offset */ 155*7836SJohn.Forte@Sun.COM rdc_aio_t *lastio; /* cached copy of the last write on q */ 156*7836SJohn.Forte@Sun.COM io_hdr *iohdrs; /* flushed, not ack'd on queue */ 157*7836SJohn.Forte@Sun.COM io_hdr *hdr_last; /* tail of iohdr list */ 158*7836SJohn.Forte@Sun.COM kcondvar_t qfullcv; /* block, queue is full */ 159*7836SJohn.Forte@Sun.COM } disk_queue; 160*7836SJohn.Forte@Sun.COM 161*7836SJohn.Forte@Sun.COM /* diskq macros (gets) */ 162*7836SJohn.Forte@Sun.COM 163*7836SJohn.Forte@Sun.COM #define QHEAD(q) q->disk_hdr.h.head_offset 164*7836SJohn.Forte@Sun.COM #define QNXTIO(q) q->nxt_io 165*7836SJohn.Forte@Sun.COM #define QTAIL(q) q->disk_hdr.h.tail_offset 166*7836SJohn.Forte@Sun.COM #define QNITEMS(q) q->disk_hdr.h.nitems 167*7836SJohn.Forte@Sun.COM #define QBLOCKS(q) q->disk_hdr.h.blocks 168*7836SJohn.Forte@Sun.COM #define QSTATE(q) q->disk_hdr.h.state 169*7836SJohn.Forte@Sun.COM #define IS_QSTATE(q, s) (q->disk_hdr.h.state & s) 170*7836SJohn.Forte@Sun.COM #define QSIZE(q) q->disk_hdr.h.disk_size 171*7836SJohn.Forte@Sun.COM #define QMAGIC(q) q->disk_hdr.h.magic 172*7836SJohn.Forte@Sun.COM #define QVERS(q) q->disk_hdr.h.vers 173*7836SJohn.Forte@Sun.COM #define QSEQ(q) q->disk_hdr.h.seq_last 174*7836SJohn.Forte@Sun.COM #define QACK(q) q->disk_hdr.h.ack_last 175*7836SJohn.Forte@Sun.COM #define QEMPTY(q) ((QTAIL(q) == QHEAD(q))&&(!(QNITEMS(q)))) 176*7836SJohn.Forte@Sun.COM #define QWRAP(q) q->disk_hdr.h.qwrap 177*7836SJohn.Forte@Sun.COM #define AUXQWRAP(q) q->disk_hdr.h.auxqwrap 178*7836SJohn.Forte@Sun.COM #define LASTQTAIL(q) q->last_tail 179*7836SJohn.Forte@Sun.COM #define QCOALBOUNDS(q) q->coalesc_bounds 180*7836SJohn.Forte@Sun.COM 181*7836SJohn.Forte@Sun.COM /* diskq macros (sets) */ 182*7836SJohn.Forte@Sun.COM 183*7836SJohn.Forte@Sun.COM #define INC_QHEAD(q, n) q->disk_hdr.h.head_offset += n 184*7836SJohn.Forte@Sun.COM #define INC_QNXTIO(q, n) q->nxt_io += n 185*7836SJohn.Forte@Sun.COM #define DEC_QNXTIO(q, n) q->nxt_io -= n 186*7836SJohn.Forte@Sun.COM #define DEC_QHEAD(q, n) q->disk_hdr.h.head_offset -= n 187*7836SJohn.Forte@Sun.COM #define INC_QTAIL(q, n) q->disk_hdr.h.tail_offset += n 188*7836SJohn.Forte@Sun.COM #define DEC_QTAIL(q, n) q->disk_hdr.h.tail_offset -= n 189*7836SJohn.Forte@Sun.COM #define INC_QNITEMS(q, n) q->disk_hdr.h.nitems += n 190*7836SJohn.Forte@Sun.COM #define DEC_QNITEMS(q, n) q->disk_hdr.h.nitems -= n 191*7836SJohn.Forte@Sun.COM #define INC_QBLOCKS(q, n) q->disk_hdr.h.blocks += n 192*7836SJohn.Forte@Sun.COM #define DEC_QBLOCKS(q, n) q->disk_hdr.h.blocks -= n 193*7836SJohn.Forte@Sun.COM 194*7836SJohn.Forte@Sun.COM #define SET_QMAGIC(q, n) q->disk_hdr.h.magic = n 195*7836SJohn.Forte@Sun.COM #define SET_QSTATE(q, n) q->disk_hdr.h.state |= n 196*7836SJohn.Forte@Sun.COM #define CLR_QSTATE(q, n) q->disk_hdr.h.state &= ~n 197*7836SJohn.Forte@Sun.COM #define SET_QHEAD(q, n) q->disk_hdr.h.head_offset = n 198*7836SJohn.Forte@Sun.COM #define SET_QNXTIO(q, n) q->nxt_io = n 199*7836SJohn.Forte@Sun.COM #define SET_QHDRCNT(q, n) q->hdrcnt = n 200*7836SJohn.Forte@Sun.COM #define SET_QTAIL(q, n) q->disk_hdr.h.tail_offset = n 201*7836SJohn.Forte@Sun.COM #define SET_LASTQTAIL(q, n) q->last_tail = n 202*7836SJohn.Forte@Sun.COM #define SET_LASTQWRITE(q, w) q->last_qwrite = w 203*7836SJohn.Forte@Sun.COM #define SET_QSIZE(q, n) q->disk_hdr.h.disk_size = n 204*7836SJohn.Forte@Sun.COM #define SET_QNITEMS(q, n) q->disk_hdr.h.nitems = n 205*7836SJohn.Forte@Sun.COM #define SET_QBLOCKS(q, n) q->disk_hdr.h.blocks = n 206*7836SJohn.Forte@Sun.COM 207*7836SJohn.Forte@Sun.COM #define SET_QWRAP(q, n) q->disk_hdr.h.qwrap = n 208*7836SJohn.Forte@Sun.COM #define CLR_QWRAP(q) q->disk_hdr.h.qwrap = 0 209*7836SJohn.Forte@Sun.COM #define SET_AUXQWRAP(q, n) q->disk_hdr.h.auxqwrap = n 210*7836SJohn.Forte@Sun.COM #define CLR_AUXQWRAP(q) q->disk_hdr.h.auxqwrap = 0 211*7836SJohn.Forte@Sun.COM #define SET_QCOALBOUNDS(q, n) q->coalesc_bounds = n 212*7836SJohn.Forte@Sun.COM 213*7836SJohn.Forte@Sun.COM #define WRAPQTAIL(q) \ 214*7836SJohn.Forte@Sun.COM do { \ 215*7836SJohn.Forte@Sun.COM if (QWRAP(q)) { \ 216*7836SJohn.Forte@Sun.COM SET_AUXQWRAP(q, QTAIL(q)); \ 217*7836SJohn.Forte@Sun.COM } else { \ 218*7836SJohn.Forte@Sun.COM SET_QWRAP(q, QTAIL(q)); \ 219*7836SJohn.Forte@Sun.COM } \ 220*7836SJohn.Forte@Sun.COM SET_QTAIL(q, RDC_DISKQ_DATA_OFF); \ 221*7836SJohn.Forte@Sun.COM } while (0) 222*7836SJohn.Forte@Sun.COM 223*7836SJohn.Forte@Sun.COM #define DO_AUXQWRAP(q) \ 224*7836SJohn.Forte@Sun.COM do { \ 225*7836SJohn.Forte@Sun.COM SET_QWRAP(q, AUXQWRAP(q)); \ 226*7836SJohn.Forte@Sun.COM SET_AUXQWRAP(q, 0); \ 227*7836SJohn.Forte@Sun.COM } while (0) 228*7836SJohn.Forte@Sun.COM 229*7836SJohn.Forte@Sun.COM /* these can be wrapped by different threads, avoid the race */ 230*7836SJohn.Forte@Sun.COM #define WRAPQHEAD(q) \ 231*7836SJohn.Forte@Sun.COM do { \ 232*7836SJohn.Forte@Sun.COM if (IS_QSTATE(q, QNXTIOWRAPD)) { \ 233*7836SJohn.Forte@Sun.COM if (AUXQWRAP(q)) { \ 234*7836SJohn.Forte@Sun.COM DO_AUXQWRAP(q); \ 235*7836SJohn.Forte@Sun.COM } else { \ 236*7836SJohn.Forte@Sun.COM SET_QWRAP(q, 0); \ 237*7836SJohn.Forte@Sun.COM } \ 238*7836SJohn.Forte@Sun.COM CLR_QSTATE(q, QNXTIOWRAPD); \ 239*7836SJohn.Forte@Sun.COM } else { \ 240*7836SJohn.Forte@Sun.COM SET_QSTATE(q, QHEADWRAPD); \ 241*7836SJohn.Forte@Sun.COM } \ 242*7836SJohn.Forte@Sun.COM SET_QHEAD(q, RDC_DISKQ_DATA_OFF); \ 243*7836SJohn.Forte@Sun.COM } while (0) 244*7836SJohn.Forte@Sun.COM 245*7836SJohn.Forte@Sun.COM #define WRAPQNXTIO(q) \ 246*7836SJohn.Forte@Sun.COM do { \ 247*7836SJohn.Forte@Sun.COM if (IS_QSTATE(q, QHEADWRAPD)) { \ 248*7836SJohn.Forte@Sun.COM if (AUXQWRAP(q)) { \ 249*7836SJohn.Forte@Sun.COM DO_AUXQWRAP(q); \ 250*7836SJohn.Forte@Sun.COM } else { \ 251*7836SJohn.Forte@Sun.COM SET_QWRAP(q, 0); \ 252*7836SJohn.Forte@Sun.COM } \ 253*7836SJohn.Forte@Sun.COM CLR_QSTATE(q, QHEADWRAPD); \ 254*7836SJohn.Forte@Sun.COM } else { \ 255*7836SJohn.Forte@Sun.COM SET_QSTATE(q, QNXTIOWRAPD); \ 256*7836SJohn.Forte@Sun.COM } \ 257*7836SJohn.Forte@Sun.COM SET_QNXTIO(q, RDC_DISKQ_DATA_OFF); \ 258*7836SJohn.Forte@Sun.COM } while (0) 259*7836SJohn.Forte@Sun.COM 260*7836SJohn.Forte@Sun.COM #define DQEND(q) (QWRAP(q)?QWRAP(q):QSIZE(q)) 261*7836SJohn.Forte@Sun.COM 262*7836SJohn.Forte@Sun.COM #define FITSONQ(q, n) \ 263*7836SJohn.Forte@Sun.COM (((QBLOCKS(q)+QNITEMS(q)+RDC_DISKQ_DATA_OFF+n) >= \ 264*7836SJohn.Forte@Sun.COM (uint64_t)DQEND(q))?0:1) 265*7836SJohn.Forte@Sun.COM 266*7836SJohn.Forte@Sun.COM /* diskq defines/macros (non-specific) */ 267*7836SJohn.Forte@Sun.COM 268*7836SJohn.Forte@Sun.COM #define RDC_NOLOG 0x00 269*7836SJohn.Forte@Sun.COM #define RDC_WAIT 0x01 270*7836SJohn.Forte@Sun.COM #define RDC_NOWAIT 0x02 271*7836SJohn.Forte@Sun.COM #define RDC_DOLOG 0x04 /* put the group into logging */ 272*7836SJohn.Forte@Sun.COM #define RDC_NOFAIL 0x08 /* don't fail the queue, just init */ 273*7836SJohn.Forte@Sun.COM #define RDC_GROUP_LOCKED 0x10 /* trust me, I have the group lock */ 274*7836SJohn.Forte@Sun.COM 275*7836SJohn.Forte@Sun.COM #define RDC_WRITTEN 0x10 /* data has been commited to queue */ 276*7836SJohn.Forte@Sun.COM #define RDC_LAST 0x20 /* end of dequeued buffer, discard */ 277*7836SJohn.Forte@Sun.COM 278*7836SJohn.Forte@Sun.COM /* CSTYLED */ 279*7836SJohn.Forte@Sun.COM #define RDC_BETWEEN(a,b,c) (a<b?((c>=a)&&(c<=b)):((a!=b)&&((c<b)||(c>=a)))) 280*7836SJohn.Forte@Sun.COM /* CSTYLED */ 281*7836SJohn.Forte@Sun.COM 282*7836SJohn.Forte@Sun.COM #define QHEADSHLDWRAP(q) (QWRAP(q) && (QHEAD(q) >= QWRAP(q))) 283*7836SJohn.Forte@Sun.COM #define QNXTIOSHLDWRAP(q) (QWRAP(q) && (QNXTIO(q) >= QWRAP(q))) 284*7836SJohn.Forte@Sun.COM #define QTAILSHLDWRAP(q, size) (QTAIL(q) + size > QSIZE(q)) 285*7836SJohn.Forte@Sun.COM #define QCOALESCEOK(q, dec) ((q->lastio->iostatus & RDC_WRITTEN) && \ 286*7836SJohn.Forte@Sun.COM ((QTAIL(q) > QNXTIO(q)) ? \ 287*7836SJohn.Forte@Sun.COM (((QTAIL(q) - dec) > QNXTIO(q)) && ((QTAIL(q) - dec) > \ 288*7836SJohn.Forte@Sun.COM QCOALBOUNDS(q))):\ 289*7836SJohn.Forte@Sun.COM (QNXTIOSHLDWRAP(q) && QTAIL(q) > RDC_DISKQ_DATA_OFF))) 290*7836SJohn.Forte@Sun.COM 291*7836SJohn.Forte@Sun.COM #define QLOCK(q) &q->disk_qlock 292*7836SJohn.Forte@Sun.COM #define QTAILLOCK(q) &q->tail_lock 293*7836SJohn.Forte@Sun.COM #define QHEADLOCK(q) &q->head_lock 294*7836SJohn.Forte@Sun.COM 295*7836SJohn.Forte@Sun.COM #define QDISPLAY(q) "qmagic: %x qvers: %d qstate: %x qhead: %" \ 296*7836SJohn.Forte@Sun.COM NSC_SZFMT " qnxtio: %" NSC_SZFMT " qtail: %" NSC_SZFMT " qtaillast: %" \ 297*7836SJohn.Forte@Sun.COM NSC_SZFMT " qsize: %" NSC_SZFMT " qnitems: %" RDC_DQFMT \ 298*7836SJohn.Forte@Sun.COM " qblocks: %" RDC_DQFMT " coalbounds %" NSC_SZFMT, QMAGIC(q), \ 299*7836SJohn.Forte@Sun.COM QVERS(q), QSTATE(q), QHEAD(q), QNXTIO(q), QTAIL(q), LASTQTAIL(q), \ 300*7836SJohn.Forte@Sun.COM QSIZE(q), QNITEMS(q), QBLOCKS(q), QCOALBOUNDS(q) 301*7836SJohn.Forte@Sun.COM 302*7836SJohn.Forte@Sun.COM #define QDISPLAYND(q) "m: %x v: %d s: %d h: %" NSC_SZFMT " n: %" \ 303*7836SJohn.Forte@Sun.COM NSC_SZFMT " t: %" NSC_SZFMT " l: %" NSC_SZFMT " z: %" NSC_SZFMT \ 304*7836SJohn.Forte@Sun.COM " i: %" RDC_DQFMT " b: %" RDC_DQFMT " w: %" NSC_SZFMT \ 305*7836SJohn.Forte@Sun.COM " a: %" NSC_SZFMT, \ 306*7836SJohn.Forte@Sun.COM QMAGIC(q), QVERS(q), QSTATE(q), QHEAD(q), \ 307*7836SJohn.Forte@Sun.COM QNXTIO(q), QTAIL(q), LASTQTAIL(q), QSIZE(q), QNITEMS(q), \ 308*7836SJohn.Forte@Sun.COM QBLOCKS(q), QWRAP(q), AUXQWRAP(q) 309*7836SJohn.Forte@Sun.COM 310*7836SJohn.Forte@Sun.COM /* Disk queue flusher state */ 311*7836SJohn.Forte@Sun.COM #define RDC_QFILL_AWAKE (0) 312*7836SJohn.Forte@Sun.COM #define RDC_QFILL_ASLEEP (1) 313*7836SJohn.Forte@Sun.COM #define RDC_QFILL_DEAD (-1) 314*7836SJohn.Forte@Sun.COM 315*7836SJohn.Forte@Sun.COM /* functions */ 316*7836SJohn.Forte@Sun.COM 317*7836SJohn.Forte@Sun.COM int rdc_add_diskq(rdc_config_t *uparms, spcs_s_info_t kstatus); 318*7836SJohn.Forte@Sun.COM int rdc_rem_diskq(rdc_config_t *uparms, spcs_s_info_t kstatus); 319*7836SJohn.Forte@Sun.COM int rdc_kill_diskq(rdc_config_t *uparms, spcs_s_info_t kstatus); 320*7836SJohn.Forte@Sun.COM int rdc_init_diskq(rdc_config_t *uparms, spcs_s_info_t kstatus); 321*7836SJohn.Forte@Sun.COM int rdc_lookup_diskq(char *path); 322*7836SJohn.Forte@Sun.COM int rdc_diskq_inuse(rdc_set_t *set, char *diskq); 323*7836SJohn.Forte@Sun.COM void rdc_dump_iohdrs(disk_queue *q); 324*7836SJohn.Forte@Sun.COM extern void rdc_fixlen(rdc_aio_t *aio); 325*7836SJohn.Forte@Sun.COM 326*7836SJohn.Forte@Sun.COM #endif /* _KERNEL */ 327*7836SJohn.Forte@Sun.COM 328*7836SJohn.Forte@Sun.COM #ifdef __cplusplus 329*7836SJohn.Forte@Sun.COM } 330*7836SJohn.Forte@Sun.COM #endif 331*7836SJohn.Forte@Sun.COM 332*7836SJohn.Forte@Sun.COM #endif /* _RDC_DISKQ_H */ 333