summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2012-07-02 16:17:48 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2012-07-02 16:17:48 +0200
commit1fb0e2d8d1ae019aa9a1f80f892305b185a72e7f (patch)
tree88f78b7e7b097a1a164d51555c601eba847d71af
parentMerge branch 'upstream' (diff)
parentlibblock: Fix read-ahead trigger and next update (diff)
downloadrtems-1fb0e2d8d1ae019aa9a1f80f892305b185a72e7f.tar.bz2
Merge branch 'upstream'
-rw-r--r--cpukit/libblock/src/bdbuf.c24
-rw-r--r--testsuites/libtests/Makefile.am1
-rw-r--r--testsuites/libtests/block06/init.c2
-rw-r--r--testsuites/libtests/block13/block13.scn12
-rw-r--r--testsuites/libtests/block13/init.c80
-rw-r--r--testsuites/libtests/block15/Makefile.am19
-rw-r--r--testsuites/libtests/block15/block15.doc12
-rw-r--r--testsuites/libtests/block15/block15.scn14
-rw-r--r--testsuites/libtests/block15/init.c183
-rw-r--r--testsuites/libtests/configure.ac1
10 files changed, 292 insertions, 56 deletions
diff --git a/cpukit/libblock/src/bdbuf.c b/cpukit/libblock/src/bdbuf.c
index 81c8b81fb8..77d8555c05 100644
--- a/cpukit/libblock/src/bdbuf.c
+++ b/cpukit/libblock/src/bdbuf.c
@@ -61,7 +61,6 @@ typedef struct rtems_bdbuf_swapout_transfer
rtems_disk_device *dd; /**< The device the transfer is for. */
bool syncing; /**< The data is a sync'ing. */
rtems_blkdev_request* write_req; /**< The write request array. */
- uint32_t bufs_per_bd; /**< Number of buffers per bd. */
} rtems_bdbuf_swapout_transfer;
/**
@@ -2297,15 +2296,10 @@ rtems_bdbuf_swapout_write (rtems_bdbuf_swapout_transfer* transfer)
*/
uint32_t last_block = 0;
- /*
- * Number of buffers per bd. This is used to detect the next
- * block.
- */
- uint32_t bufs_per_bd = 0;
-
rtems_disk_device *dd = transfer->dd;
-
- bufs_per_bd = dd->block_size / bdbuf_config.buffer_min;
+ uint32_t media_blocks_per_block = dd->media_blocks_per_block;
+ bool need_continuous_blocks =
+ (dd->phys_dev->capabilities & RTEMS_BLKDEV_CAP_MULTISECTOR_CONT) != 0;
/*
* Take as many buffers as configured and pass to the driver. Note, the
@@ -2334,12 +2328,10 @@ rtems_bdbuf_swapout_write (rtems_bdbuf_swapout_transfer* transfer)
if (rtems_bdbuf_tracer)
printf ("bdbuf:swapout write: bd:%" PRIu32 ", bufnum:%" PRIu32 " mode:%s\n",
bd->block, transfer->write_req->bufnum,
- dd->phys_dev->capabilities &
- RTEMS_BLKDEV_CAP_MULTISECTOR_CONT ? "MULIT" : "SCAT");
+ need_continuous_blocks ? "MULTI" : "SCAT");
- if ((dd->phys_dev->capabilities & RTEMS_BLKDEV_CAP_MULTISECTOR_CONT) &&
- transfer->write_req->bufnum &&
- (bd->block != (last_block + bufs_per_bd)))
+ if (need_continuous_blocks && transfer->write_req->bufnum &&
+ bd->block != last_block + media_blocks_per_block)
{
rtems_chain_prepend_unprotected (&transfer->bds, &bd->link);
write = true;
@@ -3035,8 +3027,8 @@ rtems_bdbuf_read_ahead_task (rtems_task_argument arg)
if (transfer_count >= max_transfer_count)
{
transfer_count = max_transfer_count;
- dd->read_ahead.trigger += max_transfer_count / 2 + 1;
- dd->read_ahead.next += max_transfer_count;
+ dd->read_ahead.trigger = block + (transfer_count + 1) / 2;
+ dd->read_ahead.next = block + transfer_count;
}
else
{
diff --git a/testsuites/libtests/Makefile.am b/testsuites/libtests/Makefile.am
index 6a0d20f50d..3710ad885e 100644
--- a/testsuites/libtests/Makefile.am
+++ b/testsuites/libtests/Makefile.am
@@ -1,6 +1,7 @@
ACLOCAL_AMFLAGS = -I ../aclocal
SUBDIRS = POSIX
+SUBDIRS += block15
SUBDIRS += block14
SUBDIRS += block13
SUBDIRS += rbheap01
diff --git a/testsuites/libtests/block06/init.c b/testsuites/libtests/block06/init.c
index 90097ead47..e007a5e49e 100644
--- a/testsuites/libtests/block06/init.c
+++ b/testsuites/libtests/block06/init.c
@@ -1844,6 +1844,8 @@ static rtems_task Init(rtems_task_argument argument)
#define CONFIGURE_USE_IMFS_AS_BASE_FILESYSTEM
+#define CONFIGURE_BDBUF_TASK_STACK_SIZE BDBUF_TEST_STACK_SIZE
+
#define CONFIGURE_MAXIMUM_TASKS (1 + BDBUF_TEST_TASKS)
#define CONFIGURE_MAXIMUM_DRIVERS 3
#define CONFIGURE_MAXIMUM_SEMAPHORES 2
diff --git a/testsuites/libtests/block13/block13.scn b/testsuites/libtests/block13/block13.scn
index 8cce71806d..d929eb043c 100644
--- a/testsuites/libtests/block13/block13.scn
+++ b/testsuites/libtests/block13/block13.scn
@@ -1,11 +1,13 @@
*** TEST BLOCK 13 ***
-0 2 3 4 5 6 7 8
+0 2 3 4 5 6 7 8 9 10
reset
-8
+10
+reset
+9
reset
-7
+8
reset
-6 7
+7 8
reset
-5 6 8
+6 7 10
*** END OF TEST BLOCK 13 ***
diff --git a/testsuites/libtests/block13/init.c b/testsuites/libtests/block13/init.c
index fa8ebc0f0d..cd62e8b36e 100644
--- a/testsuites/libtests/block13/init.c
+++ b/testsuites/libtests/block13/init.c
@@ -24,47 +24,53 @@
#include <rtems/blkdev.h>
#include <rtems/bdbuf.h>
-#define BLOCK_COUNT 9
-#define READ_COUNT 19
+#define BLOCK_COUNT 11
+#define READ_COUNT 23
static int block_access_counts [BLOCK_COUNT];
#define RESET_CACHE (-1)
static const int action_sequence [READ_COUNT] = {
- 0, 2, 3, 4, 5, 6, 7, 8,
+ 0, 2, 3, 4, 5, 6, 7, 8, 9, 10,
RESET_CACHE,
- 8,
+ 10,
RESET_CACHE,
- 7,
+ 9,
RESET_CACHE,
- 6, 7,
+ 8,
RESET_CACHE,
- 5, 6, 8
+ 7, 8,
+ RESET_CACHE,
+ 6, 7, 10
};
-#define UNUSED_LINE { 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+#define UNUSED_LINE { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
static const int expected_block_access_counts [READ_COUNT] [BLOCK_COUNT] = {
- { 1, 0, 0, 0, 0, 0, 0, 0, 0 },
- { 1, 0, 1, 0, 0, 0, 0, 0, 0 },
- { 1, 0, 1, 1, 1, 1, 0, 0, 0 },
- { 1, 0, 1, 1, 1, 1, 0, 0, 0 },
- { 1, 0, 1, 1, 1, 1, 1, 1, 0 },
- { 1, 0, 1, 1, 1, 1, 1, 1, 0 },
- { 1, 0, 1, 1, 1, 1, 1, 1, 1 },
- { 1, 0, 1, 1, 1, 1, 1, 1, 1 },
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0 },
+ { 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0 },
+ { 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0 },
+ { 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 },
+ { 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 },
+ { 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 },
+ { 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
+ { 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
+ UNUSED_LINE,
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
UNUSED_LINE,
- { 0, 0, 0, 0, 0, 0, 0, 0, 1 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 },
UNUSED_LINE,
- { 0, 0, 0, 0, 0, 0, 0, 1, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 },
UNUSED_LINE,
- { 0, 0, 0, 0, 0, 0, 1, 0, 0 },
- { 0, 0, 0, 0, 0, 0, 1, 1, 1 },
+ { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1 },
UNUSED_LINE,
- { 0, 0, 0, 0, 0, 1, 0, 0, 0 },
- { 0, 0, 0, 0, 0, 1, 1, 1, 1 },
- { 0, 0, 0, 0, 0, 1, 1, 1, 1 }
+ { 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1 },
+ { 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1 }
};
#define NO_TRIGGER RTEMS_DISK_READ_AHEAD_NO_TRIGGER
@@ -72,29 +78,33 @@ static const int expected_block_access_counts [READ_COUNT] [BLOCK_COUNT] = {
#define TRIGGER_AFTER_RESET RTEMS_DISK_READ_AHEAD_NO_TRIGGER
static const rtems_blkdev_bnum trigger [READ_COUNT] = {
- 1, 3, 5, 5, 7, 7, NO_TRIGGER, NO_TRIGGER,
+ 1, 3, 6, 6, 6, 9, 9, 9, NO_TRIGGER, NO_TRIGGER,
TRIGGER_AFTER_RESET,
- 9,
+ 11,
TRIGGER_AFTER_RESET,
- 8,
+ 10,
+ TRIGGER_AFTER_RESET,
+ 9,
TRIGGER_AFTER_RESET,
- 7, NO_TRIGGER,
+ 8, NO_TRIGGER,
TRIGGER_AFTER_RESET,
- 6, 8, NO_TRIGGER
+ 7, 10, NO_TRIGGER
};
#define NOT_CHANGED_BY_RESET(i) (i)
static const rtems_blkdev_bnum next [READ_COUNT] = {
- 2, 4, 6, 6, 8, 8, 8, 8,
- NOT_CHANGED_BY_RESET(8),
+ 2, 4, 7, 7, 7, 10, 10, 10, 10, 10,
+ NOT_CHANGED_BY_RESET(10),
+ 12,
+ NOT_CHANGED_BY_RESET(12),
+ 11,
+ NOT_CHANGED_BY_RESET(11),
10,
NOT_CHANGED_BY_RESET(10),
- 9,
+ 9, 9,
NOT_CHANGED_BY_RESET(9),
- 8, 8,
- NOT_CHANGED_BY_RESET(8),
- 7, 9, 9
+ 8, 11, 11
};
static int test_disk_ioctl(rtems_disk_device *dd, uint32_t req, void *arg)
@@ -215,7 +225,7 @@ static void Init(rtems_task_argument arg)
#define CONFIGURE_BDBUF_BUFFER_MIN_SIZE 1
#define CONFIGURE_BDBUF_BUFFER_MAX_SIZE 1
#define CONFIGURE_BDBUF_CACHE_MEMORY_SIZE BLOCK_COUNT
-#define CONFIGURE_BDBUF_MAX_READ_AHEAD_BLOCKS 2
+#define CONFIGURE_BDBUF_MAX_READ_AHEAD_BLOCKS 3
#define CONFIGURE_BDBUF_READ_AHEAD_TASK_PRIORITY 1
#define CONFIGURE_USE_IMFS_AS_BASE_FILESYSTEM
diff --git a/testsuites/libtests/block15/Makefile.am b/testsuites/libtests/block15/Makefile.am
new file mode 100644
index 0000000000..1acef6ea77
--- /dev/null
+++ b/testsuites/libtests/block15/Makefile.am
@@ -0,0 +1,19 @@
+rtems_tests_PROGRAMS = block15
+block15_SOURCES = init.c
+
+dist_rtems_tests_DATA = block15.scn block15.doc
+
+include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg
+include $(top_srcdir)/../automake/compile.am
+include $(top_srcdir)/../automake/leaf.am
+
+AM_CPPFLAGS += -I$(top_srcdir)/../support/include
+
+LINK_OBJS = $(block15_OBJECTS)
+LINK_LIBS = $(block15_LDLIBS)
+
+block15$(EXEEXT): $(block15_OBJECTS) $(block15_DEPENDENCIES)
+ @rm -f block15$(EXEEXT)
+ $(make-exe)
+
+include $(top_srcdir)/../automake/local.am
diff --git a/testsuites/libtests/block15/block15.doc b/testsuites/libtests/block15/block15.doc
new file mode 100644
index 0000000000..ea4b879f1c
--- /dev/null
+++ b/testsuites/libtests/block15/block15.doc
@@ -0,0 +1,12 @@
+This file describes the directives and concepts tested by this test set.
+
+test set name: block15
+
+directives:
+
+ TBD
+
+concepts:
+
+ - Ensure that write requests are continuous and do not exceed the maximum
+ write transfer block count
diff --git a/testsuites/libtests/block15/block15.scn b/testsuites/libtests/block15/block15.scn
new file mode 100644
index 0000000000..9888e5bca0
--- /dev/null
+++ b/testsuites/libtests/block15/block15.scn
@@ -0,0 +1,14 @@
+*** TEST BLOCK 15 ***
+REQ 3
+W 0
+W 2
+W 4
+REQ 3
+W 8
+W 10
+W 12
+REQ 1
+W 14
+REQ 1
+W 18
+*** END OF TEST BLOCK 15 ***
diff --git a/testsuites/libtests/block15/init.c b/testsuites/libtests/block15/init.c
new file mode 100644
index 0000000000..3cefd6c0d8
--- /dev/null
+++ b/testsuites/libtests/block15/init.c
@@ -0,0 +1,183 @@
+/*
+ * Copyright (c) 2012 embedded brains GmbH. All rights reserved.
+ *
+ * embedded brains GmbH
+ * Obere Lagerstr. 30
+ * 82178 Puchheim
+ * Germany
+ * <rtems@embedded-brains.de>
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ */
+
+#ifdef HAVE_CONFIG_H
+ #include "config.h"
+#endif
+
+#include "tmacros.h"
+
+#include <errno.h>
+#include <stdio.h>
+#include <inttypes.h>
+
+#include <rtems/blkdev.h>
+#include <rtems/bdbuf.h>
+
+#define BLOCK_COUNT 20
+
+#define ACTION_COUNT 8
+
+#define REQUEST_COUNT 4
+
+#define WRITE_COUNT 16
+
+#define MAX_WRITE_BLOCKS 3
+
+#define MEDIA_BLOCK_SIZE 2
+
+#define BLOCK_SIZE 4
+
+static const rtems_blkdev_bnum action_sequence [ACTION_COUNT] = {
+ 2, 1, 0, 4, 5, 6, 7, 9
+};
+
+static size_t request_index;
+
+static const uint32_t expected_request_bufnums [REQUEST_COUNT] = {
+ 3, 3, 1, 1
+};
+
+static size_t write_index;
+
+static const rtems_blkdev_bnum expected_write_blocks [WRITE_COUNT] = {
+ 0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 14, 15, 18, 19
+};
+
+static int test_disk_ioctl(rtems_disk_device *dd, uint32_t req, void *arg)
+{
+ int rv = 0;
+
+ if (req == RTEMS_BLKIO_REQUEST) {
+ rtems_blkdev_request *breq = arg;
+ uint32_t i;
+
+ printf("REQ %" PRIu32 "\n", breq->bufnum);
+
+ rtems_test_assert(breq->req == RTEMS_BLKDEV_REQ_WRITE);
+ rtems_test_assert(breq->bufnum == expected_request_bufnums [request_index]);
+ ++request_index;
+
+ for (i = 0; i < breq->bufnum; ++i) {
+ rtems_blkdev_sg_buffer *sg = &breq->bufs [i];
+ rtems_blkdev_bnum j;
+
+ printf("W %" PRIu32 "\n", sg->block);
+
+ rtems_test_assert(sg->block < BLOCK_COUNT);
+ rtems_test_assert(sg->length == BLOCK_SIZE);
+
+ for (j = 0; j < BLOCK_SIZE / MEDIA_BLOCK_SIZE; ++j) {
+ rtems_test_assert(expected_write_blocks [write_index] == sg->block + j);
+ ++write_index;
+ }
+ }
+
+ (*breq->req_done)(breq->done_arg, RTEMS_SUCCESSFUL);
+ } else if (req == RTEMS_BLKIO_CAPABILITIES) {
+ *(uint32_t *) arg = RTEMS_BLKDEV_CAP_MULTISECTOR_CONT;
+ } else {
+ errno = EINVAL;
+ rv = -1;
+ }
+
+ return rv;
+}
+
+static void test_write_requests(rtems_disk_device *dd)
+{
+ rtems_status_code sc;
+ int i;
+
+ sc = rtems_bdbuf_set_block_size(dd, BLOCK_SIZE);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+ for (i = 0; i < ACTION_COUNT; ++i) {
+ rtems_blkdev_bnum block = action_sequence [i];
+ rtems_bdbuf_buffer *bd;
+
+ sc = rtems_bdbuf_get(dd, block, &bd);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+ sc = rtems_bdbuf_release_modified(bd);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+ }
+
+ sc = rtems_bdbuf_syncdev(dd);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+ rtems_test_assert(request_index == REQUEST_COUNT);
+ rtems_test_assert(write_index == WRITE_COUNT);
+}
+
+static void test(void)
+{
+ rtems_status_code sc;
+ dev_t dev = 0;
+ rtems_disk_device *dd;
+
+ sc = rtems_disk_io_initialize();
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+ sc = rtems_disk_create_phys(
+ dev,
+ MEDIA_BLOCK_SIZE,
+ BLOCK_COUNT,
+ test_disk_ioctl,
+ NULL,
+ NULL
+ );
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+ dd = rtems_disk_obtain(dev);
+ rtems_test_assert(dd != NULL);
+
+ test_write_requests(dd);
+
+ sc = rtems_disk_release(dd);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+ sc = rtems_disk_delete(dev);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+}
+
+static void Init(rtems_task_argument arg)
+{
+ puts("\n\n*** TEST BLOCK 15 ***");
+
+ test();
+
+ puts("*** END OF TEST BLOCK 15 ***");
+
+ rtems_test_exit(0);
+}
+
+#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
+#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_APPLICATION_NEEDS_LIBBLOCK
+
+#define CONFIGURE_BDBUF_BUFFER_MIN_SIZE 1
+#define CONFIGURE_BDBUF_BUFFER_MAX_SIZE 4
+#define CONFIGURE_BDBUF_CACHE_MEMORY_SIZE (BLOCK_COUNT * BLOCK_SIZE)
+#define CONFIGURE_BDBUF_MAX_WRITE_BLOCKS MAX_WRITE_BLOCKS
+
+#define CONFIGURE_USE_IMFS_AS_BASE_FILESYSTEM
+
+#define CONFIGURE_MAXIMUM_TASKS 1
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#define CONFIGURE_INIT
+
+#include <rtems/confdefs.h>
diff --git a/testsuites/libtests/configure.ac b/testsuites/libtests/configure.ac
index f383ac17a4..b58c4a80df 100644
--- a/testsuites/libtests/configure.ac
+++ b/testsuites/libtests/configure.ac
@@ -41,6 +41,7 @@ AM_CONDITIONAL(NETTESTS,test "$rtems_cv_RTEMS_NETWORKING" = "yes")
# Explicitly list all Makefiles here
AC_CONFIG_FILES([Makefile
+block15/Makefile
block14/Makefile
block13/Makefile
rbheap01/Makefile