History log of /haiku/src/tests/system/kernel/device_manager/dma_resource_test.cpp
Revision Date Author Comments
# 621f42cb 23-Jun-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Fixed build.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37236 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 53cce89b 07-Apr-2009 Ingo Weinhold <ingo_weinhold@gmx.de>

Fixed build. The tests actually reveal a problem in the IORequest
implementation.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29998 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 0316483f 27-Aug-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

* DMAResource::TranslateNext(): Added parameter to limit the maximum
operation length.
* IORequest: Added owner (IORequestOwner). Also added a SetUnfinished()
method, which is invoked by the I/O scheduler after all operations of
the request have been finished, but the request isn't done yet.
* Added debugger commands "io_request_owner" and "io_scheduler" printing
information for a IORequestOwner and IOScheduler object respectively.
* Implemented an actual I/O scheduling algorithm. It's a simple round
robin strategy (a queue per thread) with a unidirectional elevator
serializing the operations. ATM priorities are ignored, the bandwidth
isn't adjusted to the device, and there are TODOs all over the place.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27216 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 025f7c32 24-Aug-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

A DMABuffer doesn't have a fixed bounce buffer assigned anymore. We do
dynamically assign one when needed. Under the assumption that in most
cases a bounce buffer isn't needed, we can thus prepare a lot more
operations.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27185 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 27a11ab8 18-Aug-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

Tests exposing several problems with partial writes shorter than the
vector size, and partial writes of less than one block.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27041 a95241bf-73f2-0310-859d-f6bbb57e9c96


# c3a9fa21 10-Aug-2008 Axel Dörfler <axeld@pinc-software.de>

* Added a kludge to the test environment to be able to support two pages sized
non-contiguous areas.
* Added a test that allowed to reproduce #2595.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26917 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 1bb2ad1e 09-Aug-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

Test case to reproduce bug #2584.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26909 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 730798eb 08-Aug-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

Test case for bug #2586 (more given physical vecs than max segment
count).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26896 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 7f12cc54 30-Jul-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

* It is now supported that I/O operations and requests are only handled
partially (e.g. due to hitting the end of file). The respective
classes have grown new methods and attributes to deal with that. The
"finished" callbacks have got additional parameters to indicate
whether the transfer was only partial and how much has been
transferred. Other callbacks and functions have a size_t* in/out
parameter instead of a simple size_t, now.
* vfs_{read,write}_pages() do now use the I/O request framework instead
of the underlying FS's {read,write}_pages() hooks (those should be
unused now). Furthermore they've got an additional "flags" parameter,
which is passed to IORequest::Init(), i.e. it allows to specify that
the given vecs refer to physical addresses.
* The file cache's read_into_cache() reads directly into physical
pages, now.
* Fixed bug in DoIO::IO(): The offset was not adjusted, so that all
pages were incorrectly transferred from/to the same location.
* Fixed broken subrequest scheduling loop head in
do_iterative_fd_io_iterate().
* Adjusted the test driver and implemented its io() hook. Using this
driver I/O requests are passed all the way from the VFS/VM to the
driver and through the I/O scheduler. It even seems to work. :-)
* Added missing const to the iovec* parameter of the IORequest::Init()
methods.
* Disabled some debug output by default. Added new optional debug
output.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26692 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 9e637dd9 27-Jul-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

Since we don't use the IOScheduler, we have to explicitly tell the
request that the operation is finished.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26653 a95241bf-73f2-0310-859d-f6bbb57e9c96


# c1cec366 25-Jul-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

* Removed B_USER_IO_REQUEST flag. It was superfluous, since whether the
buffer lives in userland can easily be checked via IS_USER_ADDRESS.
* Added B_VIP_IO_REQUEST flag which will be used by the page writer and
should cause allocations to be made in a way that they cannot fail.
Not implemented yet, though.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26632 a95241bf-73f2-0310-859d-f6bbb57e9c96


# d4e27206 23-Jul-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

More debug output.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26608 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 04b04600 24-Jul-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

Trust the compiler to do optimize simple stuff like this. This also
helps to avoid stupid mistakes. The driver works again, though things
are still not stable.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26605 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 91ccfa19 23-Jul-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

Added missing vm_put_physical_page() in do_io().

Something is still fishy though: Opening the dma_resources_test device
in DiskProbe, the wrong data is shown. do_io() seems to be invoked with
the correct physical address, vm_get_physical_page() succeeds, and after
memcpy() the correct data are in the virtual address it returned, but
db in the kernel debugger shows that the data in the physical page have
not been changed. When quitting DiskProbe the "page still has mappings"
assert is triggered for the page.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26602 a95241bf-73f2-0310-859d-f6bbb57e9c96


