dcacheCbio.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:89k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* dcacheCbio.c - Disk Cache Driver */
  2. /* Copyright 1999-2002 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01z,03mar02,jkf  SPR#32277, adding dcacheDevEnable and Disable(), orig by chn
  7. 01y,21dec01,chn  SPRs 30130, 22463, 21975 (partial). Disabled defaulting
  8.                  tuneable parameters after they are explicitly set by user.
  9. 01x,12dec01,jkf  fixing diab build warnings.
  10. 01w,09dec01,jkf  SPR#71637, fix for SPR#68387 caused ready changed bugs.
  11. 01v,09nov01,jkf  SPR#71633, dont set errno when DevCreate is called w/BLK_DEV
  12.                  SPR#65431, fixing typo in man page
  13. 01u,29aug01,jkf  SPR#69031, common code for both AE & 5.x.
  14. 01t,01aug01,jyo  Fixed SPR#68387: readyChanged bit is not correctly checked to
  15.                  verify the change in the media, SPR#69411: Change in media's
  16.                  readyChanged bit is not being propogated appropriately to the
  17.                  layers above.
  18. 01s,13jun01,jyo  SPR#67729: Updating blkSubDev, cbioSubDev and isDriver in
  19.                  dcacheDevCreate().
  20. 01r,19apr00,dat  doc fixup
  21. 01q,09mar00,jkf  removed taskUndelay & taskPrioritySet from CBIO_FLUSH
  22.                  now forcing ioctl flushes inline.
  23. 01p,29feb00,jkf  T3 changes
  24. 01o,31aug99,jkf  changes for new CBIO API.
  25. 01n,31jul99,jkf  T2 merge, tidiness & spelling.
  26. 01i,17nov98,lrn  zero-fill blocks allocated with CBIO_CACHE_NEWBLK
  27. 01h,29oct98,lrn  pass along 3rd arg on CBIO_RESET, removed old mod history
  28. 01g,20oct98,lrn  fixed SPR#22553, SPR#22731
  29. 01f,14sep98,lrn  refined error handling, made updTask unconditional
  30. 01e,08sep98,lrn  add hash for speed (SPR#21972), size change (SPR#21975)
  31. 01d,06sep98,lrn  modify to work on top of CBIO (SPR#21974), and use
  32.                  wrapper for block devices b.c.
  33. 01c,30jul98,wlf  partial doc cleanup
  34. 01b,01jul98,lrn  written.
  35. 01a,28jan98,lrn  written, preliminary
  36. */
  37. /*
  38. DESCRIPTION
  39. This module implements a disk cache mechanism via the CBIO API.
  40. This is intended for use by the VxWorks DOS file system, to store
  41. frequently used disk blocks in memory.  The disk cache is unaware 
  42. of the particular file system format on the disk, and handles the
  43. disk as a collection of blocks of a fixed size, typically the sector
  44. size of 512 bytes.  
  45. The disk cache may be used with SCSI, IDE, ATA, Floppy or any other
  46. type of disk controllers.  The underlying device driver may be either
  47. comply with the CBIO API or with the older block device API.  
  48. This library interfaces to device drivers implementing the block 
  49. device API via the basic CBIO BLK_DEV wrapper provided by cbioLib.
  50. Because the disk cache complies with the CBIO programming interface on
  51. both its upper and lower layers, it is both an optional and a stackable
  52. module.   It can be used or omitted depending on resources available and 
  53. performance required.
  54. The disk cache module implements the CBIO API, which is used by the file
  55. system module to access the disk blocks, or to access bytes within a 
  56. particular disk block.  This allows the file system to use the disk cache
  57. to store file data as well as Directory and File Allocation Table blocks, 
  58. on a Most Recently Used basis, thus keeping a controllable subset of these
  59. disk structures in memory.  This results in minimized memory requirements 
  60. for the file system, while avoiding any significant performance degradation.
  61. The size of the disk cache, and thus the memory consumption of the disk
  62. subsystem, is configured at the time of initialization (see 
  63. dcacheDevCreate()), allowing the user to trade-off memory consumption
  64. versus performance.  Additional performance tuning capabilities are
  65. available through dcacheDevTune().
  66. Briefly, here are the main techniques deployed by the disk cache:
  67. .IP
  68. Least Recently Used block re-use policy
  69. .IP
  70. Read-ahead
  71. .IP
  72. Write-behind with sorting and grouping
  73. .IP
  74. Hidden writes
  75. .IP
  76. Disk cache bypass for large requests
  77. .IP
  78. Background disk updating (flushing changes to disk) with an adjustable
  79. update period (ioctl flushes occur without delay.)
  80. .LP
  81. Some of these techniques are discussed in more detail below; others 
  82. are described in varrious professional and academic publications.
  83. DISK CACHE ALGORITHM
  84. The disk cache is composed internally of a number cache blocks, of
  85. the same size as the disk physical block (sector). These cache blocks
  86. are maintained in a list in "Most Recently Used" order, that is, blocks
  87. which are used are moved to the top of this list. When a block needs to
  88. be relinquished, and made available to contain a new disk block, the
  89. Least Recently Used block will be used for this purpose.
  90. In addition to the regular cache blocks, some of the memory allocated
  91. for cache is set aside for a "big buffer", which may range from 1/4 of
  92. the overall cache size up to 64KB.  This buffer is used for:
  93. .IP
  94. Combining cache blocks with adjacent disk block numbers, in order to
  95. write them to disk in groups, and save on latency and overhead 
  96. .IP
  97. Reading ahead a group of blocks, and then converting them to normal
  98. cache blocks.
  99. .LP
  100. Because there is significant overhead involved in accessing the disk
  101. drive, read-ahead improves performance significantly by reading groups
  102. of blocks at once.
  103. TUNABLE PARAMETERS
  104. There are certain operational parameters that control the disk cache
  105. operation which are tunable. A number of
  106. .I preset
  107. parameter sets is provided, dependent on the size of the cache. These
  108. should suffice for most purposes, but under certain types of workload,
  109. it may be desirable to tune these parameters to better suite the
  110. particular workload patterns.
  111. See dcacheDevTune() for description of the tunable parameters. It is
  112. recommended to call dcacheShow() after calling dcacheTune() in order 
  113. to verify that the parameters where set as requested, and to inspect 
  114. the cache statistics which may change dramatically. Note that the hit 
  115. ratio is a principal indicator of cache efficiency, and should be inspected
  116. during such tuning.
  117. BACKGROUND UPDATING
  118. A dedicated task will be created to take care of updating the disk with
  119. blocks that have been modified in cache. The time period between updates
  120. is controlled with the tunable parameter syncInterval. Its priority
  121. should be set above the priority of any CPU-bound tasks so as to assure
  122. it can wake up frequently enough to keep the disk synchronized with the
  123. cache.   There is only one such task for all cache devices configured.  
  124. The task name is tDcacheUpd
  125. The updating task also has the responsibility to invalidate disk cache
  126. blocks for removable devices which have not been used for 2 seconds or more.
  127. There are a few global variables which control the parameters of this
  128. task, namely:
  129. .IP <dcacheUpdTaskPriority>
  130. controls the default priority of the update task, and is set by default to 250.
  131. .IP <dcacheUpdTaskStack>
  132. is used to set the update task stack size.
  133. .IP <dcacheUpdTaskOptions>
  134. controls the task options for the update task.
  135. .LP
  136. All the above global parameters must be set prior to calling
  137. dcacheDevCreate() for the first time, with the exception of
  138. dcacheUpdTaskPriority, which may be modified in run-time, and takes
  139. effect almost immediately. It should be noted that this priority is not
  140. entirely fixed, at times when critical disk operations are performed,
  141. and FIOFLUSH ioctl is called, the caller task will temporarily
  142. .I loan
  143. its priority to the update task, to insure the completion of the flushing
  144. operation.
  145. REMOVABLE DEVICES
  146. For removable devices, disk cache provides these additional features:
  147. .IP "disk updating"
  148. is performed such that modified blocks will be written to disk within
  149. one second, so as to minimize the risk of losing data in case of a
  150. failure or disk removal.
  151. .IP "error handling"
  152. includes a test for disk removal, so that if a disk is removed from the
  153. drive while an I/O operation is in progress, the disk removal event will
  154. be set immediately.
  155. .IP "disk signature"
  156. which is a checksum of the disk's boot block, is maintained by the cache
  157. control structure, and it will be verified against the disk if it was
  158. idle for 2 seconds or more. Hence if during that idle time a disk was
  159. replaced, the change will be detected on the next disk access, and the
  160. condition will be flagged to the file system.
  161. .IP NOTE
  162. It is very important that removable disks should all have a unique
  163. volume label, or volume serial number, which are stored in the disk's
  164. boot sector during formatting. Changing disks which have an identical
  165. boot sector may result in failure to detect the change, resulting in
  166. unpredictable behavior, possible file system corruption.
  167. .LP
  168. CACHE IMPLEMENTATION
  169. Most Recently Used (MRU) disk blocks are stored in a collection of memory
  170. buffers called the disk cache.  The purpose of the disk cache is to reduce 
  171. the number of disk accesses and to accelerate disk read and write operations, 
  172. by means of the following techniques:
  173. .IP
  174. Most Recently Used blocks are stored in RAM, which results in the most
  175. frequently accessed data being retrieved from memory rather than from disk.
  176. .IP
  177. Reading data from disk is performed in large units, relying on the read-ahead
  178. feature, one of the disk cache