From bbe3ee8dc5852c7f95f1b7d1e84654199d778a51 Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Thu, 4 Apr 2019 18:25:54 +0200 Subject: [PATCH] block_session: server-defined payload alignment This patch replaces the formerly fixed 2 KiB data alignment within the packet-stream buffer by a server-defined alignment. This has two benefits. First, when using block servers that provide small block sizes like 512 bytes, we avoid fragmenting the packet-stream buffer, which occurs when aligning 512-byte requests at 2 KiB boundaries. This reduces meta data costs for the packet-stream allocator and also allows fitting more requests into the buffer. Second, block drivers with alignment constraints dictated by the hardware can now pass those constraints to the client, thereby easing the use of zero-copy DMA directly into the packet stream. The alignment is determined by the Block::Session_client at construction time and applied by the Block::Session_client::alloc_packet method. Block-session clients should always use this method, not the 'alloc_packet' method of the packet stream (tx source) directly. The latter merely applies a default alignment of 2 KiB. At the server side, the alignment is automatically checked by block/component.h (old API) and block/request_stream.h (new API). Issue #3274 --- repos/dde_linux/src/lib/usb/storage/storage.cc | 1 + repos/dde_rump/src/lib/rump/io.cc | 2 +- repos/gems/src/server/http_block/main.cc | 1 + repos/libports/src/lib/fatfs/diskio_block.cc | 5 +++-- repos/os/include/block/component.h | 3 ++- repos/os/include/block/request_stream.h | 11 +++++++++-- repos/os/include/block_session/block_session.h | 13 +++++++++++-- repos/os/include/block_session/client.h | 10 ++++++---- repos/os/src/app/block_tester/test_ping_pong.h | 2 +- repos/os/src/app/block_tester/test_random.h | 3 +-- repos/os/src/app/block_tester/test_replay.h | 2 +- repos/os/src/app/block_tester/test_sequential.h | 3 +-- repos/os/src/drivers/ahci/ata_driver.h | 1 + repos/os/src/drivers/ahci/atapi_driver.h | 1 + repos/os/src/drivers/nvme/main.cc | 1 + repos/os/src/drivers/sd_card/driver_base.h | 1 + repos/os/src/drivers/sd_card/spec/pbxa9/driver.h | 1 + repos/os/src/drivers/usb_block/main.cc | 1 + repos/os/src/lib/vfs/block_file_system.h | 2 +- repos/os/src/server/block_cache/driver.h | 2 +- repos/os/src/server/block_cache/main.cc | 2 +- repos/os/src/server/iso9660/iso9660.cc | 2 +- repos/os/src/server/lx_block/main.cc | 1 + repos/os/src/server/part_block/component.h | 1 + repos/os/src/server/part_block/driver.h | 2 +- repos/os/src/server/part_block/partition_table.h | 2 +- repos/os/src/server/ram_block/main.cc | 1 + repos/os/src/server/rom_block/main.cc | 1 + repos/os/src/server/tz_vmm/block_driver.cc | 2 +- repos/os/src/test/block/bench/main.cc | 2 +- repos/os/src/test/block/client/main.cc | 15 +++++++-------- repos/os/src/test/block/server/main.cc | 1 + repos/os/src/test/block_request_stream/main.cc | 1 + repos/os/src/test/rom_block/main.cc | 2 +- repos/ports/src/app/seoul/disk.cc | 4 ++-- 35 files changed, 68 insertions(+), 37 deletions(-) diff --git a/repos/dde_linux/src/lib/usb/storage/storage.cc b/repos/dde_linux/src/lib/usb/storage/storage.cc index 5dbd0fc7d..947fe97ef 100644 --- a/repos/dde_linux/src/lib/usb/storage/storage.cc +++ b/repos/dde_linux/src/lib/usb/storage/storage.cc @@ -148,6 +148,7 @@ class Storage_device : public Genode::List::Element, { return { .block_size = _block_size, .block_count = _block_count, + .align_log2 = Genode::log2(_block_size), .writeable = true }; } diff --git a/repos/dde_rump/src/lib/rump/io.cc b/repos/dde_rump/src/lib/rump/io.cc index 35e733d47..60b98581c 100644 --- a/repos/dde_rump/src/lib/rump/io.cc +++ b/repos/dde_rump/src/lib/rump/io.cc @@ -57,7 +57,7 @@ class Backend Packet_descriptor::READ; /* allocate packet */ try { - Packet_descriptor packet( _session.dma_alloc_packet(length), + Packet_descriptor packet( _session.alloc_packet(length), opcode, offset / _info.block_size, length / _info.block_size); diff --git a/repos/gems/src/server/http_block/main.cc b/repos/gems/src/server/http_block/main.cc index 4caebda33..4adb6ff09 100644 --- a/repos/gems/src/server/http_block/main.cc +++ b/repos/gems/src/server/http_block/main.cc @@ -46,6 +46,7 @@ class Driver : public Block::Driver { return { .block_size = _block_size, .block_count = _http.file_size() / _block_size, + .align_log2 = log2(_block_size), .writeable = false }; } diff --git a/repos/libports/src/lib/fatfs/diskio_block.cc b/repos/libports/src/lib/fatfs/diskio_block.cc index b7e3306a4..6b02f50e9 100644 --- a/repos/libports/src/lib/fatfs/diskio_block.cc +++ b/repos/libports/src/lib/fatfs/diskio_block.cc @@ -62,6 +62,7 @@ extern "C" { using Block::Connection::tx; using Block::Connection::sync; + using Block::Connection::alloc_packet; Drive(Platform &platform, char const *label) : Block::Connection(platform.env, &platform.tx_alloc, 128*1024, label) @@ -125,7 +126,7 @@ extern "C" DRESULT disk_read (BYTE pdrv, BYTE* buff, DWORD sector, UINT count) Genode::size_t const op_len = drive.info.block_size*count; /* allocate packet-descriptor for reading */ - Block::Packet_descriptor p(drive.tx()->alloc_packet(op_len), + Block::Packet_descriptor p(drive.alloc_packet(op_len), Block::Packet_descriptor::READ, sector, count); drive.tx()->submit_packet(p); p = drive.tx()->get_acked_packet(); @@ -155,7 +156,7 @@ extern "C" DRESULT disk_write (BYTE pdrv, const BYTE* buff, DWORD sector, UINT c Genode::size_t const op_len = drive.info.block_size*count; /* allocate packet-descriptor for writing */ - Block::Packet_descriptor p(drive.tx()->alloc_packet(op_len), + Block::Packet_descriptor p(drive.alloc_packet(op_len), Block::Packet_descriptor::WRITE, sector, count); Genode::memcpy(drive.tx()->packet_content(p), buff, op_len); diff --git a/repos/os/include/block/component.h b/repos/os/include/block/component.h index b48f0841c..ed3565917 100644 --- a/repos/os/include/block/component.h +++ b/repos/os/include/block/component.h @@ -108,7 +108,8 @@ class Block::Session_component : public Block::Session_component_base, /* ignore invalid packets */ bool const valid = packet.size() && _range_check(_p_to_handle) - && tx_sink()->packet_valid(packet); + && tx_sink()->packet_valid(packet) + && aligned(packet.offset(), _info.align_log2); if (!valid) { _ack_packet(_p_to_handle); return; diff --git a/repos/os/include/block/request_stream.h b/repos/os/include/block/request_stream.h index 2f28ec0b9..2354e936b 100644 --- a/repos/os/include/block/request_stream.h +++ b/repos/os/include/block/request_stream.h @@ -26,6 +26,9 @@ class Block::Request_stream : Genode::Noncopyable { public: + struct Block_size { Genode::uint32_t value; }; + struct Align_log2 { Genode::size_t value; }; + /** * Interface for accessing the content of a 'Request' * @@ -59,7 +62,7 @@ class Block::Request_stream : Genode::Noncopyable return request.count * _info.block_size; } - bool _valid_range(Block::Request const &request) const + bool _valid_range_and_alignment(Block::Request const &request) const { /* local address of the last byte of the request */ Genode::addr_t const request_end = _base + request.offset @@ -73,6 +76,10 @@ class Block::Request_stream : Genode::Noncopyable if (request_end > _base + _size - 1) return false; + /* check for proper alignment */ + if (!Genode::aligned(request.offset, _info.align_log2)) + return false; + return true; } @@ -94,7 +101,7 @@ class Block::Request_stream : Genode::Noncopyable template void with_content(Block::Request request, FN const &fn) const { - if (_valid_range(request)) + if (_valid_range_and_alignment(request)) fn(_request_ptr(request), _request_size(request)); } }; diff --git a/repos/os/include/block_session/block_session.h b/repos/os/include/block_session/block_session.h index e289fe546..7b729eeb0 100644 --- a/repos/os/include/block_session/block_session.h +++ b/repos/os/include/block_session/block_session.h @@ -31,7 +31,7 @@ namespace Block { /** - * Represents an block-operation request + * Representation of an block-operation request * * The data associated with the 'Packet_descriptor' is either * the data read from or written to the block indicated by @@ -42,6 +42,14 @@ class Block::Packet_descriptor : public Genode::Packet_descriptor public: enum Opcode { READ, WRITE, END }; + + /* + * Alignment used when allocating a packet directly via the 'tx' + * packet stream. This is not recommended because it does not + * apply the server's alignment constraints. Instead, the + * 'Block::Session_client::alloc_packet' should be used for + * allocating properly aligned block-request packets. + */ enum Alignment { PACKET_ALIGNMENT = 11 }; private: @@ -82,7 +90,7 @@ class Block::Packet_descriptor : public Genode::Packet_descriptor }; -/* +/** * Block session interface * * A block session corresponds to a block device that can be used to read @@ -109,6 +117,7 @@ struct Block::Session : public Genode::Session { Genode::size_t block_size; /* size of one block in bytes */ sector_t block_count; /* number of blocks */ + Genode::size_t align_log2; /* packet alignment within payload buffer */ bool writeable; }; diff --git a/repos/os/include/block_session/client.h b/repos/os/include/block_session/client.h index 848e0ae79..e409e02de 100644 --- a/repos/os/include/block_session/client.h +++ b/repos/os/include/block_session/client.h @@ -27,6 +27,8 @@ class Block::Session_client : public Genode::Rpc_client Packet_stream_tx::Client _tx; + Info const _info = info(); + public: /** @@ -59,12 +61,12 @@ class Block::Session_client : public Genode::Rpc_client Genode::Capability tx_cap() override { return call(); } - /* - * Wrapper for alloc_packet, allocates 2KB aligned packets + /** + * Allocate packet respecting the server's alignment constraints */ - Packet_descriptor dma_alloc_packet(Genode::size_t size) + Packet_descriptor alloc_packet(Genode::size_t size) { - return tx()->alloc_packet(size, 11); + return tx()->alloc_packet(size, _info.align_log2); } }; diff --git a/repos/os/src/app/block_tester/test_ping_pong.h b/repos/os/src/app/block_tester/test_ping_pong.h index 9f2d8b231..90b829601 100644 --- a/repos/os/src/app/block_tester/test_ping_pong.h +++ b/repos/os/src/app/block_tester/test_ping_pong.h @@ -63,7 +63,7 @@ struct Test::Ping_pong : Test_base while (_blocks < _length_in_blocks && _block->tx()->ready_to_submit()) { Block::Packet_descriptor tmp = - _block->tx()->alloc_packet(_size_in_blocks * _info.block_size); + _block->alloc_packet(_size_in_blocks * _info.block_size); Block::sector_t const lba = _ping ? _start + _blocks : _end - _blocks; diff --git a/repos/os/src/app/block_tester/test_random.h b/repos/os/src/app/block_tester/test_random.h index 2cb39ee68..82c452631 100644 --- a/repos/os/src/app/block_tester/test_random.h +++ b/repos/os/src/app/block_tester/test_random.h @@ -127,8 +127,7 @@ struct Test::Random : Test_base bool next = true; while (_blocks < _length_in_blocks && _block->tx()->ready_to_submit() && next) { - Block::Packet_descriptor tmp = - _block->tx()->alloc_packet(_size); + Block::Packet_descriptor tmp = _block->alloc_packet(_size); Block::sector_t lba = _next_block(); diff --git a/repos/os/src/app/block_tester/test_replay.h b/repos/os/src/app/block_tester/test_replay.h index df20e93fe..432ff0e72 100644 --- a/repos/os/src/app/block_tester/test_replay.h +++ b/repos/os/src/app/block_tester/test_replay.h @@ -69,7 +69,7 @@ struct Test::Replay : Test_base more = false; requests.dequeue([&] (Request &req) { Block::Packet_descriptor p( - _block->tx()->alloc_packet(req.count * _info.block_size), + _block->alloc_packet(req.count * _info.block_size), req.op, req.nr, req.count); bool const write = req.op == Block::Packet_descriptor::WRITE; diff --git a/repos/os/src/app/block_tester/test_sequential.h b/repos/os/src/app/block_tester/test_sequential.h index 61b1014ed..5876171b8 100644 --- a/repos/os/src/app/block_tester/test_sequential.h +++ b/repos/os/src/app/block_tester/test_sequential.h @@ -66,8 +66,7 @@ struct Test::Sequential : Test_base bool next = true; while (_blocks < _length_in_blocks && _block->tx()->ready_to_submit() && next) { - Block::Packet_descriptor tmp = - _block->tx()->alloc_packet(_size); + Block::Packet_descriptor tmp = _block->alloc_packet(_size); Block::Packet_descriptor p(tmp, _op, _start, _size_in_blocks); diff --git a/repos/os/src/drivers/ahci/ata_driver.h b/repos/os/src/drivers/ahci/ata_driver.h index 01edc5cc7..b65a77a97 100644 --- a/repos/os/src/drivers/ahci/ata_driver.h +++ b/repos/os/src/drivers/ahci/ata_driver.h @@ -377,6 +377,7 @@ struct Ata_driver : Port_driver { return { .block_size = block_size(), .block_count = block_count(), + .align_log2 = log2(block_size()), .writeable = true }; } diff --git a/repos/os/src/drivers/ahci/atapi_driver.h b/repos/os/src/drivers/ahci/atapi_driver.h index e7c9cfafb..3c735cd28 100644 --- a/repos/os/src/drivers/ahci/atapi_driver.h +++ b/repos/os/src/drivers/ahci/atapi_driver.h @@ -162,6 +162,7 @@ struct Atapi_driver : Port_driver { return { .block_size = block_size(), .block_count = block_count(), + .align_log2 = 11, .writeable = false }; } diff --git a/repos/os/src/drivers/nvme/main.cc b/repos/os/src/drivers/nvme/main.cc index 7fc142f0e..6b36586d5 100644 --- a/repos/os/src/drivers/nvme/main.cc +++ b/repos/os/src/drivers/nvme/main.cc @@ -1541,6 +1541,7 @@ class Driver : public Block::Driver _info = { .block_size = nsinfo.size, .block_count = nsinfo.count, + .align_log2 = Genode::log2(nsinfo.size), .writeable = true }; Nvme::Controller::Info const &info = _nvme_ctrlr->info(); diff --git a/repos/os/src/drivers/sd_card/driver_base.h b/repos/os/src/drivers/sd_card/driver_base.h index e684c9669..e64343b42 100644 --- a/repos/os/src/drivers/sd_card/driver_base.h +++ b/repos/os/src/drivers/sd_card/driver_base.h @@ -48,6 +48,7 @@ class Sd_card::Driver_base : public Block::Driver, { return { .block_size = _block_size(), .block_count = _block_count(), + .align_log2 = Genode::log2(_block_size()), .writeable = true }; } }; diff --git a/repos/os/src/drivers/sd_card/spec/pbxa9/driver.h b/repos/os/src/drivers/sd_card/spec/pbxa9/driver.h index 24c918ba5..c5e8795f4 100644 --- a/repos/os/src/drivers/sd_card/spec/pbxa9/driver.h +++ b/repos/os/src/drivers/sd_card/spec/pbxa9/driver.h @@ -129,6 +129,7 @@ class Sd_card::Driver : public Block::Driver, private Attached_mmio { return { .block_size = _block_size, .block_count = _block_count, + .align_log2 = log2(_block_size), .writeable = true }; } diff --git a/repos/os/src/drivers/usb_block/main.cc b/repos/os/src/drivers/usb_block/main.cc index ec7eee146..994b14760 100644 --- a/repos/os/src/drivers/usb_block/main.cc +++ b/repos/os/src/drivers/usb_block/main.cc @@ -808,6 +808,7 @@ struct Usb::Block_driver : Usb::Completion, { return { .block_size = _block_size, .block_count = _block_count, + .align_log2 = Genode::log2(_block_size), .writeable = _writeable }; } diff --git a/repos/os/src/lib/vfs/block_file_system.h b/repos/os/src/lib/vfs/block_file_system.h index a079ed44c..b0c234ba1 100644 --- a/repos/os/src/lib/vfs/block_file_system.h +++ b/repos/os/src/lib/vfs/block_file_system.h @@ -106,7 +106,7 @@ class Vfs::Block_file_system : public Single_file_system try { Lock::Guard guard(_lock); - packet = _tx_source->alloc_packet(packet_size); + packet = _block.alloc_packet(packet_size); break; } catch (Block::Session::Tx::Source::Packet_alloc_failed) { if (!_tx_source->ready_to_submit()) diff --git a/repos/os/src/server/block_cache/driver.h b/repos/os/src/server/block_cache/driver.h index fe84b6bd8..d3529aeb6 100644 --- a/repos/os/src/server/block_cache/driver.h +++ b/repos/os/src/server/block_cache/driver.h @@ -244,7 +244,7 @@ class Driver : public Block::Driver /* construct and send the packet */ p_to_dev = - Block::Packet_descriptor(_blk.dma_alloc_packet(_info.block_size*cnt), + Block::Packet_descriptor(_blk.alloc_packet(_info.block_size*cnt), Block::Packet_descriptor::READ, nr, cnt); _r_list.insert(new (&_r_slab) Request(p_to_dev, packet, buffer)); diff --git a/repos/os/src/server/block_cache/main.cc b/repos/os/src/server/block_cache/main.cc index b3841c9a3..c0ffb1c12 100644 --- a/repos/os/src/server/block_cache/main.cc +++ b/repos/os/src/server/block_cache/main.cc @@ -35,7 +35,7 @@ void Driver::Policy::sync(const typename POLICY::Element *e, char *dst) throw Write_failed(off); try { Block::Packet_descriptor - p(driver->blk()->dma_alloc_packet(Driver::CACHE_BLK_SIZE), + p(driver->blk()->alloc_packet(Driver::CACHE_BLK_SIZE), Block::Packet_descriptor::WRITE, off / driver->blk_sz(), Driver::CACHE_BLK_SIZE / driver->blk_sz()); driver->blk()->tx()->submit_packet(p); diff --git a/repos/os/src/server/iso9660/iso9660.cc b/repos/os/src/server/iso9660/iso9660.cc index 09cb63e7b..45bf47ad9 100644 --- a/repos/os/src/server/iso9660/iso9660.cc +++ b/repos/os/src/server/iso9660/iso9660.cc @@ -56,7 +56,7 @@ class Iso::Sector { { try { _p = Block::Packet_descriptor( - block.dma_alloc_packet(blk_size() * count), + block.alloc_packet(blk_size() * count), Block::Packet_descriptor::READ, blk_nr * ((float)blk_size() / BLOCK_SIZE), count * ((float)blk_size() / BLOCK_SIZE)); diff --git a/repos/os/src/server/lx_block/main.cc b/repos/os/src/server/lx_block/main.cc index 77818f6e2..12cc5c654 100644 --- a/repos/os/src/server/lx_block/main.cc +++ b/repos/os/src/server/lx_block/main.cc @@ -73,6 +73,7 @@ class Lx_block_driver : public Block::Driver return { .block_size = block_size, .block_count = st.st_size / block_size, + .align_log2 = Genode::log2(block_size), .writeable = xml_attr_ok(config, "writeable") }; } diff --git a/repos/os/src/server/part_block/component.h b/repos/os/src/server/part_block/component.h index 559c94ee6..44a9aa8b5 100644 --- a/repos/os/src/server/part_block/component.h +++ b/repos/os/src/server/part_block/component.h @@ -220,6 +220,7 @@ class Block::Session_component : public Block::Session_rpc_object, { return Info { .block_size = _driver.blk_size(), .block_count = _partition->sectors, + .align_log2 = Genode::log2(_driver.blk_size()), .writeable = _writeable && _driver.writeable() }; } diff --git a/repos/os/src/server/part_block/driver.h b/repos/os/src/server/part_block/driver.h index 8946a89e4..4b3dfe24e 100644 --- a/repos/os/src/server/part_block/driver.h +++ b/repos/os/src/server/part_block/driver.h @@ -139,7 +139,7 @@ class Block::Driver ? Block::Packet_descriptor::WRITE : Block::Packet_descriptor::READ; Genode::size_t const size = _info.block_size * cnt; - Packet_descriptor p(_session.dma_alloc_packet(size), + Packet_descriptor p(_session.alloc_packet(size), op, nr, cnt); Request *r = new (&_r_slab) Request(dispatcher, cli, p); _r_list.insert(r); diff --git a/repos/os/src/server/part_block/partition_table.h b/repos/os/src/server/part_block/partition_table.h index 622fbb593..bd01cc904 100644 --- a/repos/os/src/server/part_block/partition_table.h +++ b/repos/os/src/server/part_block/partition_table.h @@ -54,7 +54,7 @@ struct Block::Partition_table : Genode::Interface unsigned long count, bool write = false) : _session(driver.session()), - _p(_session.dma_alloc_packet(driver.blk_size() * count), + _p(_session.alloc_packet(driver.blk_size() * count), write ? Packet_descriptor::WRITE : Packet_descriptor::READ, blk_nr, count) { diff --git a/repos/os/src/server/ram_block/main.cc b/repos/os/src/server/ram_block/main.cc index 3a3337fe8..4ef851fff 100644 --- a/repos/os/src/server/ram_block/main.cc +++ b/repos/os/src/server/ram_block/main.cc @@ -116,6 +116,7 @@ class Ram_block : public Block::Driver { return { .block_size = _block_size, .block_count = _block_count, + .align_log2 = log2(_block_size), .writeable = true }; } diff --git a/repos/os/src/server/rom_block/main.cc b/repos/os/src/server/rom_block/main.cc index 1988e4049..97becc61c 100644 --- a/repos/os/src/server/rom_block/main.cc +++ b/repos/os/src/server/rom_block/main.cc @@ -48,6 +48,7 @@ class Rom_block : public Block::Driver { return { .block_size = _blk_sz, .block_count = _blk_cnt, + .align_log2 = log2(_blk_sz), .writeable = false }; } diff --git a/repos/os/src/server/tz_vmm/block_driver.cc b/repos/os/src/server/tz_vmm/block_driver.cc index 7f9767433..4b03dff6e 100644 --- a/repos/os/src/server/tz_vmm/block_driver.cc +++ b/repos/os/src/server/tz_vmm/block_driver.cc @@ -175,7 +175,7 @@ void Block_driver::_new_request(Vm_base &vm) size_t const size = vm.smc_arg_3(); void *const req = (void*)vm.smc_arg_4(); - Packet_descriptor pkt = dev.session().tx()->alloc_packet(size); + Packet_descriptor pkt = dev.session().alloc_packet(size); void *addr = dev.session().tx()->packet_content(pkt); dev.cache().insert(addr, req); vm.smc_ret((long)addr, pkt.offset()); diff --git a/repos/os/src/test/block/bench/main.cc b/repos/os/src/test/block/bench/main.cc index 2eb0797f1..4a1fbb0cc 100644 --- a/repos/os/src/test/block/bench/main.cc +++ b/repos/os/src/test/block/bench/main.cc @@ -67,7 +67,7 @@ class Throughput try { while (_session.tx()->ready_to_submit()) { Block::Packet_descriptor p( - _session.tx()->alloc_packet(REQUEST_SIZE), + _session.alloc_packet(REQUEST_SIZE), !_read_done ? Block::Packet_descriptor::READ : Block::Packet_descriptor::WRITE, _current, count); diff --git a/repos/os/src/test/block/client/main.cc b/repos/os/src/test/block/client/main.cc index e52ca076d..cd76bb0d3 100644 --- a/repos/os/src/test/block/client/main.cc +++ b/repos/os/src/test/block/client/main.cc @@ -140,7 +140,7 @@ struct Read_test : Test try { Block::Packet_descriptor p( - _session.dma_alloc_packet(cnt*blk_sz), + _session.alloc_packet(cnt*blk_sz), Block::Packet_descriptor::READ, nr, cnt); _session.tx()->submit_packet(p); } catch(Block::Session::Tx::Source::Packet_alloc_failed) { @@ -241,8 +241,7 @@ struct Write_test : Test { while (!read_packets.empty()) { Block::Packet_descriptor r = read_packets.get(); - Block::Packet_descriptor w(_session.dma_alloc_packet(r.block_count() - *blk_sz), + Block::Packet_descriptor w(_session.alloc_packet(r.block_count()*blk_sz), Block::Packet_descriptor::WRITE, r.block_number(), r.block_count()); signed char *dst = (signed char*)_session.tx()->packet_content(w), @@ -263,7 +262,7 @@ struct Write_test : Test for (sector_t nr = start, cnt = Genode::min(NR_PER_REQ, end - start); nr < end; nr += cnt, cnt = Genode::min(NR_PER_REQ, end-nr)) { - Block::Packet_descriptor p(_session.dma_alloc_packet(cnt*blk_sz), + Block::Packet_descriptor p(_session.alloc_packet(cnt*blk_sz), Block::Packet_descriptor::READ, nr, cnt); _session.tx()->submit_packet(p); } @@ -338,10 +337,10 @@ struct Violation_test : Test void req(Block::sector_t nr, Genode::size_t cnt, bool write) { - Block::Packet_descriptor p(_session.dma_alloc_packet(blk_sz), - write ? Block::Packet_descriptor::WRITE - : Block::Packet_descriptor::READ, - nr, cnt); + Block::Packet_descriptor p(_session.alloc_packet(blk_sz), + write ? Block::Packet_descriptor::WRITE + : Block::Packet_descriptor::READ, + nr, cnt); _session.tx()->submit_packet(p); p_in_fly++; } diff --git a/repos/os/src/test/block/server/main.cc b/repos/os/src/test/block/server/main.cc index b44f96957..9aece3b40 100644 --- a/repos/os/src/test/block/server/main.cc +++ b/repos/os/src/test/block/server/main.cc @@ -67,6 +67,7 @@ class Driver : public Block::Driver { return { .block_size = _size, .block_count = _number, + .align_log2 = Genode::log2(_size), .writeable = true }; } diff --git a/repos/os/src/test/block_request_stream/main.cc b/repos/os/src/test/block_request_stream/main.cc index 8bfc82ef4..2f58d6dde 100644 --- a/repos/os/src/test/block_request_stream/main.cc +++ b/repos/os/src/test/block_request_stream/main.cc @@ -44,6 +44,7 @@ struct Test::Block_session_component : Rpc_object, Request_stream(rm, ds, ep, sigh, Info { .block_size = BLOCK_SIZE, .block_count = NUM_BLOCKS, + .align_log2 = log2(BLOCK_SIZE), .writeable = true }), _ep(ep) { diff --git a/repos/os/src/test/rom_block/main.cc b/repos/os/src/test/rom_block/main.cc index 5c8a233d2..bc6d73089 100644 --- a/repos/os/src/test/rom_block/main.cc +++ b/repos/os/src/test/rom_block/main.cc @@ -56,7 +56,7 @@ struct Main size_t const cnt = (info.block_count - i > REQ_PARALLEL) ? REQ_PARALLEL : info.block_count - i; - Packet_descriptor pkt(src.alloc_packet(cnt * info.block_size), + Packet_descriptor pkt(block.alloc_packet(cnt * info.block_size), Packet_descriptor::READ, i, cnt); log("Check blocks ", i, "..", i + cnt - 1); diff --git a/repos/ports/src/app/seoul/disk.cc b/repos/ports/src/app/seoul/disk.cc index a34805eac..aa8ba9a6b 100644 --- a/repos/ports/src/app/seoul/disk.cc +++ b/repos/ports/src/app/seoul/disk.cc @@ -260,7 +260,7 @@ bool Seoul::Disk::restart(struct disk_session const &disk, Genode::Lock::Guard lock_guard(_alloc_lock); packet = Block::Packet_descriptor( - source->alloc_packet(blocks * blk_size), + disk.blk_con->alloc_packet(blocks * blk_size), (write) ? Block::Packet_descriptor::WRITE : Block::Packet_descriptor::READ, msg->sector, blocks); @@ -317,7 +317,7 @@ bool Seoul::Disk::execute(bool const write, struct disk_session const &disk, Genode::Lock::Guard lock_guard(_alloc_lock); packet = Block::Packet_descriptor( - source->alloc_packet(blocks * blk_size), + disk.blk_con->alloc_packet(blocks * blk_size), (write) ? Block::Packet_descriptor::WRITE : Block::Packet_descriptor::READ, sector, blocks);