Annotation of sys/dev/raidframe/rf_diskqueue.h, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: rf_diskqueue.h,v 1.5 2002/12/16 07:01:03 tdeval Exp $ */
! 2: /* $NetBSD: rf_diskqueue.h,v 1.5 2000/02/13 04:53:57 oster Exp $ */
! 3:
! 4: /*
! 5: * Copyright (c) 1995 Carnegie-Mellon University.
! 6: * All rights reserved.
! 7: *
! 8: * Author: Mark Holland
! 9: *
! 10: * Permission to use, copy, modify and distribute this software and
! 11: * its documentation is hereby granted, provided that both the copyright
! 12: * notice and this permission notice appear in all copies of the
! 13: * software, derivative works or modified versions, and any portions
! 14: * thereof, and that both notices appear in supporting documentation.
! 15: *
! 16: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
! 17: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
! 18: * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
! 19: *
! 20: * Carnegie Mellon requests users of this software to return to
! 21: *
! 22: * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
! 23: * School of Computer Science
! 24: * Carnegie Mellon University
! 25: * Pittsburgh PA 15213-3890
! 26: *
! 27: * any improvements or extensions that they make and grant Carnegie the
! 28: * rights to redistribute these changes.
! 29: */
! 30:
! 31: /*****************************************************************************
! 32: *
! 33: * rf_diskqueue.h -- Header file for disk queues.
! 34: *
! 35: * See comments in rf_diskqueue.c
! 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: /* The data held by a disk queue entry. */
! 61: struct RF_DiskQueueData_s {
! 62: RF_SectorNum_t sectorOffset; /* Sector offset into the disk. */
! 63: RF_SectorCount_t numSector; /* Number of sectors to read/write. */
! 64: RF_IoType_t type; /* Read/write/nop. */
! 65: caddr_t buf; /* Buffer pointer. */
! 66: RF_StripeNum_t parityStripeID;
! 67: /*
! 68: * The RAID parity stripe ID this
! 69: * access is for.
! 70: */
! 71: RF_ReconUnitNum_t which_ru; /* Which RU within this parity stripe */
! 72: int priority; /* The priority of this request. */
! 73: int (*CompleteFunc) (void *, int);
! 74: /*
! 75: * Function to be called upon
! 76: * completion.
! 77: */
! 78: int (*AuxFunc) (void *,...);
! 79: /*
! 80: * Function called upon completion
! 81: * of the first I/O of a Read_Op_Write
! 82: * pair.
! 83: */
! 84: void *argument; /*
! 85: * Argument to be passed to
! 86: * CompleteFunc.
! 87: */
! 88: RF_Raid_t *raidPtr; /* Needed for simulation. */
! 89: RF_AccTraceEntry_t *tracerec; /* Perf mon only. */
! 90: RF_Etimer_t qtime; /*
! 91: * Perf mon only - time request is
! 92: * in queue.
! 93: */
! 94: long entryTime;
! 95: RF_DiskQueueData_t *next;
! 96: RF_DiskQueueData_t *prev;
! 97: caddr_t buf2; /* For read-op-write. */
! 98: dev_t dev; /*
! 99: * The device number for in-kernel
! 100: * version.
! 101: */
! 102: RF_DiskQueue_t *queue; /*
! 103: * The disk queue to which this req
! 104: * is targeted.
! 105: */
! 106: RF_DiskQueueDataFlags_t flags; /* Flags controlling operation. */
! 107:
! 108: struct proc *b_proc; /*
! 109: * The b_proc from the original bp
! 110: * passed into the driver for this I/O.
! 111: */
! 112: struct buf *bp; /* A bp to use to get this I/O done. */
! 113: };
! 114: #define RF_LOCK_DISK_QUEUE 0x01
! 115: #define RF_UNLOCK_DISK_QUEUE 0x02
! 116:
! 117: /*
! 118: * Note: "Create" returns type-specific queue header pointer cast to (void *).
! 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: * Creation routine -- one call per
! 126: * queue in system.
! 127: */
! 128: void (*Enqueue) (void *, RF_DiskQueueData_t *, int);
! 129: /* Enqueue routine. */
! 130: RF_DiskQueueData_t *(*Dequeue) (void *);
! 131: /* Dequeue routine. */
! 132: RF_DiskQueueData_t *(*Peek) (void *);
! 133: /* Peek at head of queue. */
! 134:
! 135: /*
! 136: * The rest are optional: they improve performance, but the driver
! 137: * will deal with it if they don't exist.
! 138: */
! 139: int (*Promote) (void *, RF_StripeNum_t, RF_ReconUnitNum_t);
! 140: /*
! 141: * Promotes priority of tagged
! 142: * accesses.
! 143: */
! 144: };
! 145:
! 146: struct RF_DiskQueue_s {
! 147: RF_DiskQueueSW_t *qPtr; /* Access point to queue functions. */
! 148: void *qHdr; /* Queue header, of whatever type. */
! 149: RF_DECLARE_MUTEX(mutex); /* Mutex locking data structures. */
! 150: RF_DECLARE_COND(cond); /*
! 151: * Condition variable for
! 152: * synchronization.
! 153: */
! 154: long numOutstanding;
! 155: /*
! 156: * Number of I/Os currently
! 157: * outstanding on disk.
! 158: */
! 159: long maxOutstanding;
! 160: /*
! 161: * Max number of I/Os that can be
! 162: * outstanding on a disk.
! 163: * (in-kernel only)
! 164: */
! 165: int curPriority; /*
! 166: * The priority of accs all that are
! 167: * currently outstanding.
! 168: */
! 169: long queueLength; /* Number of requests in queue. */
! 170: RF_DiskQueueData_t *nextLockingOp;
! 171: /*
! 172: * A locking op that has arrived at
! 173: * the head of the queue & is waiting
! 174: * for drainage.
! 175: */
! 176: RF_DiskQueueData_t *unlockingOp;/*
! 177: * Used at user level to communicate
! 178: * unlocking op b/w user (or dag exec)
! 179: * & disk threads.
! 180: */
! 181: int numWaiting; /*
! 182: * Number of threads waiting on
! 183: * this variable.
! 184: * (user-level only)
! 185: */
! 186: RF_DiskQueueFlags_t flags; /* Terminate, locked. */
! 187: RF_Raid_t *raidPtr; /* Associated array. */
! 188: dev_t dev; /* Device number for kernel version. */
! 189: RF_SectorNum_t last_deq_sector;
! 190: /*
! 191: * Last sector number dequeued or
! 192: * dispatched.
! 193: */
! 194: int row, col; /* Debug only. */
! 195: struct raidcinfo *rf_cinfo; /* Disks component info... */
! 196: };
! 197:
! 198: /* No new accs allowed until queue is explicitly unlocked. */
! 199: #define RF_DQ_LOCKED 0x02
! 200:
! 201: /* Macros setting & returning information about queues and requests. */
! 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: /* Whether it is ok to dispatch a regular request. */
! 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 /* ! _RF__RF_DISKQUEUE_H_ */
CVSweb