# feb61033 23-Jul-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

* Maybe I just missed something, but module names not matching the
driver name didn't work here.
* Enabled using the I/O scheduler in the read() and write() hooks.
Something's still broken, though.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26598 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 33f9067b 22-Jul-2008 Axel Dörfler <axeld@pinc-software.de>

* Started using the I/O scheduler -- disabled it for now, though, as it doesn't
really work yet (there are some bits missing in the IORequest and IOScheduler
to able to use them this way).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26565 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 8faff60c 21-Jul-2008 Axel Dörfler <axeld@pinc-software.de>

* Enabled all DMA tests, wrote some more.
* Moved data buffer creation to a TestSuiteContext class.
* Added checks if the I/O operation does the correct thing, ie. reads/writes
the data to the right offset.
* Rearranged DMA translation: we now handle the partial write case correctly
(bounce buffer must always span over the whole block), and are able to join
adjacent bounce buffers together.
* The new _AddBounceBuffer() method also respects boundary and segment size
restrictions for bounce buffers.
* IOOperation now prepares the outgoing vecs/offset/length to contain the
right data for the current phase (partial read begin/end/do-all); it will
also make sure that the lengths of the vecs are of the same size than the
whole request.
* All tests are now passed, the I/O request implementation seems to be ready
for integration now.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26556 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 45a206a7 19-Jul-2008 Axel Dörfler <axeld@pinc-software.de>

axeld + bonefish:
More work on the I/O scheduler, more precisely mainly the DMAResource class:
* When splitting requests into operations, we're now able to flexibly mix
bounce buffer segments and the given physical vectors in a single
operation. This reduces the number of operations.
* Squashed several TODO and fleshed out more of the implementation.
* Added a test driver running unit tests. There are only a few tests yet,
but those pass.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26519 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 621f42cb59c19b6323b4b81bfa4ed3bd2ed0350b 23-Jun-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Fixed build.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37236 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 53cce89bf56aed8327e77d9e74e2814c38a73d9c 07-Apr-2009 Ingo Weinhold <ingo_weinhold@gmx.de>

Fixed build. The tests actually reveal a problem in the IORequest
implementation.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29998 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 0316483f0ade2904583955b57cc396bf060f9027 27-Aug-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

* DMAResource::TranslateNext(): Added parameter to limit the maximum
operation length.
* IORequest: Added owner (IORequestOwner). Also added a SetUnfinished()
method, which is invoked by the I/O scheduler after all operations of
the request have been finished, but the request isn't done yet.
* Added debugger commands "io_request_owner" and "io_scheduler" printing
information for a IORequestOwner and IOScheduler object respectively.
* Implemented an actual I/O scheduling algorithm. It's a simple round
robin strategy (a queue per thread) with a unidirectional elevator
serializing the operations. ATM priorities are ignored, the bandwidth
isn't adjusted to the device, and there are TODOs all over the place.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27216 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 025f7c3289220e25bc02d546d9f3acbcf605ae50 24-Aug-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

A DMABuffer doesn't have a fixed bounce buffer assigned anymore. We do
dynamically assign one when needed. Under the assumption that in most
cases a bounce buffer isn't needed, we can thus prepare a lot more
operations.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27185 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 27a11ab8b055322826ebffab458e7c15126b3e9f 18-Aug-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

Tests exposing several problems with partial writes shorter than the
vector size, and partial writes of less than one block.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27041 a95241bf-73f2-0310-859d-f6bbb57e9c96


# c3a9fa2150bc82df4424aa1a888ba1f2c3ce21e2 10-Aug-2008 Axel Dörfler <axeld@pinc-software.de>

* Added a kludge to the test environment to be able to support two pages sized
non-contiguous areas.
* Added a test that allowed to reproduce #2595.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26917 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 1bb2ad1ed80fa51944ed5ad8c970fb9d899dccb0 09-Aug-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

Test case to reproduce bug #2584.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26909 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 730798eb999c92638144f6fb700e548d66a190e9 08-Aug-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

Test case for bug #2586 (more given physical vecs than max segment
count).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26896 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 7f12cc54a729622cd04940ee9400958413d99b21 30-Jul-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

