1.1 --- a/include/fsserver/accessor.h Sat Jul 04 21:56:21 2020 +0200
1.2 +++ b/include/fsserver/accessor.h Sun Jul 05 00:36:04 2020 +0200
1.3 @@ -180,6 +180,10 @@
1.4
1.5 Flexpage_map &pages_for_file() { return _flexpage_map; }
1.6
1.7 + /* Flexpage issuing finalisation methods. */
1.8 +
1.9 + void queue_flexpage(Flexpage *flexpage);
1.10 +
1.11 /* Pending flexpage management. */
1.12
1.13 void clear_pending_flexpage(Flexpage *flexpage);
2.1 --- a/lib/src/accessor.cc Sat Jul 04 21:56:21 2020 +0200
2.2 +++ b/lib/src/accessor.cc Sun Jul 05 00:36:04 2020 +0200
2.3 @@ -166,11 +166,6 @@
2.4 else
2.5 flexpage = new_flexpage(data_start, data_size, offset, hot_spot, flags);
2.6
2.7 - /* Finally, make the flexpage available for eventual reuse.
2.8 - NOTE: This should be moved until after the flexpage has been sent. */
2.9 -
2.10 - pages()->queue_flexpage(this, flexpage);
2.11 -
2.12 l4_semaphore_up(_accessor_semaphore);
2.13
2.14 return flexpage;
2.15 @@ -178,6 +173,22 @@
2.16
2.17
2.18
2.19 +/* Queue an issued flexpage after having sent it. This is the exposed method
2.20 + for finalising issued flexpages. */
2.21 +
2.22 +void PagingAccessor::queue_flexpage(Flexpage *flexpage)
2.23 +{
2.24 + /* Increment the reference count of flexpage users. */
2.25 +
2.26 + flexpage->increment();
2.27 +
2.28 + /* Finally, make the flexpage available for eventual reuse. */
2.29 +
2.30 + pages()->queue_flexpage(this, flexpage);
2.31 +}
2.32 +
2.33 +
2.34 +
2.35 /* Find a flexpage for the given details. Any found flexpage is tested for
2.36 current availability by removing it from the available queue, if possible.
2.37 If it is unavailable but pending, it is returned. If it is neither, it is
3.1 --- a/lib/src/pager.cc Sat Jul 04 21:56:21 2020 +0200
3.2 +++ b/lib/src/pager.cc Sun Jul 05 00:36:04 2020 +0200
3.3 @@ -23,29 +23,13 @@
3.4
3.5 #include <stdio.h>
3.6
3.7 +#include "dataspace_server.h"
3.8 +
3.9 #include "flexpage.h"
3.10 #include "pager.h"
3.11
3.12
3.13
3.14 -/* Return a flexpage object using the output representation. */
3.15 -
3.16 -static long _send_fpage(Flexpage *flexpage, l4_addr_t hot_spot,
3.17 - unsigned long flags, l4_snd_fpage_t *region)
3.18 -{
3.19 - /* Increment the reference count of flexpage users. */
3.20 -
3.21 - flexpage->increment();
3.22 -
3.23 - /* Provide memory in this task for use in the caller. */
3.24 -
3.25 - region->fpage = flexpage->get_fpage(flags);
3.26 - region->snd_base = hot_spot;
3.27 - return L4_EOK;
3.28 -}
3.29 -
3.30 -
3.31 -
3.32 /* Debugging helpers. */
3.33
3.34 #define DEBUG_FLEXPAGE_TABLE \
3.35 @@ -87,7 +71,21 @@
3.36
3.37 show_flexpage(flexpage, "new flexpage");
3.38
3.39 - return _send_fpage(flexpage, hot_spot, flags, region);
3.40 + /* Send the flexpage explicitly. */
3.41 +
3.42 + region->fpage = flexpage->get_fpage(flags);
3.43 + region->snd_base = hot_spot;
3.44 +
3.45 + long err = complete_Dataspace_map(*region);
3.46 +
3.47 + if (err)
3.48 + return err;
3.49 +
3.50 + /* Make the sent flexpage available for reuse. */
3.51 +
3.52 + get_accessor()->queue_flexpage(flexpage);
3.53 +
3.54 + return IPC_MESSAGE_SENT;
3.55 }
3.56
3.57