xref: /onnv-gate/usr/src/uts/common/avs/ns/rdc/rdc_diskq.h (revision 7836:4e95154b5b7a)
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