Hello Bob,
Am 02.12.2015 um 15:17 schrieb Bob Stewart:
I just upgraded from 15.02 to 15.11 and ran my base-hw based os and
applications, which have been running for some time on 15.02. The changes made during the update were to the directory structure required by the "platform" changes and gpio driver changes to accomodate the removal of the wait_for_irq method.
It's nice to hear that you already got your hands on the new release :)
immediately after init starts I get a "quota execeeded"mesage:
Starting kernel ...
kernel initialized Genode 15.11 <local changes> int main(): --- create local services --- int main(): --- start init --- int main(): transferred 501 MB to init int main(): --- init created, waiting for exit condition --- Quota exceeded! amount=12288, size=12288, consumed=12288 [init -> uart_drv] int main(int, char**): --- OMAP3 UART driver started --- [init -> ctrl_module] --- Beaglebone Control Module Server --- [init -> platform_drv] --- bbb platform driver running --- [init -> pwm_drv] --- am33xx pwm driver --- . , ,
No changes have been made to available ram constants in board_base so I'm confused as to what caused this message to be generated. Did I miss a change to how quota's are requested and managed?
Since 15.05, the accounting of quota on base-hw got much more comprehensive. Most notably, for the costs of PD related things like the page tables [1] or the local representations of capabilities [2] a component must now pay via quota. I assume that your "Quota exceeded" is printed by the Allocator_guard [3] (Otherwise it could only be a 'loader' server component which is unlikely).
The basic sessions (say those of the Genode environment) are given an initial amount of quota. This amount is a guess on how much is needed to bring the component up. If this quota does not suffice, the session asks the parent to upgrade it by using some of the components slack quota. If its slack quota isn't sufficient for that, the component still may ask its parent to donate some more. So, the quota you assign to a component via the init configuration is the guaranteed minimum the component receives. Init may or may not - depending from what is left after starting all children and saving some quota for itself - hand in more quota to components if they ask for.
During these mechanisms, the Allocator_guard is the one that applies given quota limits to allocations by wrapping the background allocator. That said, the warning indicates that you've reached a limit but it does not necessarily indicate a problem as, in return, your scenario may be able to relax the limit.
And even more, there are places in Genode where reaching the limit is expected. My favourite explanation in your case is the upgrade_pd_session_quota function that triggers such behaviour. It is, for example, called when receiving capabilities in IPC and not having enough PD quota to create local references [4]. It results in a call of Capability_space::upgrade_slab in core [5]. This function currently allocates as much additional SLAB blocks as possible and, by doing so, always triggers the warning. The reason for this is that it's hard to measure how much additional blocks are needed at this point. Maybe you could give it a try and test if this is responsible for your warning.
If so, the warning is no problem and I wonder whether your scenario runs properly apart from it. It would also be interesting to know whether you've sent the complete log output (what is the meaning of the point and the commas?). Please note that we're already planning to change output behaviour on reaching quota limits as it provides little information and can obviously be misleading.
Cheers, Martin
[1] Commit cc58b11 hw: replace page table allocator with static one [2] Commit e081554 hw: kernel backed capabilities (Fix #1443) [3] repos/base/include/base/allocator_guard.h [4] repos/base-hw/src/base/ipc/ipc.cc [5] repos/base-hw/src/core/platform_pd.cc