Hi Georg,

in addition to Norman's remarks I further investigated your issue
(mostly because the value 32769 which is 0x8001 puzzled me).

On 22.12.2015 14:00, Georg Guba wrote:
> This shows 0/32769 on the first print and 28672/32769 on the second
> which is exactly what you'd expect. Allocating 29 KiB with a 32 KiB
> quota, however, will throw a Quota_exceeded exception, still printing
> 0/32769 on the first print.
> 
> It seems you need about 4 KiB of spare quota but I can't seem to find
> any doc on this. How much quota should I actually reserve for simple
> allocations like this and why isn't it simply the same as the actual
> allocation size? I'd like to avoid magic numbers and wasteful allocation
> if possible.

With the patch applied I get the following output on linux_x86.

  [init -> test-printf] 0/0
  [init -> test-printf] 0/32768
  [init -> test-printf] 16384/32768

So it's 0x8000 indeed and I assume a typo on your side. But, the
actual question is: Why can't one use the final 4 KiB of the RAM
quota? The answer leads us to the implementation of
Ram_session_component in core, which dates back several years and
includes the following comment in Ram_session_component::alloc().

  /*
   * Check quota!
   *
   * In the worst case, we need to allocate a new slab block for the
   * meta data of the dataspace to be created - therefore, we add
   * the slab block size here.
   */

Unfortunately, this piece of code does not (and currently can't) use
the available bytes in the meta-data allocator but in the RAM session
itself. It is remnant of the ongoing process of decoupling RAM
allocations from meta-data handling.

Thanks for sharing your findings, we'll address the issue with

  https://github.com/genodelabs/genode/issues/1831

For now, the last 4 KiB of the RAM session quota are beyond reach,
sorry.

Regards
-- 
Christian Helmuth
Genode Labs

http://www.genode-labs.com/ · http://genode.org/
https://twitter.com/GenodeLabs · /ˈdʒiː.nəʊd/

Genode Labs GmbH · Amtsgericht Dresden · HRB 28424 · Sitz Dresden
Geschäftsführer: Dr.-Ing. Norman Feske, Christian Helmuth
 repos/base/run/printf.run          |  1 +
 repos/base/src/test/printf/main.cc | 21 +++++++++++++++++++++
 2 files changed, 22 insertions(+)

diff --git a/repos/base/run/printf.run b/repos/base/run/printf.run
index 032d3f2..70e4df1 100644
--- a/repos/base/run/printf.run
+++ b/repos/base/run/printf.run
@@ -6,6 +6,7 @@ install_config {
 	<config>
 		<parent-provides>
 			<service name="LOG"/>
+			<service name="RAM"/>
 			<service name="RM"/>
 		</parent-provides>
 		<default-route>
diff --git a/repos/base/src/test/printf/main.cc b/repos/base/src/test/printf/main.cc
index 51b617d..063e694 100644
--- a/repos/base/src/test/printf/main.cc
+++ b/repos/base/src/test/printf/main.cc
@@ -14,8 +14,29 @@
 
 #include <base/printf.h>
 
+
+#include <base/env.h>
+#include <ram_session/connection.h>
+
+static void test()
+{
+	using namespace Genode;
+
+	Ram_connection ram;
+	ram.ref_account(env()->ram_session_cap());
+	PLOG("%zu/%zu", ram.used(), ram.quota());
+
+	env()->ram_session()->transfer_quota(ram.cap(), 32*1024);
+	PLOG("%zu/%zu", ram.used(), ram.quota());
+
+	ram.alloc(16*1024);
+	PLOG("%zu/%zu", ram.used(), ram.quota());
+}
+
 int main(int argc, char **argv)
 {
+	test();
+
 	/* test that unsupported commands don't crash the printf parser */
 	Genode::printf("%#x %s\n", 0x38, "test 1");
 	Genode::printf("%#lx %s\n", 0x38L, "test 2");
------------------------------------------------------------------------------
_______________________________________________
genode-main mailing list
genode-main@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/genode-main

Reply via email to