# HG changeset patch # User Paul Boddie # Date 1616632970 -3600 # Node ID 3e4d7c4e617e5f2bc775cadd098b19a7691a91b3 # Parent ec1f8f18c3069381b1fb91ebf46ca125aae51bd5 Introduced a size parameter when opening pipes, reorganising the architecture to provide the size via the pipe paging coordinator and pager. Made accessors specific to each pipe region since they retain the populated size of each region. diff -r ec1f8f18c306 -r 3e4d7c4e617e dstest_pipe_client.cc --- a/dstest_pipe_client.cc Wed Mar 24 23:44:53 2021 +0100 +++ b/dstest_pipe_client.cc Thu Mar 25 01:42:50 2021 +0100 @@ -51,6 +51,10 @@ } } + + +const unsigned int PIPE_PAGES = 2; + int main(void) { /* Obtain access to the filesystem. */ @@ -60,7 +64,7 @@ /* Invoke the open method to receive the file reference. */ file_t reader, writer; - long err = pipe_open(&reader, &writer, server); + long err = pipe_open(page(PIPE_PAGES), &reader, &writer, server); if (err) { diff -r ec1f8f18c306 -r 3e4d7c4e617e dstest_pipe_server.cc --- a/dstest_pipe_server.cc Wed Mar 24 23:44:53 2021 +0100 +++ b/dstest_pipe_server.cc Thu Mar 25 01:42:50 2021 +0100 @@ -24,22 +24,19 @@ #include #include "memory.h" -#include "pages_conserving.h" #include "pipe_opener_resource.h" #include "resource_server.h" const unsigned int MEMORY_PAGES = 20; -const unsigned int PIPE_PAGES = 2; int main(void) { /* Some memory plus infrastructure. */ Memory mem(MEMORY_PAGES); - PagesConserving pages(&mem, PIPE_PAGES); - PipeOpenerResource opener(&pages); + PipeOpenerResource opener; /* Register a server associating it with the given object. */ diff -r ec1f8f18c306 -r 3e4d7c4e617e file.cc --- a/file.cc Wed Mar 24 23:44:53 2021 +0100 +++ b/file.cc Thu Mar 25 01:42:50 2021 +0100 @@ -235,14 +235,14 @@ /* Open two pipe endpoints using the given pipe server. */ -long pipe_open(file_t *reader, file_t *writer, l4_cap_idx_t server) +long pipe_open(offset_t size, file_t *reader, file_t *writer, l4_cap_idx_t server) { client_PipeOpener opener(server); file_init(reader); file_init(writer); - long err = opener.pipe(&reader->ref, &writer->ref); + long err = opener.pipe(size, &reader->ref, &writer->ref); if (err) return err; diff -r ec1f8f18c306 -r 3e4d7c4e617e file.h --- a/file.h Wed Mar 24 23:44:53 2021 +0100 +++ b/file.h Thu Mar 25 01:42:50 2021 +0100 @@ -82,7 +82,7 @@ /* Pipe operations. */ -long pipe_open(file_t *reader, file_t *writer, l4_cap_idx_t server); +long pipe_open(offset_t size, file_t *reader, file_t *writer, l4_cap_idx_t server); /* Pipe region operations. */ diff -r ec1f8f18c306 -r 3e4d7c4e617e files/pipe_paging.cc --- a/files/pipe_paging.cc Wed Mar 24 23:44:53 2021 +0100 +++ b/files/pipe_paging.cc Thu Mar 25 01:42:50 2021 +0100 @@ -1,6 +1,7 @@ #include "pipe_paging.h" -PipePaging::PipePaging() +PipePaging::PipePaging(offset_t size) +: _size(size) { } @@ -25,6 +26,11 @@ { if (_regions.size() > 1) { + /* Discard the accessor from the current region. */ + + if (_accessors.size() > _regions.size()) + _accessors.pop_front(); + _regions.pop_front(); return _regions.front(); } @@ -32,4 +38,14 @@ return NULL; } +/* Initialise an accessor for a region. */ + +PipeAccessor *PipePaging::accessor() +{ + PipeAccessor accessor; + + _accessors.push_back(accessor); + return &_accessors.back(); +} + // vim: tabstop=4 expandtab shiftwidth=4 diff -r ec1f8f18c306 -r 3e4d7c4e617e files/pipe_paging.h --- a/files/pipe_paging.h Wed Mar 24 23:44:53 2021 +0100 +++ b/files/pipe_paging.h Thu Mar 25 01:42:50 2021 +0100 @@ -3,6 +3,8 @@ #include #include "page_mapper.h" +#include "pages_conserving.h" +#include "pipe_accessor.h" /* Pipe paging support, maintaining the sequence of active regions or sections in a pipe. */ @@ -10,16 +12,33 @@ class PipePaging { protected: + PagesConserving _pages; + + /* Regions acting as files with their own accessors. */ + std::list _regions; + std::list _accessors; + + /* Pipe section/region size. */ + + offset_t _size; public: - explicit PipePaging(); + explicit PipePaging(offset_t size); virtual void add_region(PageMapper *mapper); virtual PageMapper *first_region(); virtual PageMapper *next_region(); + + virtual PipeAccessor *accessor(); + + virtual PagesConserving *pages() + { return &_pages; } + + virtual offset_t region_size() + { return _size; } }; // vim: tabstop=4 expandtab shiftwidth=4 diff -r ec1f8f18c306 -r 3e4d7c4e617e pages_conserving.cc --- a/pages_conserving.cc Wed Mar 24 23:44:53 2021 +0100 +++ b/pages_conserving.cc Thu Mar 25 01:42:50 2021 +0100 @@ -1,12 +1,12 @@ #include "pages_conserving.h" -PagesConserving::PagesConserving(Memory *memory, unsigned int increment) -: Pages(memory), _increment(increment) +PagesConserving::PagesConserving(Memory *memory) +: Pages(memory) { } PagesConserving::PagesConserving() -: Pages(), _increment(1) +: Pages() { } @@ -42,7 +42,7 @@ /* Decrease the provision of flexpages to pipes. */ -bool PagesConserving::decrease() +bool PagesConserving::decrease(offset_t size) { // NOTE: Need to remove flexpages from the queue. // NOTE: This might need to happen incrementally in case some pages are not @@ -54,15 +54,15 @@ /* Increase the provision of flexpages to pipes, returning whether allocation succeeded. */ -bool PagesConserving::increase() +bool PagesConserving::increase(offset_t size) { - unsigned int regions = _increment; + offset_t allocated_size = 0; std::list allocated; std::list::iterator it; /* Allocate regions for the defined increment value. */ - while (regions) + while (allocated_size < size) { Region *r = _memory->region(); @@ -77,7 +77,7 @@ } allocated.push_back(r); - regions--; + allocated_size += r->size(); } /* Queue flexpages for the regions. */ @@ -88,11 +88,4 @@ return true; } -/* Return the allocation increment. */ - -offset_t PagesConserving::allocation() -{ - return _memory->region_size() * _increment; -} - // vim: tabstop=4 expandtab shiftwidth=4 diff -r ec1f8f18c306 -r 3e4d7c4e617e pages_conserving.h --- a/pages_conserving.h Wed Mar 24 23:44:53 2021 +0100 +++ b/pages_conserving.h Thu Mar 25 01:42:50 2021 +0100 @@ -9,11 +9,8 @@ class PagesConserving : public Pages { -protected: - unsigned int _increment; - public: - explicit PagesConserving(Memory *memory, unsigned int increment=1); + explicit PagesConserving(Memory *memory); explicit PagesConserving(); @@ -27,11 +24,9 @@ /* Memory control methods. */ - virtual bool decrease(); + virtual bool decrease(offset_t size); - virtual bool increase(); - - virtual offset_t allocation(); + virtual bool increase(offset_t size); }; // vim: tabstop=4 expandtab shiftwidth=4 diff -r ec1f8f18c306 -r 3e4d7c4e617e pipe_opener_resource.cc --- a/pipe_opener_resource.cc Wed Mar 24 23:44:53 2021 +0100 +++ b/pipe_opener_resource.cc Thu Mar 25 01:42:50 2021 +0100 @@ -7,8 +7,7 @@ /* Support for providing access to pipes. */ -PipeOpenerResource::PipeOpenerResource(PagesConserving *pages) -: _pages(pages) +PipeOpenerResource::PipeOpenerResource() { } @@ -26,11 +25,11 @@ /* Pipe opener interface methods. */ -long PipeOpenerResource::pipe(l4_cap_idx_t *reader, l4_cap_idx_t *writer) +long PipeOpenerResource::pipe(offset_t size, l4_cap_idx_t *reader, l4_cap_idx_t *writer) { /* Both endpoints will employ a common paging coordinator. */ - PipePaging *paging = new PipePaging(); + PipePaging *paging = new PipePaging(size); /* Each endpoint will have its own pager. */ @@ -41,9 +40,9 @@ return open_endpoint(paging, false, reader) || open_endpoint(paging, true, writer); } -long PipeOpenerResource::open_endpoint(PipePaging *paging, bool writer, l4_cap_idx_t *endpoint) +long PipeOpenerResource::open_endpoint(PipePaging *paging, bool writing, l4_cap_idx_t *endpoint) { - PipePager *pager = new PipePager(_pages, paging, writer); + PipePager *pager = new PipePager(paging, writing); /* Start the endpoint server in a new thread. If the thread does not start, the resource should be finalised. */ diff -r ec1f8f18c306 -r 3e4d7c4e617e pipe_opener_resource.h --- a/pipe_opener_resource.h Wed Mar 24 23:44:53 2021 +0100 +++ b/pipe_opener_resource.h Thu Mar 25 01:42:50 2021 +0100 @@ -1,6 +1,5 @@ #pragma once -#include "pages_conserving.h" #include "pipe_opener_interface.h" #include "pipe_paging.h" #include "resource.h" @@ -10,12 +9,10 @@ class PipeOpenerResource : public Resource, public PipeOpener { protected: - PagesConserving *_pages; - - long open_endpoint(PipePaging *paging, bool writer, l4_cap_idx_t *endpoint); + long open_endpoint(PipePaging *paging, bool writing, l4_cap_idx_t *endpoint); public: - explicit PipeOpenerResource(PagesConserving *pages); + explicit PipeOpenerResource(); /* Server details. */ @@ -28,7 +25,7 @@ /* PipeOpener interface methods. */ - long pipe(l4_cap_idx_t *reader, l4_cap_idx_t *writer); + long pipe(offset_t size, l4_cap_idx_t *reader, l4_cap_idx_t *writer); }; // vim: tabstop=4 expandtab shiftwidth=4 diff -r ec1f8f18c306 -r 3e4d7c4e617e pipe_pager.cc --- a/pipe_pager.cc Wed Mar 24 23:44:53 2021 +0100 +++ b/pipe_pager.cc Thu Mar 25 01:42:50 2021 +0100 @@ -5,14 +5,13 @@ access to loaded pages. At first, no mapper will be configured: this must be done by requesting a region. */ -PipePager::PipePager(PagesConserving *pages, PipePaging *paging, bool writer) -: Pager(NULL, writer ? L4_FPAGE_RW : L4_FPAGE_RO), - _pages(pages), _paging(paging), _writer(writer) +PipePager::PipePager(PipePaging *paging, bool writing) +: Pager(NULL, writing ? L4_FPAGE_RW : L4_FPAGE_RO), + _paging(paging), _writing(writing) { - /* Set the size of each paged region to the amount allocation for such - regions. */ + /* Initialise the size of the paged region. */ - _size = _pages->allocation(); + _size = _paging->region_size(); } int PipePager::expected_items() @@ -56,7 +55,7 @@ { /* Obtain a new region if writing. */ - if (_writer) + if (_writing) return next_region_for_writer(populated_size, size); else return next_region_for_reader(populated_size, size); @@ -102,12 +101,14 @@ /* A guaranteed amount of memory is reserved for the pipe. */ - if (!_pages->increase()) + PagesConserving *pages = _paging->pages(); + + if (!pages->increase(_size)) return -L4_ENOMEM; /* Set the page mapper for the region. */ - _mapper = new PageMapper(&_accessor, _pages); + _mapper = new PageMapper(_paging->accessor(), pages); _mapper->attach(); /* Record the mapper as the latest region in the accessor. */ diff -r ec1f8f18c306 -r 3e4d7c4e617e pipe_pager.h --- a/pipe_pager.h Wed Mar 24 23:44:53 2021 +0100 +++ b/pipe_pager.h Thu Mar 25 01:42:50 2021 +0100 @@ -4,17 +4,14 @@ #include "pipe_object_interface.h" #include "pipe_paging.h" #include "pager.h" -#include "pages_conserving.h" /* A pager abstraction for a pipe. */ class PipePager : public Pager, public PipeObject { protected: - PipeAccessor _accessor; - PagesConserving *_pages; PipePaging *_paging; - bool _writer; + bool _writing; /* Helper methods. */ @@ -23,7 +20,7 @@ virtual long next_region_for_writer(offset_t *populated_size, offset_t *size); public: - explicit PipePager(PagesConserving *pages, PipePaging *paging, bool writer); + explicit PipePager(PipePaging *paging, bool writer); /* Server details. */