diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2012-05-31 10:27:29 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2012-06-04 09:54:31 +0200 |
commit | 39ee704e757268de833ffb956dda28f6aa2fa3a1 (patch) | |
tree | 3bfd4e6ebc6dc48d3751ad8445206409720d9abd /cpukit/libblock/include | |
parent | bsps/powerpc: Add load section for .nocache (diff) | |
download | rtems-39ee704e757268de833ffb956dda28f6aa2fa3a1.tar.bz2 |
libblock: Add read-ahead task
Read-ahead requests were previously executed in the context of the
reading task. This blocks the reading task until the complete read
with read-ahead transfer is finished. A read-ahead task is introduced
to off-load the read-ahead transfer. This allows the reading task to
work with the requested block more quickly. The read-ahead is triggered
after two misses of ascending consecutive blocks or a read hit of a
block read by the most-recent read-ahead transfer. The read-ahead
feature is configurable and can be disabled.
Diffstat (limited to 'cpukit/libblock/include')
-rw-r--r-- | cpukit/libblock/include/rtems/bdbuf.h | 26 | ||||
-rw-r--r-- | cpukit/libblock/include/rtems/diskdevs.h | 37 |
2 files changed, 56 insertions, 7 deletions
diff --git a/cpukit/libblock/include/rtems/bdbuf.h b/cpukit/libblock/include/rtems/bdbuf.h index 43a95dfe99..5275c13beb 100644 --- a/cpukit/libblock/include/rtems/bdbuf.h +++ b/cpukit/libblock/include/rtems/bdbuf.h @@ -46,7 +46,7 @@ extern "C" { * @ingroup rtems_libblock * * The Block Device Buffer Management implements a cache between the disk - * devices and file systems. The code provides read ahead and write queuing to + * devices and file systems. The code provides read-ahead and write queuing to * the drivers and fast cache look-up using an AVL tree. * * The block size used by a file system can be set at runtime and must be a @@ -152,10 +152,13 @@ extern "C" { * written. This would be a performance problem. * * The code performs multiple block reads and writes. Multiple block reads or - * read ahead increases performance with hardware that supports it. It also + * read-ahead increases performance with hardware that supports it. It also * helps with a large cache as the disk head movement is reduced. It however * is a speculative operation so excessive use can remove valuable and needed - * blocks from the cache. + * blocks from the cache. The read-ahead is triggered after two misses of + * ascending consecutive blocks or a read hit of a block read by the + * most-resent read-ahead transfer. The read-ahead works per disk, but all + * transfers are issued by the read-ahead task. * * The cache has the following lists of buffers: * - LRU: Accessed or transfered buffers released in least recently used @@ -379,6 +382,8 @@ typedef struct rtems_bdbuf_config { uint32_t buffer_max; /**< Maximum buffer size * supported. It is also the * allocation size. */ + rtems_task_priority read_ahead_priority; /**< Priority of the read-ahead + * task. */ } rtems_bdbuf_config; /** @@ -389,8 +394,8 @@ typedef struct rtems_bdbuf_config { extern const rtems_bdbuf_config rtems_bdbuf_configuration; /** - * The max_read_ahead_blocks value is altered if there are fewer buffers - * than this defined max. This stops thrashing in the cache. + * The default value for the maximum read-ahead blocks disables the read-ahead + * feature. */ #define RTEMS_BDBUF_MAX_READ_AHEAD_BLOCKS_DEFAULT 0 @@ -426,6 +431,12 @@ extern const rtems_bdbuf_config rtems_bdbuf_configuration; RTEMS_BDBUF_SWAPOUT_TASK_PRIORITY_DEFAULT /** + * Default read-ahead task priority. The same as the swap-out task. + */ +#define RTEMS_BDBUF_READ_AHEAD_TASK_PRIORITY_DEFAULT \ + RTEMS_BDBUF_SWAPOUT_TASK_PRIORITY_DEFAULT + +/** * Default task stack size for swap-out and worker tasks. */ #define RTEMS_BDBUF_TASK_STACK_SIZE_DEFAULT RTEMS_MINIMUM_STACK_SIZE @@ -621,7 +632,7 @@ rtems_bdbuf_syncdev (rtems_disk_device *dd); /** * @brief Purges all buffers corresponding to the disk device @a dd. * - * This may result in loss of data. + * This may result in loss of data. The read-ahead state of this device is reset. * * Before you can use this function, the rtems_bdbuf_init() routine must be * called at least once to initialize the cache, otherwise a fatal error will @@ -635,7 +646,8 @@ rtems_bdbuf_purge_dev (rtems_disk_device *dd); /** * @brief Sets the block size of a disk device. * - * This will set the block size derived fields of the disk device. + * This will set the block size derived fields of the disk device. The + * read-ahead state of this device is reset. * * Before you can use this function, the rtems_bdbuf_init() routine must be * called at least once to initialize the cache, otherwise a fatal error will diff --git a/cpukit/libblock/include/rtems/diskdevs.h b/cpukit/libblock/include/rtems/diskdevs.h index fe931f8a94..0b194096a5 100644 --- a/cpukit/libblock/include/rtems/diskdevs.h +++ b/cpukit/libblock/include/rtems/diskdevs.h @@ -16,6 +16,7 @@ #include <rtems.h> #include <rtems/libio.h> +#include <rtems/chain.h> #include <stdlib.h> #ifdef __cplusplus @@ -55,6 +56,37 @@ typedef int (*rtems_block_device_ioctl)( ); /** + * @brief Trigger value to disable further read-ahead requests. + */ +#define RTEMS_DISK_READ_AHEAD_NO_TRIGGER ((rtems_blkdev_bnum) -1) + +/** + * @brief Read-ahead control. + */ +typedef struct { + /** + * @brief Chain node for the read-ahead request queue of the read-ahead task. + */ + rtems_chain_node node; + + /** + * @brief Block value to trigger the read-ahead request. + * + * A value of @ref RTEMS_DISK_READ_AHEAD_NO_TRIGGER will disable further + * read-ahead requests since no valid block can have this value. + */ + rtems_blkdev_bnum trigger; + + /** + * @brief Start block for the next read-ahead request. + * + * In case the trigger value is out of range of valid blocks, this value my + * be arbitrary. + */ + rtems_blkdev_bnum next; +} rtems_disk_read_ahread; + +/** * @brief Description of a disk device (logical and physical disks). * * An array of pointer tables to rtems_disk_device structures is maintained. @@ -168,6 +200,11 @@ struct rtems_disk_device { * releases this disk. */ bool deleted; + + /** + * @brief Read-ahead control for this disk. + */ + rtems_disk_read_ahread read_ahead; }; /** |