The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/raidframe/rf_diskqueue.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*      $NetBSD: rf_diskqueue.h,v 1.16 2004/03/04 01:53:25 oster Exp $  */
    2 /*
    3  * Copyright (c) 1995 Carnegie-Mellon University.
    4  * All rights reserved.
    5  *
    6  * Author: Mark Holland
    7  *
    8  * Permission to use, copy, modify and distribute this software and
    9  * its documentation is hereby granted, provided that both the copyright
   10  * notice and this permission notice appear in all copies of the
   11  * software, derivative works or modified versions, and any portions
   12  * thereof, and that both notices appear in supporting documentation.
   13  *
   14  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
   15  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
   16  * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
   17  *
   18  * Carnegie Mellon requests users of this software to return to
   19  *
   20  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
   21  *  School of Computer Science
   22  *  Carnegie Mellon University
   23  *  Pittsburgh PA 15213-3890
   24  *
   25  * any improvements or extensions that they make and grant Carnegie the
   26  * rights to redistribute these changes.
   27  */
   28 
   29 /*****************************************************************************************
   30  *
   31  * rf_diskqueue.h -- header file for disk queues
   32  *
   33  * see comments in rf_diskqueue.c
   34  *
   35  ****************************************************************************************/
   36 
   37 
   38 #ifndef _RF__RF_DISKQUEUE_H_
   39 #define _RF__RF_DISKQUEUE_H_
   40 
   41 #include <sys/queue.h>
   42 
   43 #include <dev/raidframe/raidframevar.h>
   44 
   45 #include "rf_threadstuff.h"
   46 #include "rf_acctrace.h"
   47 #include "rf_alloclist.h"
   48 #include "rf_etimer.h"
   49 #include "rf_netbsd.h"
   50 
   51 
   52 #define RF_IO_NORMAL_PRIORITY 1
   53 #define RF_IO_LOW_PRIORITY    0
   54 
   55 /* the data held by a disk queue entry */
   56 struct RF_DiskQueueData_s {
   57         RF_SectorNum_t sectorOffset;    /* sector offset into the disk */
   58         RF_SectorCount_t numSector;     /* number of sectors to read/write */
   59         RF_IoType_t type;       /* read/write/nop */
   60         caddr_t buf;            /* buffer pointer */
   61         RF_StripeNum_t parityStripeID;  /* the RAID parity stripe ID this
   62                                          * access is for */
   63         RF_ReconUnitNum_t which_ru;     /* which RU within this parity stripe */
   64         int     priority;       /* the priority of this request */
   65         int     (*CompleteFunc) (void *, int);  /* function to be called upon
   66                                                  * completion */
   67         void   *argument;       /* argument to be passed to CompleteFunc */
   68         RF_Raid_t *raidPtr;     /* needed for simulation */
   69         RF_AccTraceEntry_t *tracerec;   /* perf mon only */
   70         RF_Etimer_t qtime;      /* perf mon only - time request is in queue */
   71         RF_DiskQueueData_t *next;
   72         RF_DiskQueueData_t *prev;
   73         RF_DiskQueue_t *queue;  /* the disk queue to which this req is
   74                                  * targeted */
   75         RF_DiskQueueDataFlags_t flags;  /* flags controlling operation */
   76 
   77         struct proc *b_proc;    /* the b_proc from the original bp passed into
   78                                  * the driver for this I/O */
   79         struct buf *bp;         /* a bp to use to get this I/O done */
   80         /* TAILQ bits for a queue for completed I/O requests */
   81         TAILQ_ENTRY(RF_DiskQueueData_s) iodone_entries; 
   82         int  error;             /* Indicate if an error occurred 
   83                                    on this I/O (1=yes, 0=no) */
   84 };
   85 #define RF_LOCK_DISK_QUEUE   0x01
   86 #define RF_UNLOCK_DISK_QUEUE 0x02
   87 
   88 /* note: "Create" returns type-specific queue header pointer cast to (void *) */
   89 struct RF_DiskQueueSW_s {
   90         RF_DiskQueueType_t queueType;
   91         void   *(*Create) (RF_SectorCount_t, RF_AllocListElem_t *, RF_ShutdownList_t **);       /* creation routine --
   92                                                                                                  * one call per queue in
   93                                                                                                  * system */
   94         void    (*Enqueue) (void *, RF_DiskQueueData_t *, int); /* enqueue routine */
   95         RF_DiskQueueData_t *(*Dequeue) (void *);        /* dequeue routine */
   96         RF_DiskQueueData_t *(*Peek) (void *);   /* peek at head of queue */
   97 
   98         /* the rest are optional:  they improve performance, but the driver
   99          * will deal with it if they don't exist */
  100         int     (*Promote) (void *, RF_StripeNum_t, RF_ReconUnitNum_t); /* promotes priority of
  101                                                                          * tagged accesses */
  102 };
  103 
  104 struct RF_DiskQueue_s {
  105         const RF_DiskQueueSW_t *qPtr;   /* access point to queue functions */
  106         void   *qHdr;           /* queue header, of whatever type */
  107         RF_DECLARE_MUTEX(mutex) /* mutex locking data structures */
  108         RF_DECLARE_COND(cond)   /* condition variable for
  109                                  * synchronization */
  110         long    numOutstanding; /* number of I/Os currently outstanding on
  111                                  * disk */
  112         long    maxOutstanding; /* max # of I/Os that can be outstanding on a
  113                                  * disk (in-kernel only) */
  114         int     curPriority;    /* the priority of accs all that are currently
  115                                  * outstanding */
  116         long    queueLength;    /* number of requests in queue */
  117         RF_DiskQueueData_t *nextLockingOp;      /* a locking op that has
  118                                                  * arrived at the head of the
  119                                                  * queue & is waiting for
  120                                                  * drainage */
  121         RF_DiskQueueFlags_t flags;      /* terminate, locked */
  122         RF_Raid_t *raidPtr;     /* associated array */
  123         dev_t   dev;            /* device number for kernel version */
  124         RF_SectorNum_t last_deq_sector; /* last sector number dequeued or
  125                                          * dispatched */
  126         int     col;    /* debug only */
  127         struct raidcinfo *rf_cinfo;     /* disks component info.. */
  128 };
  129 #define RF_DQ_LOCKED  0x02      /* no new accs allowed until queue is
  130                                  * explicitly unlocked */
  131 
  132 /* macros setting & returning information about queues and requests */
  133 #define RF_QUEUE_LOCKED(_q)                 ((_q)->flags & RF_DQ_LOCKED)
  134 #define RF_QUEUE_EMPTY(_q)                  (((_q)->numOutstanding == 0) && ((_q)->nextLockingOp == NULL) && !RF_QUEUE_LOCKED(_q))
  135 #define RF_QUEUE_FULL(_q)                   ((_q)->numOutstanding == (_q)->maxOutstanding)
  136 
  137 #define RF_LOCK_QUEUE(_q)                   (_q)->flags |= RF_DQ_LOCKED
  138 #define RF_UNLOCK_QUEUE(_q)                 (_q)->flags &= ~RF_DQ_LOCKED
  139 
  140 #define RF_LOCK_QUEUE_MUTEX(_q_,_wh_)   RF_LOCK_MUTEX((_q_)->mutex)
  141 #define RF_UNLOCK_QUEUE_MUTEX(_q_,_wh_) RF_UNLOCK_MUTEX((_q_)->mutex)
  142 
  143 #define RF_LOCKING_REQ(_r)                  ((_r)->flags & RF_LOCK_DISK_QUEUE)
  144 #define RF_UNLOCKING_REQ(_r)                ((_r)->flags & RF_UNLOCK_DISK_QUEUE)
  145 
  146 /* whether it is ok to dispatch a regular request */
  147 #define RF_OK_TO_DISPATCH(_q_,_r_) \
  148   (RF_QUEUE_EMPTY(_q_) || \
  149     (!RF_QUEUE_FULL(_q_) && ((_r_)->priority >= (_q_)->curPriority)))
  150 
  151 int rf_ConfigureDiskQueueSystem(RF_ShutdownList_t **);
  152 int rf_ConfigureDiskQueues(RF_ShutdownList_t **, RF_Raid_t *, RF_Config_t *);
  153 void rf_DiskIOEnqueue(RF_DiskQueue_t *, RF_DiskQueueData_t *, int);
  154 void rf_DiskIOComplete(RF_DiskQueue_t *, RF_DiskQueueData_t *, int);
  155 int rf_DiskIOPromote(RF_DiskQueue_t *, RF_StripeNum_t,  RF_ReconUnitNum_t);
  156 RF_DiskQueueData_t *rf_CreateDiskQueueData(RF_IoType_t, RF_SectorNum_t,
  157                                            RF_SectorCount_t , caddr_t,
  158                                            RF_StripeNum_t, RF_ReconUnitNum_t,
  159                                            int (*wakeF) (void *, int),
  160                                            void *, RF_DiskQueueData_t *, 
  161                                            RF_AccTraceEntry_t *, void *,
  162                                            RF_DiskQueueDataFlags_t, 
  163                                            void *);
  164 void rf_FreeDiskQueueData(RF_DiskQueueData_t *);
  165 int rf_ConfigureDiskQueue(RF_Raid_t *, RF_DiskQueue_t *,
  166                           RF_RowCol_t, const RF_DiskQueueSW_t *,
  167                           RF_SectorCount_t, dev_t, int, 
  168                           RF_ShutdownList_t **,
  169                           RF_AllocListElem_t *);
  170 
  171 #endif                          /* !_RF__RF_DISKQUEUE_H_ */

Cache object: 8dee4c8c171201bdc35fc8cefae1cdb1


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.