From 6c25ced5f2ebda176f5dfb3b217c846532dd3b25 Mon Sep 17 00:00:00 2001 From: Christian Prochaska Date: Wed, 17 Oct 2012 15:50:05 +0200 Subject: [PATCH] base-nova: fix core virtual memory region leak Revert the core-local mapping created in 'Ram_session_component::_clear_ds()' and free the virtual memory region allocated for this mapping when a RAM dataspace gets freed. Fixes #416. --- base-nova/src/core/core_rm_session.cc | 3 --- base-nova/src/core/include/core_rm_session.h | 10 +++++++++- base-nova/src/core/ram_session_support.cc | 15 ++++++++++++++- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/base-nova/src/core/core_rm_session.cc b/base-nova/src/core/core_rm_session.cc index d1e2165f4..47d4e8675 100644 --- a/base-nova/src/core/core_rm_session.cc +++ b/base-nova/src/core/core_rm_session.cc @@ -36,9 +36,6 @@ Core_rm_session::attach(Dataspace_capability ds_cap, size_t size, if (!ds) throw Invalid_dataspace(); - if (size == 0) - size = ds->size(); - if (use_local_addr) { PERR("Parameter 'use_local_addr' not supported within core"); return 0UL; diff --git a/base-nova/src/core/include/core_rm_session.h b/base-nova/src/core/include/core_rm_session.h index d3a978055..a6d193721 100644 --- a/base-nova/src/core/include/core_rm_session.h +++ b/base-nova/src/core/include/core_rm_session.h @@ -37,7 +37,15 @@ namespace Genode { Local_addr local_addr = 0, bool executable = false); - void detach(Local_addr) { } + void detach(Local_addr) + { + /* + * The core-local mapping gets established in + * 'Ram_session_component::_clear_ds()' and reverted in + * 'Ram_session_component::_revoke_ram_ds(), so there's + * nothing to do here. + */ + } Pager_capability add_client(Thread_capability thread) { return Pager_capability(); } diff --git a/base-nova/src/core/ram_session_support.cc b/base-nova/src/core/ram_session_support.cc index 031be9023..2f5bbc698 100644 --- a/base-nova/src/core/ram_session_support.cc +++ b/base-nova/src/core/ram_session_support.cc @@ -29,7 +29,20 @@ enum { verbose_ram_ds = false }; using namespace Genode; void Ram_session_component::_export_ram_ds(Dataspace_component *ds) { } -void Ram_session_component::_revoke_ram_ds(Dataspace_component *ds) { } + +void Ram_session_component::_revoke_ram_ds(Dataspace_component *ds) +{ + size_t page_rounded_size = (ds->size() + get_page_size() - 1) & get_page_mask(); + + unmap_local((Nova::Utcb *)Thread_base::myself()->utcb(), + ds->core_local_addr(), + page_rounded_size >> get_page_size_log2()); + + platform()->region_alloc()->free((void*)ds->core_local_addr(), + page_rounded_size); + + ds->assign_core_local_addr(0); +} void Ram_session_component::_clear_ds(Dataspace_component *ds) {