Hi Sid,

On 2025-05-27 08:24, Sid Hussmann via users wrote:
I want to determine the total resources consumed within a deeply
nested subsystem. The only apparent way to do this is to iterate
through all the init state reports of the children and their
ancestors down to the leaf and accumulate the respective `ram_used`
and `caps_used` attributes of the `child` nodes. Is this the way? >
Intuitively, the parent at the tree's root should be aware of this
information. However, after digging through the documentation and the
code, I found that this `total_ram_used`/`total_caps_used`
information is not available out of the box within an init
component/sandbox library. I assume the reason for this is that there
is no (easy) way to communicate this information all the way back to
the parent.
your intuition is right. The top-level init instance has in principle all the strings in hand because it has created the PD sessions of all children, grandchildren, etc. in the first place. E.g., when enabling the reporting of the requested sessions via

  <report requested="yes"/>

you can in fact observe all the PD sessions with their corresponding labels. You can try this live at home on Sculpt OS by editing /config/managed/runtime in the inspect view and then looking at the resulting /report/runtime/state.

The labels reveal the component topology. What's missing from the report is the live status of the 'ram' and 'caps' for the PD sessions. The reported amounts show merely the session quotas (the quota donated at session-creation time and via Parent::upgrade). But quota transferred from one PD to another via 'Pd_account::transfer_quota' is not covered because init is not involved in such transfers.

However, since init has all the PD capabilities at hand, it could in principle ask each PD for its live 'ram_quota' and 'used_ram' via the corresponding RPCs. E.g., as a quick hack you could add such details to the reporting at sandbox/child.cc [1] by inspecting the session.service().name() for "PD" and then, once you know that the session is a PD session, cast the corresponding 'Session_state::cap' to a 'Capability<Pd_session>' (via 'static_cap_cast') and issue the RPC call of interest.

Note, however, that those RPCs are not for free. Depending on the complexity of the scenario and the rate of reporting, the querying may induce unwelcome overhead.

[1] https://github.com/genodelabs/genode/blob/master/repos/os/src/lib/sandbox/child.cc#L425

An alternative way would be the wrapping of core's PD service as done by the monitor component (look out for 'Inferior_pd'). The monitor thereby sits in-between each monitored component and core's PD service. Hence, it can observe all interactions including 'transfer_quota' between PDs.

Is my assumption correct that the only way to determine a subsystem's
resource consumption is to aggregate the init state reports down to
the leaf?

The two approaches sketched above are preferable because one gets all the information at a central point instead of relying on the good will and the enabled reporting of all the nested init instances.

In your position, I would try implementing the feature using the sandbox API, taking inspiration from the monitor component. But your component will be _much_ simpler. Like the monitor, you can then use your component as a drop-in replacement of init.

Cheers
Norman

--
Dr.-Ing. Norman Feske
Genode Labs

https://www.genode-labs.com · https://genode.org

Genode Labs GmbH · Amtsgericht Dresden · HRB 28424 · Sitz Dresden
Geschäftsführer: Dr.-Ing. Norman Feske, Christian Helmuth

_______________________________________________
users mailing list -- users@lists.genode.org
To unsubscribe send an email to users-le...@lists.genode.org
Archived at 
https://lists.genode.org/mailman3/hyperkitty/list/users@lists.genode.org/message/WHCT7K6QHVDLXBVGMONTDPHRJM2T4JDC/

Reply via email to