* It is now supported that I/O operations and requests are only handled
partially (e.g. due to hitting the end of file). The respective
classes have grown new methods and attributes to deal with that. The
"finished" callbacks have got additional parameters to indicate
whether the transfer was only partial and how much has been
transferred. Other callbacks and functions have a size_t* in/out
parameter instead of a simple size_t, now.
* vfs_{read,write}_pages() do now use the I/O request framework instead
of the underlying FS's {read,write}_pages() hooks (those should be
unused now). Furthermore they've got an additional "flags" parameter,
which is passed to IORequest::Init(), i.e. it allows to specify that
the given vecs refer to physical addresses.
* The file cache's read_into_cache() reads directly into physical
pages, now.
* Fixed bug in DoIO::IO(): The offset was not adjusted, so that all
pages were incorrectly transferred from/to the same location.
* Fixed broken subrequest scheduling loop head in
do_iterative_fd_io_iterate().
* Adjusted the test driver and implemented its io() hook. Using this
driver I/O requests are passed all the way from the VFS/VM to the
driver and through the I/O scheduler. It even seems to work. :-)
* Added missing const to the iovec* parameter of the IORequest::Init()
methods.
* Disabled some debug output by default. Added new optional debug
output.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26692 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 9e637dd94b46f97b0f40adec0ff59204ea254831 27-Jul-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

Since we don't use the IOScheduler, we have to explicitly tell the
request that the operation is finished.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26653 a95241bf-73f2-0310-859d-f6bbb57e9c96


# c1cec366af0c45deb5358731ab929675c9d2858e 25-Jul-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

* Removed B_USER_IO_REQUEST flag. It was superfluous, since whether the
buffer lives in userland can easily be checked via IS_USER_ADDRESS.
* Added B_VIP_IO_REQUEST flag which will be used by the page writer and
should cause allocations to be made in a way that they cannot fail.
Not implemented yet, though.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26632 a95241bf-73f2-0310-859d-f6bbb57e9c96


# d4e2720651aa9e8bd15d79e818bb7a3486c17c2d 23-Jul-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

More debug output.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26608 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 04b04600f22b61ee6d11a58d34181907991f2094 24-Jul-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

Trust the compiler to do optimize simple stuff like this. This also
helps to avoid stupid mistakes. The driver works again, though things
are still not stable.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26605 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 91ccfa19a0cce887f39f4bc08e21e1f3f3bbcec1 23-Jul-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

Added missing vm_put_physical_page() in do_io().

Something is still fishy though: Opening the dma_resources_test device
in DiskProbe, the wrong data is shown. do_io() seems to be invoked with
the correct physical address, vm_get_physical_page() succeeds, and after
memcpy() the correct data are in the virtual address it returned, but
db in the kernel debugger shows that the data in the physical page have
not been changed. When quitting DiskProbe the "page still has mappings"
assert is triggered for the page.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26602 a95241bf-73f2-0310-859d-f6bbb57e9c96


# feb6103338a4b2327058270b7ca9cf125d86ef55 23-Jul-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

* Maybe I just missed something, but module names not matching the
driver name didn't work here.
* Enabled using the I/O scheduler in the read() and write() hooks.
Something's still broken, though.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26598 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 33f9067b361312f7067387c8441bf5b596c75190 22-Jul-2008 Axel Dörfler <axeld@pinc-software.de>

* Started using the I/O scheduler -- disabled it for now, though, as it doesn't
really work yet (there are some bits missing in the IORequest and IOScheduler
to able to use them this way).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26565 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 8faff60c7fe72c4dc62b3e823faac1fe244e43d5 21-Jul-2008 Axel Dörfler <axeld@pinc-software.de>

* Enabled all DMA tests, wrote some more.
* Moved data buffer creation to a TestSuiteContext class.
* Added checks if the I/O operation does the correct thing, ie. reads/writes
the data to the right offset.
* Rearranged DMA translation: we now handle the partial write case correctly
(bounce buffer must always span over the whole block), and are able to join
adjacent bounce buffers together.
* The new _AddBounceBuffer() method also respects boundary and segment size
restrictions for bounce buffers.
* IOOperation now prepares the outgoing vecs/offset/length to contain the
right data for the current phase (partial read begin/end/do-all); it will
also make sure that the lengths of the vecs are of the same size than the
whole request.
* All tests are now passed, the I/O request implementation seems to be ready
for integration now.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26556 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 45a206a7420034118693e3bbc8976083e1045e51 19-Jul-2008 Axel Dörfler <axeld@pinc-software.de>

axeld + bonefish:
More work on the I/O scheduler, more precisely mainly the DMAResource class:
* When splitting requests into operations, we're now able to flexibly mix
bounce buffer segments and the given physical vectors in a single
operation. This reduces the number of operations.
* Squashed several TODO and fleshed out more of the implementation.
* Added a test driver running unit tests. There are only a few tests yet,
but those pass.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26519 a95241bf-73f2-0310-859d-f6bbb57e9c96