1.1 --- a/dstest_pipe_client.cc Wed Mar 24 23:44:53 2021 +0100
1.2 +++ b/dstest_pipe_client.cc Thu Mar 25 01:42:50 2021 +0100
1.3 @@ -51,6 +51,10 @@
1.4 }
1.5 }
1.6
1.7 +
1.8 +
1.9 +const unsigned int PIPE_PAGES = 2;
1.10 +
1.11 int main(void)
1.12 {
1.13 /* Obtain access to the filesystem. */
1.14 @@ -60,7 +64,7 @@
1.15 /* Invoke the open method to receive the file reference. */
1.16
1.17 file_t reader, writer;
1.18 - long err = pipe_open(&reader, &writer, server);
1.19 + long err = pipe_open(page(PIPE_PAGES), &reader, &writer, server);
1.20
1.21 if (err)
1.22 {
2.1 --- a/dstest_pipe_server.cc Wed Mar 24 23:44:53 2021 +0100
2.2 +++ b/dstest_pipe_server.cc Thu Mar 25 01:42:50 2021 +0100
2.3 @@ -24,22 +24,19 @@
2.4 #include <stdio.h>
2.5
2.6 #include "memory.h"
2.7 -#include "pages_conserving.h"
2.8 #include "pipe_opener_resource.h"
2.9 #include "resource_server.h"
2.10
2.11
2.12
2.13 const unsigned int MEMORY_PAGES = 20;
2.14 -const unsigned int PIPE_PAGES = 2;
2.15
2.16 int main(void)
2.17 {
2.18 /* Some memory plus infrastructure. */
2.19
2.20 Memory mem(MEMORY_PAGES);
2.21 - PagesConserving pages(&mem, PIPE_PAGES);
2.22 - PipeOpenerResource opener(&pages);
2.23 + PipeOpenerResource opener;
2.24
2.25 /* Register a server associating it with the given object. */
2.26
3.1 --- a/file.cc Wed Mar 24 23:44:53 2021 +0100
3.2 +++ b/file.cc Thu Mar 25 01:42:50 2021 +0100
3.3 @@ -235,14 +235,14 @@
3.4
3.5 /* Open two pipe endpoints using the given pipe server. */
3.6
3.7 -long pipe_open(file_t *reader, file_t *writer, l4_cap_idx_t server)
3.8 +long pipe_open(offset_t size, file_t *reader, file_t *writer, l4_cap_idx_t server)
3.9 {
3.10 client_PipeOpener opener(server);
3.11
3.12 file_init(reader);
3.13 file_init(writer);
3.14
3.15 - long err = opener.pipe(&reader->ref, &writer->ref);
3.16 + long err = opener.pipe(size, &reader->ref, &writer->ref);
3.17 if (err)
3.18 return err;
3.19
4.1 --- a/file.h Wed Mar 24 23:44:53 2021 +0100
4.2 +++ b/file.h Thu Mar 25 01:42:50 2021 +0100
4.3 @@ -82,7 +82,7 @@
4.4
4.5 /* Pipe operations. */
4.6
4.7 -long pipe_open(file_t *reader, file_t *writer, l4_cap_idx_t server);
4.8 +long pipe_open(offset_t size, file_t *reader, file_t *writer, l4_cap_idx_t server);
4.9
4.10 /* Pipe region operations. */
4.11
5.1 --- a/files/pipe_paging.cc Wed Mar 24 23:44:53 2021 +0100
5.2 +++ b/files/pipe_paging.cc Thu Mar 25 01:42:50 2021 +0100
5.3 @@ -1,6 +1,7 @@
5.4 #include "pipe_paging.h"
5.5
5.6 -PipePaging::PipePaging()
5.7 +PipePaging::PipePaging(offset_t size)
5.8 +: _size(size)
5.9 {
5.10 }
5.11
5.12 @@ -25,6 +26,11 @@
5.13 {
5.14 if (_regions.size() > 1)
5.15 {
5.16 + /* Discard the accessor from the current region. */
5.17 +
5.18 + if (_accessors.size() > _regions.size())
5.19 + _accessors.pop_front();
5.20 +
5.21 _regions.pop_front();
5.22 return _regions.front();
5.23 }
5.24 @@ -32,4 +38,14 @@
5.25 return NULL;
5.26 }
5.27
5.28 +/* Initialise an accessor for a region. */
5.29 +
5.30 +PipeAccessor *PipePaging::accessor()
5.31 +{
5.32 + PipeAccessor accessor;
5.33 +
5.34 + _accessors.push_back(accessor);
5.35 + return &_accessors.back();
5.36 +}
5.37 +
5.38 // vim: tabstop=4 expandtab shiftwidth=4
6.1 --- a/files/pipe_paging.h Wed Mar 24 23:44:53 2021 +0100
6.2 +++ b/files/pipe_paging.h Thu Mar 25 01:42:50 2021 +0100
6.3 @@ -3,6 +3,8 @@
6.4 #include <list>
6.5
6.6 #include "page_mapper.h"
6.7 +#include "pages_conserving.h"
6.8 +#include "pipe_accessor.h"
6.9
6.10 /* Pipe paging support, maintaining the sequence of active regions or sections
6.11 in a pipe. */
6.12 @@ -10,16 +12,33 @@
6.13 class PipePaging
6.14 {
6.15 protected:
6.16 + PagesConserving _pages;
6.17 +
6.18 + /* Regions acting as files with their own accessors. */
6.19 +
6.20 std::list<PageMapper *> _regions;
6.21 + std::list<PipeAccessor> _accessors;
6.22 +
6.23 + /* Pipe section/region size. */
6.24 +
6.25 + offset_t _size;
6.26
6.27 public:
6.28 - explicit PipePaging();
6.29 + explicit PipePaging(offset_t size);
6.30
6.31 virtual void add_region(PageMapper *mapper);
6.32
6.33 virtual PageMapper *first_region();
6.34
6.35 virtual PageMapper *next_region();
6.36 +
6.37 + virtual PipeAccessor *accessor();
6.38 +
6.39 + virtual PagesConserving *pages()
6.40 + { return &_pages; }
6.41 +
6.42 + virtual offset_t region_size()
6.43 + { return _size; }
6.44 };
6.45
6.46 // vim: tabstop=4 expandtab shiftwidth=4
7.1 --- a/pages_conserving.cc Wed Mar 24 23:44:53 2021 +0100
7.2 +++ b/pages_conserving.cc Thu Mar 25 01:42:50 2021 +0100
7.3 @@ -1,12 +1,12 @@
7.4 #include "pages_conserving.h"
7.5
7.6 -PagesConserving::PagesConserving(Memory *memory, unsigned int increment)
7.7 -: Pages(memory), _increment(increment)
7.8 +PagesConserving::PagesConserving(Memory *memory)
7.9 +: Pages(memory)
7.10 {
7.11 }
7.12
7.13 PagesConserving::PagesConserving()
7.14 -: Pages(), _increment(1)
7.15 +: Pages()
7.16 {
7.17 }
7.18
7.19 @@ -42,7 +42,7 @@
7.20
7.21 /* Decrease the provision of flexpages to pipes. */
7.22
7.23 -bool PagesConserving::decrease()
7.24 +bool PagesConserving::decrease(offset_t size)
7.25 {
7.26 // NOTE: Need to remove flexpages from the queue.
7.27 // NOTE: This might need to happen incrementally in case some pages are not
7.28 @@ -54,15 +54,15 @@
7.29 /* Increase the provision of flexpages to pipes, returning whether allocation
7.30 succeeded. */
7.31
7.32 -bool PagesConserving::increase()
7.33 +bool PagesConserving::increase(offset_t size)
7.34 {
7.35 - unsigned int regions = _increment;
7.36 + offset_t allocated_size = 0;
7.37 std::list<Region *> allocated;
7.38 std::list<Region *>::iterator it;
7.39
7.40 /* Allocate regions for the defined increment value. */
7.41
7.42 - while (regions)
7.43 + while (allocated_size < size)
7.44 {
7.45 Region *r = _memory->region();
7.46
7.47 @@ -77,7 +77,7 @@
7.48 }
7.49
7.50 allocated.push_back(r);
7.51 - regions--;
7.52 + allocated_size += r->size();
7.53 }
7.54
7.55 /* Queue flexpages for the regions. */
7.56 @@ -88,11 +88,4 @@
7.57 return true;
7.58 }
7.59
7.60 -/* Return the allocation increment. */
7.61 -
7.62 -offset_t PagesConserving::allocation()
7.63 -{
7.64 - return _memory->region_size() * _increment;
7.65 -}
7.66 -
7.67 // vim: tabstop=4 expandtab shiftwidth=4
8.1 --- a/pages_conserving.h Wed Mar 24 23:44:53 2021 +0100
8.2 +++ b/pages_conserving.h Thu Mar 25 01:42:50 2021 +0100
8.3 @@ -9,11 +9,8 @@
8.4
8.5 class PagesConserving : public Pages
8.6 {
8.7 -protected:
8.8 - unsigned int _increment;
8.9 -
8.10 public:
8.11 - explicit PagesConserving(Memory *memory, unsigned int increment=1);
8.12 + explicit PagesConserving(Memory *memory);
8.13
8.14 explicit PagesConserving();
8.15
8.16 @@ -27,11 +24,9 @@
8.17
8.18 /* Memory control methods. */
8.19
8.20 - virtual bool decrease();
8.21 + virtual bool decrease(offset_t size);
8.22
8.23 - virtual bool increase();
8.24 -
8.25 - virtual offset_t allocation();
8.26 + virtual bool increase(offset_t size);
8.27 };
8.28
8.29 // vim: tabstop=4 expandtab shiftwidth=4
9.1 --- a/pipe_opener_resource.cc Wed Mar 24 23:44:53 2021 +0100
9.2 +++ b/pipe_opener_resource.cc Thu Mar 25 01:42:50 2021 +0100
9.3 @@ -7,8 +7,7 @@
9.4
9.5 /* Support for providing access to pipes. */
9.6
9.7 -PipeOpenerResource::PipeOpenerResource(PagesConserving *pages)
9.8 -: _pages(pages)
9.9 +PipeOpenerResource::PipeOpenerResource()
9.10 {
9.11 }
9.12
9.13 @@ -26,11 +25,11 @@
9.14
9.15 /* Pipe opener interface methods. */
9.16
9.17 -long PipeOpenerResource::pipe(l4_cap_idx_t *reader, l4_cap_idx_t *writer)
9.18 +long PipeOpenerResource::pipe(offset_t size, l4_cap_idx_t *reader, l4_cap_idx_t *writer)
9.19 {
9.20 /* Both endpoints will employ a common paging coordinator. */
9.21
9.22 - PipePaging *paging = new PipePaging();
9.23 + PipePaging *paging = new PipePaging(size);
9.24
9.25 /* Each endpoint will have its own pager. */
9.26
9.27 @@ -41,9 +40,9 @@
9.28 return open_endpoint(paging, false, reader) || open_endpoint(paging, true, writer);
9.29 }
9.30
9.31 -long PipeOpenerResource::open_endpoint(PipePaging *paging, bool writer, l4_cap_idx_t *endpoint)
9.32 +long PipeOpenerResource::open_endpoint(PipePaging *paging, bool writing, l4_cap_idx_t *endpoint)
9.33 {
9.34 - PipePager *pager = new PipePager(_pages, paging, writer);
9.35 + PipePager *pager = new PipePager(paging, writing);
9.36
9.37 /* Start the endpoint server in a new thread.
9.38 If the thread does not start, the resource should be finalised. */
10.1 --- a/pipe_opener_resource.h Wed Mar 24 23:44:53 2021 +0100
10.2 +++ b/pipe_opener_resource.h Thu Mar 25 01:42:50 2021 +0100
10.3 @@ -1,6 +1,5 @@
10.4 #pragma once
10.5
10.6 -#include "pages_conserving.h"
10.7 #include "pipe_opener_interface.h"
10.8 #include "pipe_paging.h"
10.9 #include "resource.h"
10.10 @@ -10,12 +9,10 @@
10.11 class PipeOpenerResource : public Resource, public PipeOpener
10.12 {
10.13 protected:
10.14 - PagesConserving *_pages;
10.15 -
10.16 - long open_endpoint(PipePaging *paging, bool writer, l4_cap_idx_t *endpoint);
10.17 + long open_endpoint(PipePaging *paging, bool writing, l4_cap_idx_t *endpoint);
10.18
10.19 public:
10.20 - explicit PipeOpenerResource(PagesConserving *pages);
10.21 + explicit PipeOpenerResource();
10.22
10.23 /* Server details. */
10.24
10.25 @@ -28,7 +25,7 @@
10.26
10.27 /* PipeOpener interface methods. */
10.28
10.29 - long pipe(l4_cap_idx_t *reader, l4_cap_idx_t *writer);
10.30 + long pipe(offset_t size, l4_cap_idx_t *reader, l4_cap_idx_t *writer);
10.31 };
10.32
10.33 // vim: tabstop=4 expandtab shiftwidth=4
11.1 --- a/pipe_pager.cc Wed Mar 24 23:44:53 2021 +0100
11.2 +++ b/pipe_pager.cc Thu Mar 25 01:42:50 2021 +0100
11.3 @@ -5,14 +5,13 @@
11.4 access to loaded pages. At first, no mapper will be configured: this must be
11.5 done by requesting a region. */
11.6
11.7 -PipePager::PipePager(PagesConserving *pages, PipePaging *paging, bool writer)
11.8 -: Pager(NULL, writer ? L4_FPAGE_RW : L4_FPAGE_RO),
11.9 - _pages(pages), _paging(paging), _writer(writer)
11.10 +PipePager::PipePager(PipePaging *paging, bool writing)
11.11 +: Pager(NULL, writing ? L4_FPAGE_RW : L4_FPAGE_RO),
11.12 + _paging(paging), _writing(writing)
11.13 {
11.14 - /* Set the size of each paged region to the amount allocation for such
11.15 - regions. */
11.16 + /* Initialise the size of the paged region. */
11.17
11.18 - _size = _pages->allocation();
11.19 + _size = _paging->region_size();
11.20 }
11.21
11.22 int PipePager::expected_items()
11.23 @@ -56,7 +55,7 @@
11.24 {
11.25 /* Obtain a new region if writing. */
11.26
11.27 - if (_writer)
11.28 + if (_writing)
11.29 return next_region_for_writer(populated_size, size);
11.30 else
11.31 return next_region_for_reader(populated_size, size);
11.32 @@ -102,12 +101,14 @@
11.33
11.34 /* A guaranteed amount of memory is reserved for the pipe. */
11.35
11.36 - if (!_pages->increase())
11.37 + PagesConserving *pages = _paging->pages();
11.38 +
11.39 + if (!pages->increase(_size))
11.40 return -L4_ENOMEM;
11.41
11.42 /* Set the page mapper for the region. */
11.43
11.44 - _mapper = new PageMapper(&_accessor, _pages);
11.45 + _mapper = new PageMapper(_paging->accessor(), pages);
11.46 _mapper->attach();
11.47
11.48 /* Record the mapper as the latest region in the accessor. */
12.1 --- a/pipe_pager.h Wed Mar 24 23:44:53 2021 +0100
12.2 +++ b/pipe_pager.h Thu Mar 25 01:42:50 2021 +0100
12.3 @@ -4,17 +4,14 @@
12.4 #include "pipe_object_interface.h"
12.5 #include "pipe_paging.h"
12.6 #include "pager.h"
12.7 -#include "pages_conserving.h"
12.8
12.9 /* A pager abstraction for a pipe. */
12.10
12.11 class PipePager : public Pager, public PipeObject
12.12 {
12.13 protected:
12.14 - PipeAccessor _accessor;
12.15 - PagesConserving *_pages;
12.16 PipePaging *_paging;
12.17 - bool _writer;
12.18 + bool _writing;
12.19
12.20 /* Helper methods. */
12.21
12.22 @@ -23,7 +20,7 @@
12.23 virtual long next_region_for_writer(offset_t *populated_size, offset_t *size);
12.24
12.25 public:
12.26 - explicit PipePager(PagesConserving *pages, PipePaging *paging, bool writer);
12.27 + explicit PipePager(PipePaging *paging, bool writer);
12.28
12.29 /* Server details. */
12.30