From e53ba5ee3e8659200e3ffb9761d88940ee24dc40 Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Wed, 24 Aug 2016 15:18:49 +0200 Subject: [PATCH] nova: avoid SC kernel warnings in core Fixes #2073 --- .../src/core/include/platform_thread.h | 2 + repos/base-nova/src/core/platform_thread.cc | 42 +++++++++---------- 2 files changed, 23 insertions(+), 21 deletions(-) diff --git a/repos/base-nova/src/core/include/platform_thread.h b/repos/base-nova/src/core/include/platform_thread.h index 92ab26946..485c1fab9 100644 --- a/repos/base-nova/src/core/include/platform_thread.h +++ b/repos/base-nova/src/core/include/platform_thread.h @@ -44,6 +44,7 @@ namespace Genode { MAIN_THREAD = 0x1U, VCPU = 0x2U, WORKER = 0x4U, + SC_CREATED = 0x8U, }; uint8_t _features; uint8_t _priority; @@ -58,6 +59,7 @@ namespace Genode { inline bool main_thread() const { return _features & MAIN_THREAD; } inline bool vcpu() const { return _features & VCPU; } inline bool worker() const { return _features & WORKER; } + inline bool sc_created() const { return _features & SC_CREATED; } public: diff --git a/repos/base-nova/src/core/platform_thread.cc b/repos/base-nova/src/core/platform_thread.cc index 5dc342b4a..74c642e79 100644 --- a/repos/base-nova/src/core/platform_thread.cc +++ b/repos/base-nova/src/core/platform_thread.cc @@ -181,7 +181,8 @@ int Platform_thread::start(void *ip, void *sp) error("create_sc returned ", res); goto cleanup_ec; - } + } else + _features |= SC_CREATED; return 0; @@ -210,24 +211,26 @@ void Platform_thread::resume() { using namespace Nova; - if (!worker()) { - uint8_t res; - do { - if (!_pd) { - error("protection domain undefined - resuming thread failed"); - return; - } - res = create_sc(_sel_sc(), _pd->pd_sel(), _sel_ec(), - Qpd(Qpd::DEFAULT_QUANTUM, _priority)); - } while (res == Nova::NOVA_PD_OOM && Nova::NOVA_OK == _pager->handle_oom()); - - if (res == NOVA_OK) return; + if (worker() || sc_created()) { + if (_pager) + _pager->wake_up(); + return; } - if (!_pager) return; + uint8_t res; + do { + if (!_pd) { + error("protection domain undefined - resuming thread failed"); + return; + } + res = create_sc(_sel_sc(), _pd->pd_sel(), _sel_ec(), + Qpd(Qpd::DEFAULT_QUANTUM, _priority)); + } while (res == Nova::NOVA_PD_OOM && Nova::NOVA_OK == _pager->handle_oom()); - /* Thread was paused beforehand and blocked in pager - wake up pager */ - _pager->wake_up(); + if (res == NOVA_OK) + _features |= SC_CREATED; + else + error("create_sc failed ", res); } @@ -315,11 +318,8 @@ unsigned long long Platform_thread::execution_time() const { unsigned long long time = 0; - /* - * For local ECs, we simply return 0 as local ECs are executed with the - * time of their callers. - */ - if (worker()) + /* for ECs without a SC we simply return 0 */ + if (!sc_created()) return time; uint8_t res = Nova::sc_ctrl(_sel_sc(), time);