Hello,
While I was browsing, I found that, in function Rm_session_client::detach(), there is a part that looping over Rm_client and unmap it:
for (Rm_client *rc = _clients.first(); rc; rc = rc->List<Rm_client>::Element::next()) {
/*
* XXX Unmapping managed dataspaces on kernels, which take a core-
* local virtual address as unmap argument is not supported yet.
* This is the case for Fiasco, Pistachio, and NOVA. On those
* kernels, the unmap operation must be issued for each leaf
* dataspace the managed dataspace is composed of. For kernels with
* support for directed unmap (OKL4 or Codezero), unmap can be
* simply applied for the contiguous virtual address region in the
* client.
*/
if (!platform()->supports_direct_unmap()
&& dsc->is_managed() && dsc->core_local_addr() == 0) {
PWRN("unmapping of managed dataspaces not yet supported");
break;
}
rc->unmap(dsc->core_local_addr() + region->offset(), // <=== this part
region->base(), region->size());
}
The implementation of Rm_client::unmap is the following:
void Rm_client::unmap(addr_t core_local_base, addr_t virt_base, size_t size)
{
// TODO unmap it only from target space
unmap_local(core_local_base, size >> get_page_size_log2());
}
In the above function, since it is not using any member variables of Rm_client, when Rm_session_client::detach() calls multiple of Rm_client::unmap it is just calling the same function of "unmap_local" with the same parameters.
It results in calling l4_task_unmap multiple times with the same parameters.
I'm just concern that this may not cause anything harmful.
Best,
Jaeyong