[BACK]Return to rf_raid.h CVS log [TXT][DIR] Up to [local] / sys / dev / raidframe

Annotation of sys/dev/raidframe/rf_raid.h, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: rf_raid.h,v 1.8 2007/04/10 17:47:55 miod Exp $        */
        !             2: /*     $NetBSD: rf_raid.h,v 1.12 2000/02/24 17:12:10 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:  * rf_raid.h -- Main header file for RAID driver.
        !            33:  *************************************************/
        !            34:
        !            35:
        !            36: #ifndef        _RF__RF_RAID_H_
        !            37: #define        _RF__RF_RAID_H_
        !            38:
        !            39: #include "rf_archs.h"
        !            40: #include "rf_types.h"
        !            41: #include "rf_threadstuff.h"
        !            42:
        !            43: #if    defined(__NetBSD__)
        !            44: #include "rf_netbsd.h"
        !            45: #elif  defined(__OpenBSD__)
        !            46: #include "rf_openbsd.h"
        !            47: #endif
        !            48:
        !            49: #include <sys/disklabel.h>
        !            50: #include <sys/types.h>
        !            51:
        !            52: #include "rf_alloclist.h"
        !            53: #include "rf_stripelocks.h"
        !            54: #include "rf_layout.h"
        !            55: #include "rf_disks.h"
        !            56: #include "rf_debugMem.h"
        !            57: #include "rf_diskqueue.h"
        !            58: #include "rf_reconstruct.h"
        !            59: #include "rf_acctrace.h"
        !            60:
        !            61: #if    RF_INCLUDE_PARITYLOGGING > 0
        !            62: #include "rf_paritylog.h"
        !            63: #endif /* RF_INCLUDE_PARITYLOGGING > 0 */
        !            64:
        !            65: #define        RF_MAX_DISKS                    128     /* Max disks per array. */
        !            66: #define        RF_DEV2RAIDID(_dev)             (DISKUNIT(_dev))
        !            67:
        !            68: #define        RF_COMPONENT_LABEL_VERSION_1    1
        !            69: #define        RF_COMPONENT_LABEL_VERSION      2
        !            70: #define        RF_RAID_DIRTY                   0
        !            71: #define        RF_RAID_CLEAN                   1
        !            72:
        !            73: /*
        !            74:  * Each row in the array is a distinct parity group, so
        !            75:  * each has its own status, which is one of the following.
        !            76:  */
        !            77: typedef enum RF_RowStatus_e {
        !            78:        rf_rs_optimal,
        !            79:        rf_rs_degraded,
        !            80:        rf_rs_reconstructing,
        !            81:        rf_rs_reconfigured
        !            82: } RF_RowStatus_t;
        !            83:
        !            84: struct RF_CumulativeStats_s {
        !            85:        struct timeval          start;          /*
        !            86:                                                 * The time when the stats were
        !            87:                                                 * last started.
        !            88:                                                 */
        !            89:        struct timeval          stop;           /*
        !            90:                                                 * The time when the stats were
        !            91:                                                 * last stopped.
        !            92:                                                 */
        !            93:        long                    sum_io_us;      /*
        !            94:                                                 * Sum of all user response
        !            95:                                                 * times (us).
        !            96:                                                 */
        !            97:        long                    num_ios;        /*
        !            98:                                                 * Total number of I/Os
        !            99:                                                 * serviced.
        !           100:                                                 */
        !           101:        long                    num_sect_moved; /*
        !           102:                                                 * Total number of sectors read
        !           103:                                                 * or written.
        !           104:                                                 */
        !           105: };
        !           106:
        !           107: struct RF_ThroughputStats_s {
        !           108:        RF_DECLARE_MUTEX        (mutex);        /*
        !           109:                                                 * A mutex used to lock the
        !           110:                                                 * configuration stuff.
        !           111:                                                 */
        !           112:        struct timeval           start;         /*
        !           113:                                                 * Timer started when
        !           114:                                                 * numOutstandingRequests
        !           115:                                                 * moves from 0 to 1.
        !           116:                                                 */
        !           117:        struct timeval           stop;          /*
        !           118:                                                 * Timer stopped when
        !           119:                                                 * numOutstandingRequests
        !           120:                                                 * moves from 1 to 0.
        !           121:                                                 */
        !           122:        RF_uint64                sum_io_us;     /*
        !           123:                                                 * Total time timer is enabled.
        !           124:                                                 */
        !           125:        RF_uint64                num_ios;       /*
        !           126:                                                 * Total number of I/Os
        !           127:                                                 * processed by RAIDframe.
        !           128:                                                 */
        !           129:        long                     num_out_ios;   /*
        !           130:                                                 * Number of outstanding I/Os.
        !           131:                                                 */
        !           132: };
        !           133:
        !           134: struct RF_Raid_s {
        !           135:        /* This portion never changes, and can be accessed without locking */
        !           136:        /*
        !           137:         * An exception is Disks[][].status, which requires locking when it is
        !           138:         * changed. XXX This is no longer true. numSpare and friends can
        !           139:         * change now.
        !           140:         */
        !           141:        u_int                     numRow;       /*
        !           142:                                                 * Number of rows of disks,
        !           143:                                                 * typically == # of ranks.
        !           144:                                                 */
        !           145:        u_int                     numCol;       /*
        !           146:                                                 * Number of columns of disks,
        !           147:                                                 * typically == # of disks/rank.
        !           148:                                                 */
        !           149:        u_int                     numSpare;     /* Number of spare disks. */
        !           150:        int                       maxQueueDepth;/* Max disk queue depth. */
        !           151:        RF_SectorCount_t          totalSectors; /*
        !           152:                                                 * Total number of sectors
        !           153:                                                 * in the array.
        !           154:                                                 */
        !           155:        RF_SectorCount_t          sectorsPerDisk;
        !           156:                                                /*
        !           157:                                                 * Number of sectors on each
        !           158:                                                 * disk.
        !           159:                                                 */
        !           160:        u_int                     logBytesPerSector;
        !           161:                                                /*
        !           162:                                                 * Base-2 log of the number
        !           163:                                                 * of bytes in a sector.
        !           164:                                                 */
        !           165:        u_int                     bytesPerSector;
        !           166:                                                /* Bytes in a sector. */
        !           167:        RF_int32                  sectorMask;   /* Mask of bytes-per-sector. */
        !           168:
        !           169:        RF_RaidLayout_t           Layout;       /*
        !           170:                                                 * All information related to
        !           171:                                                 * layout.
        !           172:                                                 */
        !           173:        RF_RaidDisk_t           **Disks;        /*
        !           174:                                                 * All information related to
        !           175:                                                 * physical disks.
        !           176:                                                 */
        !           177:        RF_DiskQueue_t          **Queues;       /*
        !           178:                                                 * All information related to
        !           179:                                                 * disk queues.
        !           180:                                                 */
        !           181:        RF_DiskQueueSW_t         *qType;        /*
        !           182:                                                 * Pointer to the DiskQueueSW
        !           183:                                                 * used for the component
        !           184:                                                 * queues.
        !           185:                                                 */
        !           186:        /*
        !           187:         * NOTE:  This is an anchor point via which the queues can be
        !           188:         * accessed, but the enqueue/dequeue routines in diskqueue.c use a
        !           189:         * local copy of this pointer for the actual accesses.
        !           190:         */
        !           191:        /*
        !           192:         * The remainder of the structure can change, and therefore requires
        !           193:         * locking on reads and updates.
        !           194:         */
        !           195:        RF_DECLARE_MUTEX         (mutex);       /*
        !           196:                                                 * Mutex used to serialize
        !           197:                                                 * access to the fields below.
        !           198:                                                 */
        !           199:        RF_RowStatus_t           *status;       /*
        !           200:                                                 * The status of each row in
        !           201:                                                 * the array.
        !           202:                                                 */
        !           203:        int                       valid;        /*
        !           204:                                                 * Indicates successful
        !           205:                                                 * configuration.
        !           206:                                                 */
        !           207:        RF_LockTableEntry_t      *lockTable;    /* Stripe-lock table. */
        !           208:        RF_LockTableEntry_t      *quiesceLock;  /* Quiescence table. */
        !           209:        int                       numFailures;  /*
        !           210:                                                 * Total number of failures
        !           211:                                                 * in the array.
        !           212:                                                 */
        !           213:        int                       numNewFailures;
        !           214:                                                /*
        !           215:                                                 * Number of *new* failures
        !           216:                                                 * (that haven't caused a
        !           217:                                                 * mod_counter update).
        !           218:                                                 */
        !           219:
        !           220:        int                       parity_good;  /*
        !           221:                                                 * !0 if parity is known to be
        !           222:                                                 * correct.
        !           223:                                                 */
        !           224:        int                       serial_number;/*
        !           225:                                                 * A "serial number" for this
        !           226:                                                 * set.
        !           227:                                                 */
        !           228:        int                       mod_counter;  /*
        !           229:                                                 * Modification counter for
        !           230:                                                 * component labels.
        !           231:                                                 */
        !           232:        int                       clean;        /*
        !           233:                                                 * The clean bit for this array.
        !           234:                                                 */
        !           235:
        !           236:        int                       openings;     /*
        !           237:                                                 * Number of I/Os that can be
        !           238:                                                 * scheduled simultaneously
        !           239:                                                 * (high-level - not a
        !           240:                                                 * per-component limit).
        !           241:                                                 */
        !           242:
        !           243:        int                       maxOutstanding;
        !           244:                                                /*
        !           245:                                                 * maxOutstanding requests
        !           246:                                                 * (per-component).
        !           247:                                                 */
        !           248:        int                       autoconfigure;
        !           249:                                                /*
        !           250:                                                 * Automatically configure
        !           251:                                                 * this RAID set.
        !           252:                                                 * 0 == no, 1 == yes
        !           253:                                                 */
        !           254:        int                       root_partition;
        !           255:                                                /*
        !           256:                                                 * Use this set as
        !           257:                                                 * 0 == no, 1 == yes.
        !           258:                                                 */
        !           259:        int                       last_unit;    /*
        !           260:                                                 * Last unit number (e.g. 0
        !           261:                                                 * for /dev/raid0) of this
        !           262:                                                 * component. Used for
        !           263:                                                 * autoconfigure only.
        !           264:                                                 */
        !           265:        int                       config_order; /*
        !           266:                                                 * 0 .. n. The order in which
        !           267:                                                 * the component should be
        !           268:                                                 * auto-configured.
        !           269:                                                 * E.g. 0 is will done first,
        !           270:                                                 * (and would become raid0).
        !           271:                                                 * This may be in conflict
        !           272:                                                 * with last_unit !!?!
        !           273:                                                 */
        !           274:                                                /* Not currently used. */
        !           275:
        !           276:        /*
        !           277:         * Cleanup stuff.
        !           278:         */
        !           279:        RF_ShutdownList_t        *shutdownList; /* Shutdown activities. */
        !           280:        RF_AllocListElem_t       *cleanupList;  /*
        !           281:                                                 * Memory to be freed at
        !           282:                                                 * shutdown time.
        !           283:                                                 */
        !           284:
        !           285:        /*
        !           286:         * Recon stuff.
        !           287:         */
        !           288:        RF_HeadSepLimit_t         headSepLimit;
        !           289:        int                       numFloatingReconBufs;
        !           290:        int                       reconInProgress;
        !           291:        RF_DECLARE_COND          (waitForReconCond);
        !           292:        RF_RaidReconDesc_t       *reconDesc;    /* Reconstruction descriptor. */
        !           293:        RF_ReconCtrl_t          **reconControl; /*
        !           294:                                                 * Reconstruction control
        !           295:                                                 * structure pointers for each
        !           296:                                                 * row in the array.
        !           297:                                                 */
        !           298:
        !           299:        /*
        !           300:         * Array-quiescence stuff.
        !           301:         */
        !           302:        RF_DECLARE_MUTEX         (access_suspend_mutex);
        !           303:        RF_DECLARE_COND          (quiescent_cond);
        !           304:        RF_IoCount_t              accesses_suspended;
        !           305:        RF_IoCount_t              accs_in_flight;
        !           306:        int                       access_suspend_release;
        !           307:        int                       waiting_for_quiescence;
        !           308:        RF_CallbackDesc_t        *quiesce_wait_list;
        !           309:
        !           310:        /*
        !           311:         * Statistics.
        !           312:         */
        !           313: #if    !defined(_KERNEL) && !defined(SIMULATE)
        !           314:        RF_ThroughputStats_t      throughputstats;
        !           315: #endif /* !_KERNEL && !SIMULATE */
        !           316:        RF_CumulativeStats_t      userstats;
        !           317:        int                       parity_rewrite_stripes_done;
        !           318:        int                       recon_stripes_done;
        !           319:        int                       copyback_stripes_done;
        !           320:
        !           321:        int                       recon_in_progress;
        !           322:        int                       parity_rewrite_in_progress;
        !           323:        int                       copyback_in_progress;
        !           324:
        !           325:        /*
        !           326:         * Engine thread control.
        !           327:         */
        !           328:        RF_DECLARE_MUTEX         (node_queue_mutex);
        !           329:        RF_DECLARE_COND          (node_queue_cond);
        !           330:        RF_DagNode_t             *node_queue;
        !           331:        RF_Thread_t               parity_rewrite_thread;
        !           332:        RF_Thread_t               copyback_thread;
        !           333:        RF_Thread_t               engine_thread;
        !           334:        RF_Thread_t               recon_thread;
        !           335:        RF_ThreadGroup_t          engine_tg;
        !           336:        int                       shutdown_engine;
        !           337:        int                       dags_in_flight;       /* Debug. */
        !           338:
        !           339:        /*
        !           340:         * PSS (Parity Stripe Status) stuff.
        !           341:         */
        !           342:        RF_FreeList_t            *pss_freelist;
        !           343:        long                      pssTableSize;
        !           344:
        !           345:        /*
        !           346:         * Reconstruction stuff.
        !           347:         */
        !           348:        int                       procsInBufWait;
        !           349:        int                       numFullReconBuffers;
        !           350:        RF_AccTraceEntry_t       *recon_tracerecs;
        !           351:        unsigned long             accumXorTimeUs;
        !           352:        RF_ReconDoneProc_t       *recon_done_procs;
        !           353:        RF_DECLARE_MUTEX         (recon_done_proc_mutex);
        !           354:        /*
        !           355:         * nAccOutstanding, waitShutdown protected by desc freelist lock
        !           356:         * (This may seem strange, since that's a central serialization point
        !           357:         * for a per-array piece of data, but otherwise, it'd be an extra
        !           358:         * per-array lock, and that'd only be less efficient...)
        !           359:         */
        !           360:        RF_DECLARE_COND          (outstandingCond);
        !           361:        int                       waitShutdown;
        !           362:        int                       nAccOutstanding;
        !           363:
        !           364:        RF_DiskId_t             **diskids;
        !           365:        RF_DiskId_t              *sparediskids;
        !           366:
        !           367:        int                       raidid;
        !           368:        RF_AccTotals_t            acc_totals;
        !           369:        int                       keep_acc_totals;
        !           370:
        !           371:        struct raidcinfo        **raid_cinfo;   /* Array of component info. */
        !           372:
        !           373:        int                       terminate_disk_queues;
        !           374:
        !           375:        /*
        !           376:         * XXX
        !           377:         *
        !           378:         * Config-specific information should be moved
        !           379:         * somewhere else, or at least hung off this
        !           380:         * in some generic way.
        !           381:         */
        !           382:
        !           383:        /* Used by rf_compute_workload_shift. */
        !           384:        RF_RowCol_t               hist_diskreq[RF_MAXROW][RF_MAXCOL];
        !           385:
        !           386:        /* Used by declustering. */
        !           387:        int                       noRotate;
        !           388:
        !           389: #if    RF_INCLUDE_PARITYLOGGING > 0
        !           390:        /* used by parity logging */
        !           391:        RF_SectorCount_t          regionLogCapacity;
        !           392:        RF_ParityLogQueue_t       parityLogPool;/*
        !           393:                                                 * Pool of unused parity logs.
        !           394:                                                 */
        !           395:        RF_RegionInfo_t          *regionInfo;   /* Array of region state. */
        !           396:        int                       numParityLogs;
        !           397:        int                       numSectorsPerLog;
        !           398:        int                       regionParityRange;
        !           399:        int                       logsInUse;    /* Debugging. */
        !           400:        RF_ParityLogDiskQueue_t   parityLogDiskQueue;
        !           401:                                                /*
        !           402:                                                 * State of parity logging
        !           403:                                                 * disk work.
        !           404:                                                 */
        !           405:        RF_RegionBufferQueue_t    regionBufferPool;
        !           406:                                                /*
        !           407:                                                 * buffers for holding region
        !           408:                                                 * log.
        !           409:                                                 */
        !           410:        RF_RegionBufferQueue_t    parityBufferPool;
        !           411:                                                /*
        !           412:                                                 * Buffers for holding parity.
        !           413:                                                 */
        !           414:        caddr_t                   parityLogBufferHeap;
        !           415:                                                /*
        !           416:                                                 * Pool of unused parity logs.
        !           417:                                                 */
        !           418:        RF_Thread_t               pLogDiskThreadHandle;
        !           419:
        !           420: #endif /* RF_INCLUDE_PARITYLOGGING > 0 */
        !           421: };
        !           422:
        !           423: #endif /* !_RF__RF_RAID_H_ */

CVSweb