sel4: flush vm pages on out of index pressure

re-create semantic as done before commit

"core: kernel-agnostic 'Mapping' type"

Issue #4751
This commit is contained in:
Alexander Boettcher 2023-02-04 19:00:45 +01:00 committed by Christian Helmuth
parent d089e80906
commit c8cf33a251

View File

@ -248,25 +248,31 @@ void Vm_session_component::_attach_vm_memory(Dataspace_component &dsc,
addr_t const guest_phys, addr_t const guest_phys,
Attach_attr const attribute) Attach_attr const attribute)
{ {
Vm_space::Map_attr const attr { Vm_space::Map_attr const attr_noflush {
.cached = (dsc.cacheability() == CACHED), .cached = (dsc.cacheability() == CACHED),
.write_combined = (dsc.cacheability() == WRITE_COMBINED), .write_combined = (dsc.cacheability() == WRITE_COMBINED),
.writeable = dsc.writeable() && attribute.writeable, .writeable = dsc.writeable() && attribute.writeable,
.executable = attribute.executable, .executable = attribute.executable,
.flush_support = false }; .flush_support = false };
Vm_space::Map_attr const attr_flush {
.cached = (dsc.cacheability() == CACHED),
.write_combined = (dsc.cacheability() == WRITE_COMBINED),
.writeable = dsc.writeable() && attribute.writeable,
.executable = attribute.executable,
.flush_support = true };
Flexpage_iterator flex(dsc.phys_addr() + attribute.offset, attribute.size, Flexpage_iterator flex(dsc.phys_addr() + attribute.offset, attribute.size,
guest_phys, attribute.size, guest_phys); guest_phys, attribute.size, guest_phys);
Flexpage page = flex.page(); Flexpage page = flex.page();
while (page.valid()) { while (page.valid()) {
enum { NO_FLUSH = false, FLUSH = true };
try { try {
try { try {
_vm_space.alloc_guest_page_tables(page.hotspot, 1 << page.log2_order); _vm_space.alloc_guest_page_tables(page.hotspot, 1 << page.log2_order);
_vm_space.map_guest(page.addr, page.hotspot, _vm_space.map_guest(page.addr, page.hotspot,
(1 << page.log2_order) / 4096, attr); (1 << page.log2_order) / 4096, attr_noflush);
} catch (Page_table_registry::Mapping_cache_full full) { } catch (Page_table_registry::Mapping_cache_full full) {
if (full.reason == Page_table_registry::Mapping_cache_full::MEMORY) { if (full.reason == Page_table_registry::Mapping_cache_full::MEMORY) {
if (_ram_quota_guard().limit().value > 4 * 1024 * 1024) if (_ram_quota_guard().limit().value > 4 * 1024 * 1024)
@ -299,7 +305,7 @@ void Vm_session_component::_attach_vm_memory(Dataspace_component &dsc,
} }
_vm_space.map_guest(page.addr, page.hotspot, _vm_space.map_guest(page.addr, page.hotspot,
(1 << page.log2_order) / 4096, attr); (1 << page.log2_order) / 4096, attr_flush);
} catch (Vm_space::Alloc_page_table_failed) { } catch (Vm_space::Alloc_page_table_failed) {
Genode::error("alloc page table failed"); Genode::error("alloc page table failed");
return; return;