From 6a03786d94e4fa1370b57297b62c0560983b3f8c Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Mon, 2 Jul 2012 15:08:24 +0200 Subject: libtests/block06: Increase stack size --- testsuites/libtests/block06/init.c | 2 ++ 1 file changed, 2 insertions(+) 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 -- cgit v1.2.3 From 828f9462bef22e2ef5514cd007c2e0217eff21f1 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Thu, 28 Jun 2012 11:02:48 +0200 Subject: libblock: Remove unused field --- cpukit/libblock/src/bdbuf.c | 1 - 1 file changed, 1 deletion(-) diff --git a/cpukit/libblock/src/bdbuf.c b/cpukit/libblock/src/bdbuf.c index 81c8b81fb8..0b84260bf0 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; /** -- cgit v1.2.3 From f12249ff059074b265ed80eb3ea097d0afa576b7 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Mon, 2 Jul 2012 15:08:08 +0200 Subject: libblock: Fix continuous blocks write request --- cpukit/libblock/src/bdbuf.c | 19 ++-- testsuites/libtests/Makefile.am | 1 + testsuites/libtests/block15/Makefile.am | 19 ++++ testsuites/libtests/block15/block15.doc | 12 +++ testsuites/libtests/block15/block15.scn | 14 +++ testsuites/libtests/block15/init.c | 183 ++++++++++++++++++++++++++++++++ testsuites/libtests/configure.ac | 1 + 7 files changed, 236 insertions(+), 13 deletions(-) create mode 100644 testsuites/libtests/block15/Makefile.am create mode 100644 testsuites/libtests/block15/block15.doc create mode 100644 testsuites/libtests/block15/block15.scn create mode 100644 testsuites/libtests/block15/init.c diff --git a/cpukit/libblock/src/bdbuf.c b/cpukit/libblock/src/bdbuf.c index 0b84260bf0..034e5a8406 100644 --- a/cpukit/libblock/src/bdbuf.c +++ b/cpukit/libblock/src/bdbuf.c @@ -2296,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 @@ -2333,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; 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/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 + * + * + * 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 +#include +#include + +#include +#include + +#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 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 -- cgit v1.2.3 From f29d969a72622c8d30eba7bae9a37d128fe9b5a4 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Mon, 2 Jul 2012 16:06:10 +0200 Subject: libblock: Fix read-ahead trigger and next update --- cpukit/libblock/src/bdbuf.c | 4 +- testsuites/libtests/block13/block13.scn | 12 ++--- testsuites/libtests/block13/init.c | 80 ++++++++++++++++++--------------- 3 files changed, 54 insertions(+), 42 deletions(-) diff --git a/cpukit/libblock/src/bdbuf.c b/cpukit/libblock/src/bdbuf.c index 034e5a8406..77d8555c05 100644 --- a/cpukit/libblock/src/bdbuf.c +++ b/cpukit/libblock/src/bdbuf.c @@ -3027,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/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 #include -#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 -- cgit v1.2.3