1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 #ifndef _RF__RF_DISKQUEUE_H_
41 #define _RF__RF_DISKQUEUE_H_
42
43 #include "rf_threadstuff.h"
44 #include "rf_acctrace.h"
45 #include "rf_alloclist.h"
46 #include "rf_types.h"
47 #include "rf_etimer.h"
48
49
50 #if defined(__NetBSD__)
51 #include "rf_netbsd.h"
52 #elif defined(__OpenBSD__)
53 #include "rf_openbsd.h"
54 #endif
55
56
57 #define RF_IO_NORMAL_PRIORITY 1
58 #define RF_IO_LOW_PRIORITY 0
59
60
61 struct RF_DiskQueueData_s {
62 RF_SectorNum_t sectorOffset;
63 RF_SectorCount_t numSector;
64 RF_IoType_t type;
65 caddr_t buf;
66 RF_StripeNum_t parityStripeID;
67
68
69
70
71 RF_ReconUnitNum_t which_ru;
72 int priority;
73 int (*CompleteFunc) (void *, int);
74
75
76
77
78 int (*AuxFunc) (void *,...);
79
80
81
82
83
84 void *argument;
85
86
87
88 RF_Raid_t *raidPtr;
89 RF_AccTraceEntry_t *tracerec;
90 RF_Etimer_t qtime;
91
92
93
94 long entryTime;
95 RF_DiskQueueData_t *next;
96 RF_DiskQueueData_t *prev;
97 caddr_t buf2;
98 dev_t dev;
99
100
101
102 RF_DiskQueue_t *queue;
103
104
105
106 RF_DiskQueueDataFlags_t flags;
107
108 struct proc *b_proc;
109
110
111
112 struct buf *bp;
113 };
114 #define RF_LOCK_DISK_QUEUE 0x01
115 #define RF_UNLOCK_DISK_QUEUE 0x02
116
117
118
119
120 struct RF_DiskQueueSW_s {
121 RF_DiskQueueType_t queueType;
122 void *(*Create) (RF_SectorCount_t, RF_AllocListElem_t *,
123 RF_ShutdownList_t **);
124
125
126
127
128 void (*Enqueue) (void *, RF_DiskQueueData_t *, int);
129
130 RF_DiskQueueData_t *(*Dequeue) (void *);
131
132 RF_DiskQueueData_t *(*Peek) (void *);
133
134
135
136
137
138
139 int (*Promote) (void *, RF_StripeNum_t, RF_ReconUnitNum_t);
140
141
142
143
144 };
145
146 struct RF_DiskQueue_s {
147 RF_DiskQueueSW_t *qPtr;
148 void *qHdr;
149 RF_DECLARE_MUTEX(mutex);
150 RF_DECLARE_COND(cond);
151
152
153
154 long numOutstanding;
155
156
157
158
159 long maxOutstanding;
160
161
162
163
164
165 int curPriority;
166
167
168
169 long queueLength;
170 RF_DiskQueueData_t *nextLockingOp;
171
172
173
174
175
176 RF_DiskQueueData_t *unlockingOp;
177
178
179
180
181 int numWaiting;
182
183
184
185
186 RF_DiskQueueFlags_t flags;
187 RF_Raid_t *raidPtr;
188 dev_t dev;
189 RF_SectorNum_t last_deq_sector;
190
191
192
193
194 int row, col;
195 struct raidcinfo *rf_cinfo;
196 };
197
198
199 #define RF_DQ_LOCKED 0x02
200
201
202 #define RF_QUEUE_LOCKED(_q) ((_q)->flags & RF_DQ_LOCKED)
203 #define RF_QUEUE_EMPTY(_q) (((_q)->numOutstanding == 0) && \
204 ((_q)->nextLockingOp == NULL) && \
205 !RF_QUEUE_LOCKED(_q))
206 #define RF_QUEUE_FULL(_q) ((_q)->numOutstanding == \
207 (_q)->maxOutstanding)
208
209 #define RF_LOCK_QUEUE(_q) (_q)->flags |= RF_DQ_LOCKED
210 #define RF_UNLOCK_QUEUE(_q) (_q)->flags &= ~RF_DQ_LOCKED
211
212 #define RF_LOCK_QUEUE_MUTEX(_q_,_wh_) RF_LOCK_MUTEX((_q_)->mutex)
213 #define RF_UNLOCK_QUEUE_MUTEX(_q_,_wh_) RF_UNLOCK_MUTEX((_q_)->mutex)
214
215 #define RF_LOCKING_REQ(_r) ((_r)->flags & RF_LOCK_DISK_QUEUE)
216 #define RF_UNLOCKING_REQ(_r) ((_r)->flags & RF_UNLOCK_DISK_QUEUE)
217
218
219 #define RF_OK_TO_DISPATCH(_q_,_r_) \
220 (RF_QUEUE_EMPTY(_q_) || \
221 ( !RF_QUEUE_FULL(_q_) && ((_r_)->priority >= (_q_)->curPriority)))
222
223 int rf_ConfigureDiskQueueSystem(RF_ShutdownList_t **);
224
225 void rf_TerminateDiskQueues(RF_Raid_t *);
226
227 int rf_ConfigureDiskQueues(RF_ShutdownList_t **, RF_Raid_t *, RF_Config_t *);
228
229 void rf_DiskIOEnqueue(RF_DiskQueue_t *, RF_DiskQueueData_t *, int);
230
231 void rf_DiskIOComplete(RF_DiskQueue_t *, RF_DiskQueueData_t *, int);
232
233 int rf_DiskIOPromote(RF_DiskQueue_t *, RF_StripeNum_t, RF_ReconUnitNum_t);
234
235 RF_DiskQueueData_t *rf_CreateDiskQueueData(RF_IoType_t, RF_SectorNum_t,
236 RF_SectorCount_t, caddr_t, RF_StripeNum_t, RF_ReconUnitNum_t,
237 int (*) (void *, int), void *, RF_DiskQueueData_t *,
238 RF_AccTraceEntry_t *, void *, RF_DiskQueueDataFlags_t, void *);
239
240 RF_DiskQueueData_t *rf_CreateDiskQueueDataFull(RF_IoType_t, RF_SectorNum_t,
241 RF_SectorCount_t, caddr_t, RF_StripeNum_t, RF_ReconUnitNum_t,
242 int (*) (void *, int), void *, RF_DiskQueueData_t *,
243 RF_AccTraceEntry_t *, int, int (*) (void *,...), caddr_t, void *,
244 RF_DiskQueueDataFlags_t, void *);
245
246 void rf_FreeDiskQueueData(RF_DiskQueueData_t *);
247
248 int rf_ConfigureDiskQueue(RF_Raid_t *, RF_DiskQueue_t *, RF_RowCol_t,
249 RF_RowCol_t, RF_DiskQueueSW_t *, RF_SectorCount_t, dev_t, int,
250 RF_ShutdownList_t **, RF_AllocListElem_t *);
251
252 #endif