#
be808057 |
|
27-Apr-2023 |
Augustin Cavalier <waddlesplash@gmail.com> |
IORequest: Refactor IOOperation transferred-bytes and status accounting. Until the introduction of the nvme_disk driver, these classes were mostly only used directly by the IO scheduler, and then a few direct usages of IOOperation itself in the individual disk drivers; so API confusions were easily missed. When writing the nvme_disk driver's IORequest support, however, it became readily apparent that there were some pretty bad confusions around transferred-bytes accounting in IOOperation. This commit attempts to resolve all of those. There are two basic changes here: 1. Move transferred-bytes accounting into IOOperation::SetStatus. The "TransferredBytes" field of IOOperation is against the *original* range, not the actual operation's range (which will be wider, due to bouncing, etc.), and furthermore only applies to the actual content of the request (and not e.g. to a read half of a bounced write.) These two facts meant that determining what value to pass to SetTransferredBytes was not trivial, and was easy to get wrong. I recall messing that up when working on nvme_disk multiple times before reading the API carefully. 2. Do not pass redundant values to IORequest::OperationFinished. All of the values here can be derived (albeit indirectly) from the IOOperation, and all consumers of this API basically did just that. Rather than make them do it, make the IORequest take care of computing all of those values itself. Change-Id: Ic9ae29e1100319e5b7647647c4db7e5aad4d125e
|
#
c1c239fe |
|
27-Apr-2020 |
Augustin Cavalier <waddlesplash@gmail.com> |
kernel: Add mechanism in IOBuffer & IORequest to clamp the last iovec. This is needed by CreateSubRequest, which creates a sub-request using some subset of the passed IO vectors. In the case that the last vector will not be fully used, we need to clamp its size in the sub-request to the remaining length. do_iterative_fd_io, used by vfs_read_pages (which is in turn used by the file cache) used this to split up requests into their constituent block-run requests. So, previously, the invalid IO requests created by this could, under one possible interpretation, overwrite valid file data and cause disk corruption. It is slightly unfortunate that generic_size_t has no unsigned equivalent, so we are left with 0 as the magic number here, instead of -1. However, the passed "length" remains unchanged, so any callers that pass the wrong value for lastVecSize will be trapped by the assert added in the previous commit Fixes #15912 (the assert added in the previous commit), and potentially disk corruption caused by this.
|
#
30c9d3c0 |
|
01-Dec-2017 |
Augustin Cavalier <waddlesplash@gmail.com> |
kernel: Correct class/struct mixups. Almost certainly harmless. Spotted by Clang.
|
#
c63b3de6 |
|
11-Nov-2013 |
Ingo Weinhold <ingo_weinhold@gmx.de> |
IORequest: Add ClearData()
|
#
4535495d |
|
10-Jan-2011 |
Ingo Weinhold <ingo_weinhold@gmx.de> |
Merged the signals branch into trunk, with these changes: * The team and thread kernel structures have been renamed to Team and Thread respectively and moved into the new BKernel namespace. * Several (kernel add-on) sources have been converted from C to C++ since private kernel headers are included that are no longer C compatible. Changes after merging: * Fixed gcc 2 build (warnings mainly in the scary firewire bus manager). git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@40196 a95241bf-73f2-0310-859d-f6bbb57e9c96
|
#
14a322f3 |
|
14-Jun-2010 |
Ingo Weinhold <ingo_weinhold@gmx.de> |
IORequest::_Copy*(): Resolved TODO: Don't cast the generic_addr_t to void* anymore as that truncates physical addresses when PAE is enabled. Now, if a 4 GB physical address limit is forced in DMAResource, the system continues to work fine when the physical memory > 4 GB is used. Otherwise it hangs or crashes. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37134 a95241bf-73f2-0310-859d-f6bbb57e9c96
|
#
435c43f5 |
|
02-Jun-2010 |
Ingo Weinhold <ingo_weinhold@gmx.de> |
* Introduced type generic_io_vec, which is similar to iovec, but uses types that are wide enough for both virtual and physical addresses. * DMABuffer, IORequest, IOScheduler,... and code using them: Use generic_io_vec and generic_{addr,size}_t where necessary. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36997 a95241bf-73f2-0310-859d-f6bbb57e9c96
|
#
deee8524 |
|
26-Jan-2010 |
Ingo Weinhold <ingo_weinhold@gmx.de> |
* Introduced {malloc,memalign,free}_etc() which take an additional "flags" argument. They replace the previous special-purpose allocation functions (malloc_nogrow(), vip_io_request_malloc()). * Moved the I/O VIP heap to heap.cpp accordingly. * Added quite a bit of passing around of allocation flags in the VM, particularly in the VM*AddressSpace classes. * Fixed IOBuffer::GetNextVirtualVec(): It was ignoring the VIP flag and always allocated on the normal heap. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35316 a95241bf-73f2-0310-859d-f6bbb57e9c96
|
#
2f7eb9b5 |
|
13-Dec-2009 |
Ingo Weinhold <ingo_weinhold@gmx.de> |
Fixed a stupid race condition between IORequest finishing and IORequest::Wait(). Wait() immediately returned when IsFinished() returned true, but this is the case as soon as the last IOOperation has finished. The I/O scheduler is not done with the request at this point, though, since it will still be sitting in at least one of three doubly linked lists. Since the usual procedure to issue synchronous I/O requests is to create an IORequest on the stack, pass it to the I/O scheduler, and Wait() on it, Wait() returning early might cause the IORequest object to be destroyed while it is still in use, leading to invalid memory access in the I/O scheduler, corruption of its list structures, as well as later corruption of the issuing thread's stack. Related tickets: * #4431: The request issuing thread returned and already deleted the area the request was writing to before NotifyFinished() was called. * #3048, #4883: Caused by the on stack IORequest being overwritten with other data while being handled by the I/O scheduler thread. * #4517: Hard to say, but I've seen a such a problem too, after a thread scheduling related change. An explanation would be a list structure corruption in the I/O scheduler causing an infinite loop with disabled interrupts. * #2845, #3428, #3429: The block notifier/writer is I/O heavy and as such quite likely to run into the stack corruption issue. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34655 a95241bf-73f2-0310-859d-f6bbb57e9c96
|
#
32e2b6a1 |
|
11-Oct-2009 |
Michael Lotz <mmlr@mlotz.ch> |
Provide a way to directly request virtual vecs from an IOBuffer. If the buffer is virtual already it just returns the vecs directly, if it is physical it takes over the task of virtualizing the vecs either using vm_map_physical_memory_vecs, if there are multiple vecs or more than one page, or falls back to page wise mapping if mapping fails or is not needed. In the best case, scattered physical pages are mapped into one linear virtual buffer so that subsystems operating on virtual memory only get a single vector and can then burst read/write. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@33524 a95241bf-73f2-0310-859d-f6bbb57e9c96
|
#
c3941400 |
|
04-Sep-2009 |
Michael Lotz <mmlr@mlotz.ch> |
Give an IORequest user the possibility to suppress child finish notifications. This allows for synchronous uses where subrequests are forked off and waited on. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@32936 a95241bf-73f2-0310-859d-f6bbb57e9c96
|
#
aa4ba93e |
|
08-Mar-2009 |
Ingo Weinhold <ingo_weinhold@gmx.de> |
* Renamed src/system/kernel/device_manager/io_requests.{h,cpp} to IORequest.{h,cpp}. * Introduced public <io_requests.h> header. Currently it only declares the single function BFS uses. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29446 a95241bf-73f2-0310-859d-f6bbb57e9c96
|
#
c63b3de66577d284d5781262ad499347affa4031 |
|
11-Nov-2013 |
Ingo Weinhold <ingo_weinhold@gmx.de> |
IORequest: Add ClearData()
|
#
4535495d80c86e19e2610e7444a4fcefe3e0f8e6 |
|
10-Jan-2011 |
Ingo Weinhold <ingo_weinhold@gmx.de> |
Merged the signals branch into trunk, with these changes: * The team and thread kernel structures have been renamed to Team and Thread respectively and moved into the new BKernel namespace. * Several (kernel add-on) sources have been converted from C to C++ since private kernel headers are included that are no longer C compatible. Changes after merging: * Fixed gcc 2 build (warnings mainly in the scary firewire bus manager). git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@40196 a95241bf-73f2-0310-859d-f6bbb57e9c96
|
#
14a322f332a30cacb7196c9216a14d5575b9b1c2 |
|
14-Jun-2010 |
Ingo Weinhold <ingo_weinhold@gmx.de> |
IORequest::_Copy*(): Resolved TODO: Don't cast the generic_addr_t to void* anymore as that truncates physical addresses when PAE is enabled. Now, if a 4 GB physical address limit is forced in DMAResource, the system continues to work fine when the physical memory > 4 GB is used. Otherwise it hangs or crashes. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37134 a95241bf-73f2-0310-859d-f6bbb57e9c96
|
#
435c43f5912b109e7d5cf682865d2061e62fad8c |
|
02-Jun-2010 |
Ingo Weinhold <ingo_weinhold@gmx.de> |
* Introduced type generic_io_vec, which is similar to iovec, but uses types that are wide enough for both virtual and physical addresses. * DMABuffer, IORequest, IOScheduler,... and code using them: Use generic_io_vec and generic_{addr,size}_t where necessary. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36997 a95241bf-73f2-0310-859d-f6bbb57e9c96
|
#
deee8524b7534d9b586cbcbf366d0660c9769a8e |
|
26-Jan-2010 |
Ingo Weinhold <ingo_weinhold@gmx.de> |
* Introduced {malloc,memalign,free}_etc() which take an additional "flags" argument. They replace the previous special-purpose allocation functions (malloc_nogrow(), vip_io_request_malloc()). * Moved the I/O VIP heap to heap.cpp accordingly. * Added quite a bit of passing around of allocation flags in the VM, particularly in the VM*AddressSpace classes. * Fixed IOBuffer::GetNextVirtualVec(): It was ignoring the VIP flag and always allocated on the normal heap. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35316 a95241bf-73f2-0310-859d-f6bbb57e9c96
|
#
2f7eb9b5460036d97b4ef370637f721adf6b6c96 |
|
13-Dec-2009 |
Ingo Weinhold <ingo_weinhold@gmx.de> |
Fixed a stupid race condition between IORequest finishing and IORequest::Wait(). Wait() immediately returned when IsFinished() returned true, but this is the case as soon as the last IOOperation has finished. The I/O scheduler is not done with the request at this point, though, since it will still be sitting in at least one of three doubly linked lists. Since the usual procedure to issue synchronous I/O requests is to create an IORequest on the stack, pass it to the I/O scheduler, and Wait() on it, Wait() returning early might cause the IORequest object to be destroyed while it is still in use, leading to invalid memory access in the I/O scheduler, corruption of its list structures, as well as later corruption of the issuing thread's stack. Related tickets: * #4431: The request issuing thread returned and already deleted the area the request was writing to before NotifyFinished() was called. * #3048, #4883: Caused by the on stack IORequest being overwritten with other data while being handled by the I/O scheduler thread. * #4517: Hard to say, but I've seen a such a problem too, after a thread scheduling related change. An explanation would be a list structure corruption in the I/O scheduler causing an infinite loop with disabled interrupts. * #2845, #3428, #3429: The block notifier/writer is I/O heavy and as such quite likely to run into the stack corruption issue. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34655 a95241bf-73f2-0310-859d-f6bbb57e9c96
|
#
32e2b6a118474dbaaf7efe1f7e477e1a7b6a5a84 |
|
11-Oct-2009 |
Michael Lotz <mmlr@mlotz.ch> |
Provide a way to directly request virtual vecs from an IOBuffer. If the buffer is virtual already it just returns the vecs directly, if it is physical it takes over the task of virtualizing the vecs either using vm_map_physical_memory_vecs, if there are multiple vecs or more than one page, or falls back to page wise mapping if mapping fails or is not needed. In the best case, scattered physical pages are mapped into one linear virtual buffer so that subsystems operating on virtual memory only get a single vector and can then burst read/write. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@33524 a95241bf-73f2-0310-859d-f6bbb57e9c96
|
#
c39414002f0f17ff984bcb84e1dcfb3178f0e04a |
|
04-Sep-2009 |
Michael Lotz <mmlr@mlotz.ch> |
Give an IORequest user the possibility to suppress child finish notifications. This allows for synchronous uses where subrequests are forked off and waited on. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@32936 a95241bf-73f2-0310-859d-f6bbb57e9c96
|
#
aa4ba93e25c1c63730ba69e04d3d96c3253924fd |
|
08-Mar-2009 |
Ingo Weinhold <ingo_weinhold@gmx.de> |
* Renamed src/system/kernel/device_manager/io_requests.{h,cpp} to IORequest.{h,cpp}. * Introduced public <io_requests.h> header. Currently it only declares the single function BFS uses. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29446 a95241bf-73f2-0310-859d-f6bbb57e9c96
|