From e058adc4fec329cc733afc78de9f27b6f38253e7 Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Tue, 9 Apr 2019 13:58:49 +0200 Subject: [PATCH] block_session: add client-defined request tag The new request tag allows a block-session client to uniquely correlate acknowledgements with outstanding requests. Until now, this was possible for read and write operations by taking the value of the request's packet-stream offset. However, SYNC and TRIM requests do not carry any packet-stream payload and thereby lack meaningful offset values. By introducing the notion of a 'tag', we can support multiple outstanding requests of any type and don't need to overload the meaning of the 'offset' value. Issue #3274 --- repos/os/include/block/request_stream.h | 5 +++-- repos/os/include/block_session/block_session.h | 16 +++++++++++++--- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/repos/os/include/block/request_stream.h b/repos/os/include/block/request_stream.h index 6beb7011b..0004ad1f5 100644 --- a/repos/os/include/block/request_stream.h +++ b/repos/os/include/block/request_stream.h @@ -210,7 +210,7 @@ class Block::Request_stream : Genode::Noncopyable Request request { .operation = operation, .success = false, .offset = packet.offset(), - .tag = { 0 } }; + .tag = { packet.tag().value } }; Response const response = packet_valid ? fn(request) @@ -294,7 +294,8 @@ class Block::Request_stream : Genode::Noncopyable packet = Packet_descriptor(packet, opcode(request.operation.type), request.operation.block_number, - request.operation.count); + request.operation.count, + Session::Tag{request.tag.value}); packet.succeeded(request.success); diff --git a/repos/os/include/block_session/block_session.h b/repos/os/include/block_session/block_session.h index 7b729eeb0..5924fdd76 100644 --- a/repos/os/include/block_session/block_session.h +++ b/repos/os/include/block_session/block_session.h @@ -52,9 +52,15 @@ class Block::Packet_descriptor : public Genode::Packet_descriptor */ enum Alignment { PACKET_ALIGNMENT = 11 }; + /** + * Client-defined value for correlating acknowledgements with requests + */ + struct Tag { unsigned long value; }; + private: Opcode _op; /* requested operation */ + Tag _tag; /* client-defined request identifier */ sector_t _block_number; /* requested block number */ Genode::size_t _block_count; /* number of blocks of operation */ bool _success; /* indicates success of operation */ @@ -67,17 +73,18 @@ class Block::Packet_descriptor : public Genode::Packet_descriptor Packet_descriptor(Genode::off_t offset=0, Genode::size_t size = 0) : Genode::Packet_descriptor(offset, size), - _op(READ), _block_number(0), _block_count(0), _success(false) + _op(READ), _tag(), _block_number(0), _block_count(0), _success(false) { } /** * Constructor */ Packet_descriptor(Packet_descriptor p, Opcode op, - sector_t block_number, Genode::size_t block_count = 1) + sector_t block_number, Genode::size_t block_count = 1, + Tag tag = { ~0U }) : Genode::Packet_descriptor(p.offset(), p.size()), - _op(op), _block_number(block_number), + _op(op), _tag(tag), _block_number(block_number), _block_count(block_count), _success(false) { } @@ -85,6 +92,7 @@ class Block::Packet_descriptor : public Genode::Packet_descriptor sector_t block_number() const { return _block_number; } Genode::size_t block_count() const { return _block_count; } bool succeeded() const { return _success; } + Tag tag() const { return _tag; } void succeeded(bool b) { _success = b; } }; @@ -113,6 +121,8 @@ struct Block::Session : public Genode::Session typedef Packet_stream_tx::Channel Tx; + typedef Packet_descriptor::Tag Tag; + struct Info { Genode::size_t block_size; /* size of one block in bytes */