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

Annotation of sys/dev/raidframe/rf_dag.h, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: rf_dag.h,v 1.4 2002/12/16 07:01:03 tdeval Exp $       */
                      2: /*     $NetBSD: rf_dag.h,v 1.3 1999/02/05 00:06:07 oster Exp $ */
                      3:
                      4: /*
                      5:  * Copyright (c) 1995 Carnegie-Mellon University.
                      6:  * All rights reserved.
                      7:  *
                      8:  * Author: William V. Courtright II, 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:  * dag.h -- header file for DAG-related data structures                     *
                     34:  *                                                                          *
                     35:  ****************************************************************************/
                     36:
                     37: #ifndef        _RF__RF_DAG_H_
                     38: #define        _RF__RF_DAG_H_
                     39:
                     40: #include "rf_types.h"
                     41: #include "rf_threadstuff.h"
                     42: #include "rf_alloclist.h"
                     43: #include "rf_stripelocks.h"
                     44: #include "rf_layout.h"
                     45: #include "rf_dagflags.h"
                     46: #include "rf_acctrace.h"
                     47: #include "rf_memchunk.h"
                     48:
                     49: #define        RF_THREAD_CONTEXT   0   /* We were invoked from thread context. */
                     50: #define        RF_INTR_CONTEXT     1   /* We were invoked from interrupt context. */
                     51: #define        RF_MAX_ANTECEDENTS 20   /* Max num of antecedents a node may possess. */
                     52:
                     53: #include <sys/buf.h>
                     54:
                     55: struct RF_PropHeader_s {       /* Structure for propagation of results. */
                     56:        int              resultNum;     /* Bind result # resultNum. */
                     57:        int              paramNum;      /* To parameter # paramNum. */
                     58:        RF_PropHeader_t *next;          /* Linked list for multiple
                     59:                                         * results/params. */
                     60: };
                     61:
                     62: typedef enum RF_NodeStatus_e {
                     63:        rf_bwd1,        /*
                     64:                         * Node is ready for undo logging
                     65:                         * (backward error recovery only).
                     66:                         */
                     67:        rf_bwd2,        /*
                     68:                         * Node has completed undo logging
                     69:                         * (backward error recovery only).
                     70:                         */
                     71:        rf_wait,        /* Node is waiting to be executed. */
                     72:        rf_fired,       /* Node is currently executing its do function. */
                     73:        rf_good,        /*
                     74:                         * Node successfully completed execution
                     75:                         * of its do function.
                     76:                         */
                     77:        rf_bad,         /*
                     78:                         * Node failed to successfully execute
                     79:                         * its do function.
                     80:                         */
                     81:        rf_skipped,     /*
                     82:                         * Not used anymore, used to imply a node
                     83:                         * was not executed.
                     84:                         */
                     85:        rf_recover,     /* Node is currently executing its undo function. */
                     86:        rf_panic,       /*
                     87:                         * Node failed to successfully execute
                     88:                         * its undo function.
                     89:                         */
                     90:        rf_undone       /* Node successfully executed its undo function. */
                     91: } RF_NodeStatus_t;
                     92:
                     93: /*
                     94:  * These were used to control skipping a node.
                     95:  * Now, these are only used as comments.
                     96:  */
                     97: typedef enum RF_AntecedentType_e {
                     98:        rf_trueData,
                     99:        rf_antiData,
                    100:        rf_outputData,
                    101:        rf_control
                    102: } RF_AntecedentType_t;
                    103: #define        RF_DAG_PTRCACHESIZE     40
                    104: #define        RF_DAG_PARAMCACHESIZE   12
                    105:
                    106: typedef RF_uint8 RF_DagNodeFlags_t;
                    107:
                    108: struct RF_DagNode_s {
                    109:        RF_NodeStatus_t   status;       /* Current status of this node. */
                    110:        int             (*doFunc) (RF_DagNode_t *);
                    111:                                        /* Normal function. */
                    112:        int             (*undoFunc) (RF_DagNode_t *);
                    113:                                        /* Func to remove effect of doFunc. */
                    114:        int             (*wakeFunc) (RF_DagNode_t *, int status);
                    115:                                        /*
                    116:                                         * Func called when the node completes
                    117:                                         * an I/O.
                    118:                                         */
                    119:        int               numParams;    /*
                    120:                                         * Number of parameters required
                    121:                                         * by *funcPtr.
                    122:                                         */
                    123:        int               numResults;   /*
                    124:                                         * Number of results produced
                    125:                                         * by *funcPtr.
                    126:                                         */
                    127:        int               numAntecedents; /* Number of antecedents. */
                    128:        int               numAntDone;   /*
                    129:                                         * Number of antecedents that
                    130:                                         * have finished.
                    131:                                         */
                    132:        int               numSuccedents; /* Number of succedents. */
                    133:        int               numSuccFired; /*
                    134:                                         * Incremented when a succedent
                    135:                                         * is fired during forward execution.
                    136:                                         */
                    137:        int               numSuccDone;  /*
                    138:                                         * Incremented when a succedent
                    139:                                         * finishes during rollBackward.
                    140:                                         */
                    141:        int               commitNode;   /*
                    142:                                         * Boolean flag - if true, this is
                    143:                                         * a commit node.
                    144:                                         */
                    145:        RF_DagNode_t    **succedents;   /*
                    146:                                         * Succedents, array size
                    147:                                         * numSuccedents.
                    148:                                         */
                    149:        RF_DagNode_t    **antecedents;  /*
                    150:                                         * Antecedents, array size
                    151:                                         * numAntecedents.
                    152:                                         */
                    153:        RF_AntecedentType_t antType[RF_MAX_ANTECEDENTS];
                    154:                                        /* Type of each antecedent. */
                    155:        void            **results;      /*
                    156:                                         * Array of results produced
                    157:                                         * by *funcPtr.
                    158:                                         */
                    159:        RF_DagParam_t    *params;       /*
                    160:                                         * Array of parameters required
                    161:                                         * by *funcPtr.
                    162:                                         */
                    163:        RF_PropHeader_t **propList;     /*
                    164:                                         * Propagation list,
                    165:                                         * size numSuccedents.
                    166:                                         */
                    167:        RF_DagHeader_t   *dagHdr;       /*
                    168:                                         * Ptr to head of dag containing
                    169:                                         * this node.
                    170:                                         */
                    171:        void             *dagFuncData;  /*
                    172:                                         * Dag execution func uses this
                    173:                                         * for whatever it wants.
                    174:                                         */
                    175:        RF_DagNode_t     *next;
                    176:        int               nodeNum;      /* Used by PrintDAG for debug only. */
                    177:        int               visited;      /*
                    178:                                         * Used to avoid re-visiting
                    179:                                         * nodes on DAG walks.
                    180:                                         */
                    181:        /*
                    182:         * ANY CODE THAT USES THIS FIELD MUST MAINTAIN THE PROPERTY THAT
                    183:         * AFTER IT FINISHES, ALL VISITED FLAGS IN THE DAG ARE IDENTICAL.
                    184:         */
                    185:
                    186:        char             *name;         /* Debug only. */
                    187:        RF_DagNodeFlags_t flags;        /* See below. */
                    188:        RF_DagNode_t     *dag_ptrs[RF_DAG_PTRCACHESIZE];
                    189:                                        /* Cache for performance. */
                    190:        RF_DagParam_t     dag_params[RF_DAG_PARAMCACHESIZE];
                    191:                                        /* Cache for performance. */
                    192: };
                    193:
                    194: /*
                    195:  * Bit values for flags field of RF_DagNode_t.
                    196:  */
                    197: #define        RF_DAGNODE_FLAG_NONE    0x00
                    198: #define        RF_DAGNODE_FLAG_YIELD   0x01    /*
                    199:                                         * In the kernel, yield the processor
                    200:                                         * before firing this node.
                    201:                                         */
                    202:
                    203: /*
                    204:  * rf_enable      - DAG ready for normal execution, no errors encountered.
                    205:  * rf_rollForward  - DAG encountered an error after commit point, rolling
                    206:  *                  forward.
                    207:  * rf_rollBackward - DAG encountered an error prior to commit point, rolling
                    208:  *                  backward.
                    209:  */
                    210: typedef enum RF_DagStatus_e {
                    211:        rf_enable,
                    212:        rf_rollForward,
                    213:        rf_rollBackward
                    214: } RF_DagStatus_t;
                    215:
                    216: #define        RF_MAX_HDR_SUCC          1
                    217:
                    218: #define        RF_MAXCHUNKS            10
                    219:
                    220: struct RF_DagHeader_s {
                    221:        RF_DagStatus_t    status;               /* Status of this DAG. */
                    222:        int               numSuccedents;        /*
                    223:                                                 * DAG may be a tree,
                    224:                                                 * i.e. may have > 1 root.
                    225:                                                 */
                    226:        int               numCommitNodes;       /*
                    227:                                                 * Number of commit nodes
                    228:                                                 * in graph.
                    229:                                                 */
                    230:        int               numCommits;           /*
                    231:                                                 * Number of commit nodes
                    232:                                                 * that have been fired.
                    233:                                                 */
                    234:        RF_DagNode_t     *succedents[RF_MAX_HDR_SUCC];  /*
                    235:                                                         * Array of succedents,
                    236:                                                         * size numSuccedents.
                    237:                                                         */
                    238:        RF_DagHeader_t   *next;                 /*
                    239:                                                 * Ptr to allow a list
                    240:                                                 * of dags.
                    241:                                                 */
                    242:        RF_AllocListElem_t *allocList;          /*
                    243:                                                 * Ptr to list of ptrs
                    244:                                                 * to be freed prior to
                    245:                                                 * freeing DAG.
                    246:                                                 */
                    247:        RF_AccessStripeMapHeader_t *asmList;    /*
                    248:                                                 * List of access stripe maps
                    249:                                                 * to be freed.
                    250:                                                 */
                    251:        int               nodeNum;              /*
                    252:                                                 * Used by PrintDAG for
                    253:                                                 * debug only.
                    254:                                                 */
                    255:        int               numNodesCompleted;
                    256:        RF_AccTraceEntry_t *tracerec;           /* Perf mon only. */
                    257:
                    258:        void            (*cbFunc) (void *);     /*
                    259:                                                 * Function to call when
                    260:                                                 * the dag completes.
                    261:                                                 */
                    262:        void             *cbArg;                /* Argument for cbFunc. */
                    263:        char             *creator;              /*
                    264:                                                 * Name of function used
                    265:                                                 * to create this dag.
                    266:                                                 */
                    267:
                    268:        RF_Raid_t        *raidPtr;              /*
                    269:                                                 * The descriptor for the
                    270:                                                 * RAID device this DAG
                    271:                                                 * is for.
                    272:                                                 */
                    273:        void             *bp;                   /*
                    274:                                                 * The bp for this I/O passed
                    275:                                                 * down from the file system.
                    276:                                                 * ignored outside kernel.
                    277:                                                 */
                    278:
                    279:        RF_ChunkDesc_t   *memChunk[RF_MAXCHUNKS]; /*
                    280:                                                 * Experimental- Chunks of
                    281:                                                 * memory to be retained upon
                    282:                                                 * DAG free for re-use.
                    283:                                                 */
                    284:        int               chunkIndex;           /*
                    285:                                                 * The idea is to avoid calls
                    286:                                                 * to alloc and free.
                    287:                                                 */
                    288:
                    289:        RF_ChunkDesc_t  **xtraMemChunk;         /*
                    290:                                                 * Escape hatch that allows
                    291:                                                 * SelectAlgorithm to merge
                    292:                                                 * memChunks from several dags.
                    293:                                                 */
                    294:        int               xtraChunkIndex;       /*
                    295:                                                 * Number of ptrs to valid
                    296:                                                 * chunks.
                    297:                                                 */
                    298:        int               xtraChunkCnt;         /*
                    299:                                                 * Number of ptrs to chunks
                    300:                                                 * allocated.
                    301:                                                 */
                    302: };
                    303:
                    304: struct RF_DagList_s {
                    305:        /* Common info for a list of dags that will be fired sequentially. */
                    306:        int              numDags;       /* Number of dags in the list. */
                    307:        int              numDagsFired;  /*
                    308:                                         * Number of dags in list that
                    309:                                         * have initiated execution.
                    310:                                         */
                    311:        int              numDagsDone;   /*
                    312:                                         * Number of dags in list that
                    313:                                         * have completed execution.
                    314:                                         */
                    315:        RF_DagHeader_t  *dags;          /* List of dags. */
                    316:        RF_RaidAccessDesc_t *desc;      /* Ptr to descriptor for this access. */
                    317:        RF_AccTraceEntry_t tracerec;    /*
                    318:                                         * Perf mon info for dags (not user
                    319:                                         * info).
                    320:                                         */
                    321: };
                    322:
                    323: /* Reset a node so that it can be fired again. */
                    324: #define        RF_ResetNode(_n_)       do {                                    \
                    325:        (_n_)->status = rf_wait;                                        \
                    326:        (_n_)->numAntDone = 0;                                          \
                    327:        (_n_)->numSuccFired = 0;                                        \
                    328:        (_n_)->numSuccDone = 0;                                         \
                    329:        (_n_)->next = NULL;                                             \
                    330: } while (0)
                    331:
                    332: #define        RF_ResetDagHeader(_h_)  do {                                    \
                    333:        (_h_)->numNodesCompleted = 0;                                   \
                    334:        (_h_)->numCommits = 0;                                          \
                    335:        (_h_)->status = rf_enable;                                      \
                    336: } while (0)
                    337:
                    338: /* Convenience macro for declaring a create dag function. */
                    339: #define        RF_CREATE_DAG_FUNC_DECL(_name_)                                 \
                    340: void _name_ (RF_Raid_t *, RF_AccessStripeMap_t *, RF_DagHeader_t *,    \
                    341:     void *, RF_RaidAccessFlags_t, RF_AllocListElem_t *);               \
                    342: void _name_ (                                                          \
                    343:        RF_Raid_t               *raidPtr,                               \
                    344:        RF_AccessStripeMap_t    *asmap,                                 \
                    345:        RF_DagHeader_t          *dag_h,                                 \
                    346:        void                    *bp,                                    \
                    347:        RF_RaidAccessFlags_t     flags,                                 \
                    348:        RF_AllocListElem_t      *allocList                              \
                    349: )
                    350:
                    351: #endif /* !_RF__RF_DAG_H_ */

CVSweb