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

Annotation of sys/dev/raidframe/rf_fifo.c, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: rf_fifo.c,v 1.6 2002/12/16 07:01:04 tdeval Exp $      */
        !             2: /*     $NetBSD: rf_fifo.c,v 1.5 2000/03/04 03:27:13 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_fifo.c --  prioritized fifo queue code.
        !            34:  * There are only two priority levels: hi and lo.
        !            35:  *
        !            36:  * Aug 4, 1994, adapted from raidSim version (MCH)
        !            37:  *
        !            38:  ***************************************************/
        !            39:
        !            40: #include "rf_types.h"
        !            41: #include "rf_alloclist.h"
        !            42: #include "rf_stripelocks.h"
        !            43: #include "rf_layout.h"
        !            44: #include "rf_diskqueue.h"
        !            45: #include "rf_fifo.h"
        !            46: #include "rf_debugMem.h"
        !            47: #include "rf_general.h"
        !            48: #include "rf_options.h"
        !            49: #include "rf_raid.h"
        !            50: #include "rf_types.h"
        !            51:
        !            52: /* Just malloc a header, zero it (via calloc), and return it. */
        !            53: /*ARGSUSED*/
        !            54: void *
        !            55: rf_FifoCreate(RF_SectorCount_t sectPerDisk, RF_AllocListElem_t *clList,
        !            56:     RF_ShutdownList_t **listp)
        !            57: {
        !            58:        RF_FifoHeader_t *q;
        !            59:
        !            60:        RF_CallocAndAdd(q, 1, sizeof(RF_FifoHeader_t), (RF_FifoHeader_t *),
        !            61:            clList);
        !            62:        q->hq_count = q->lq_count = 0;
        !            63:        return ((void *) q);
        !            64: }
        !            65:
        !            66: void
        !            67: rf_FifoEnqueue(void *q_in, RF_DiskQueueData_t *elem, int priority)
        !            68: {
        !            69:        RF_FifoHeader_t *q = (RF_FifoHeader_t *) q_in;
        !            70:
        !            71:        RF_ASSERT(priority == RF_IO_NORMAL_PRIORITY ||
        !            72:            priority == RF_IO_LOW_PRIORITY);
        !            73:
        !            74:        elem->next = NULL;
        !            75:        if (priority == RF_IO_NORMAL_PRIORITY) {
        !            76:                if (!q->hq_tail) {
        !            77:                        RF_ASSERT(q->hq_count == 0 && q->hq_head == NULL);
        !            78:                        q->hq_head = q->hq_tail = elem;
        !            79:                } else {
        !            80:                        RF_ASSERT(q->hq_count != 0 && q->hq_head != NULL);
        !            81:                        q->hq_tail->next = elem;
        !            82:                        q->hq_tail = elem;
        !            83:                }
        !            84:                q->hq_count++;
        !            85:        } else {
        !            86:                RF_ASSERT(elem->next == NULL);
        !            87:                if (rf_fifoDebug) {
        !            88:                        printf("raid%d: fifo: ENQ lopri\n",
        !            89:                            elem->raidPtr->raidid);
        !            90:                }
        !            91:                if (!q->lq_tail) {
        !            92:                        RF_ASSERT(q->lq_count == 0 && q->lq_head == NULL);
        !            93:                        q->lq_head = q->lq_tail = elem;
        !            94:                } else {
        !            95:                        RF_ASSERT(q->lq_count != 0 && q->lq_head != NULL);
        !            96:                        q->lq_tail->next = elem;
        !            97:                        q->lq_tail = elem;
        !            98:                }
        !            99:                q->lq_count++;
        !           100:        }
        !           101:        if ((q->hq_count + q->lq_count) != elem->queue->queueLength) {
        !           102:                printf("Queue lengths differ ! : %d %d %d\n",
        !           103:                    q->hq_count, q->lq_count, (int) elem->queue->queueLength);
        !           104:                printf("%d %d %d %d\n",
        !           105:                    (int) elem->queue->numOutstanding,
        !           106:                    (int) elem->queue->maxOutstanding,
        !           107:                    (int) elem->queue->row,
        !           108:                    (int) elem->queue->col);
        !           109:        }
        !           110:        RF_ASSERT((q->hq_count + q->lq_count) == elem->queue->queueLength);
        !           111: }
        !           112:
        !           113: RF_DiskQueueData_t *
        !           114: rf_FifoDequeue(void *q_in)
        !           115: {
        !           116:        RF_FifoHeader_t *q = (RF_FifoHeader_t *) q_in;
        !           117:        RF_DiskQueueData_t *nd;
        !           118:
        !           119:        RF_ASSERT(q);
        !           120:        if (q->hq_head) {
        !           121:                RF_ASSERT(q->hq_count != 0 && q->hq_tail != NULL);
        !           122:                nd = q->hq_head;
        !           123:                q->hq_head = q->hq_head->next;
        !           124:                if (!q->hq_head)
        !           125:                        q->hq_tail = NULL;
        !           126:                nd->next = NULL;
        !           127:                q->hq_count--;
        !           128:        } else
        !           129:                if (q->lq_head) {
        !           130:                        RF_ASSERT(q->lq_count != 0 && q->lq_tail != NULL);
        !           131:                        nd = q->lq_head;
        !           132:                        q->lq_head = q->lq_head->next;
        !           133:                        if (!q->lq_head)
        !           134:                                q->lq_tail = NULL;
        !           135:                        nd->next = NULL;
        !           136:                        q->lq_count--;
        !           137:                        if (rf_fifoDebug) {
        !           138:                                printf("raid%d: fifo: DEQ lopri %lx\n",
        !           139:                                    nd->raidPtr->raidid, (long) nd);
        !           140:                        }
        !           141:                } else {
        !           142:                        RF_ASSERT(q->hq_count == 0 && q->lq_count == 0 &&
        !           143:                            q->hq_tail == NULL && q->lq_tail == NULL);
        !           144:                        nd = NULL;
        !           145:                }
        !           146:        return (nd);
        !           147: }
        !           148:
        !           149: /*
        !           150:  * Return ptr to item at head of queue. Used to examine request
        !           151:  * info without actually dequeueing the request.
        !           152:  */
        !           153: RF_DiskQueueData_t *
        !           154: rf_FifoPeek(void *q_in)
        !           155: {
        !           156:        RF_DiskQueueData_t *headElement = NULL;
        !           157:        RF_FifoHeader_t *q = (RF_FifoHeader_t *) q_in;
        !           158:
        !           159:        RF_ASSERT(q);
        !           160:        if (q->hq_head)
        !           161:                headElement = q->hq_head;
        !           162:        else
        !           163:                if (q->lq_head)
        !           164:                        headElement = q->lq_head;
        !           165:        return (headElement);
        !           166: }
        !           167:
        !           168: /*
        !           169:  * We sometimes need to promote a low priority access to a regular priority
        !           170:  * access. Currently, this is only used when the user wants to write a stripe
        !           171:  * that is currently under reconstruction.
        !           172:  * This routine will promote all accesses tagged with the indicated
        !           173:  * parityStripeID from the low priority queue to the end of the normal
        !           174:  * priority queue.
        !           175:  * We assume the queue is locked upon entry.
        !           176:  */
        !           177: int
        !           178: rf_FifoPromote(void *q_in, RF_StripeNum_t parityStripeID,
        !           179:     RF_ReconUnitNum_t which_ru)
        !           180: {
        !           181:        RF_FifoHeader_t *q = (RF_FifoHeader_t *) q_in;
        !           182:        /* lp = lo-pri queue pointer, pt = trailer */
        !           183:        RF_DiskQueueData_t *lp = q->lq_head, *pt = NULL;
        !           184:        int retval = 0;
        !           185:
        !           186:        while (lp) {
        !           187:
        !           188:                /*
        !           189:                 * Search for the indicated parity stripe in the low-pri queue.
        !           190:                 */
        !           191:                if (lp->parityStripeID == parityStripeID &&
        !           192:                    lp->which_ru == which_ru) {
        !           193:                        /* printf("FifoPromote:  promoting access for psid
        !           194:                         * %ld\n", parityStripeID); */
        !           195:                        if (pt)
        !           196:                                /* Delete an entry other than the first. */
        !           197:                                pt->next = lp->next;
        !           198:                        else
        !           199:                                /* Delete the head entry. */
        !           200:                                q->lq_head = lp->next;
        !           201:
        !           202:                        if (!q->lq_head)
        !           203:                                /* We deleted the only entry. */
        !           204:                                q->lq_tail = NULL;
        !           205:                        else
        !           206:                                if (lp == q->lq_tail)
        !           207:                                        /* We deleted the tail entry. */
        !           208:                                        q->lq_tail = pt;
        !           209:
        !           210:                        lp->next = NULL;
        !           211:                        q->lq_count--;
        !           212:
        !           213:                        if (q->hq_tail) {
        !           214:                                q->hq_tail->next = lp;
        !           215:                                q->hq_tail = lp;
        !           216:                        }
        !           217:                         /* Append to hi-priority queue. */
        !           218:                        else {
        !           219:                                q->hq_head = q->hq_tail = lp;
        !           220:                        }
        !           221:                        q->hq_count++;
        !           222:
        !           223:                        /* Deal with this later, if ever. */
        !           224:                        /* UpdateShortestSeekFinishTimeForced(lp->requestPtr,
        !           225:                         * lp->diskState); */
        !           226:
        !           227:                        /* Reset low-pri pointer and continue. */
        !           228:                        lp = (pt) ? pt->next : q->lq_head;
        !           229:                        retval++;
        !           230:
        !           231:                } else {
        !           232:                        pt = lp;
        !           233:                        lp = lp->next;
        !           234:                }
        !           235:        }
        !           236:
        !           237:        /*
        !           238:         * Sanity check. Delete this if you ever put more than one entry in
        !           239:         * the low-pri queue.
        !           240:         */
        !           241:        RF_ASSERT(retval == 0 || retval == 1);
        !           242:        return (retval);
        !           243: }

CVSweb