From a7bc8bac9a9f066c5ed70feff5754dee61be599e Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Mon, 10 Feb 2014 15:28:12 +0100 Subject: [PATCH] nova: support usage of priorities in Genode/Nova Enables finally the usage of priorities on base-nova. Fixes #986 --- base-nova/include/nova/syscall-generic.h | 2 +- base-nova/src/core/include/platform_thread.h | 1 + base-nova/src/core/irq_session_component.cc | 2 +- base-nova/src/core/platform_thread.cc | 11 +++++++---- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/base-nova/include/nova/syscall-generic.h b/base-nova/include/nova/syscall-generic.h index 9c11b080b..dcb9ce76e 100644 --- a/base-nova/include/nova/syscall-generic.h +++ b/base-nova/include/nova/syscall-generic.h @@ -404,7 +404,7 @@ namespace Nova { public: - enum { DEFAULT_QUANTUM = 10000, DEFAULT_PRIORITY = 1 }; + enum { DEFAULT_QUANTUM = 10000, DEFAULT_PRIORITY = 64 }; Qpd(mword_t quantum = DEFAULT_QUANTUM, mword_t priority = DEFAULT_PRIORITY) diff --git a/base-nova/src/core/include/platform_thread.h b/base-nova/src/core/include/platform_thread.h index 0f6b58f31..e707219ba 100644 --- a/base-nova/src/core/include/platform_thread.h +++ b/base-nova/src/core/include/platform_thread.h @@ -44,6 +44,7 @@ namespace Genode { WORKER = 0x4U, }; uint8_t _features; + uint8_t _priority; char _name[Thread_base::Context::NAME_LEN]; diff --git a/base-nova/src/core/irq_session_component.cc b/base-nova/src/core/irq_session_component.cc index f5b96c4ae..adf5f76f2 100644 --- a/base-nova/src/core/irq_session_component.cc +++ b/base-nova/src/core/irq_session_component.cc @@ -98,7 +98,7 @@ class Irq_thread : public Thread_base /* create SC */ unsigned sc_sel = cap_map()->insert(); - res = create_sc(sc_sel, pd_sel, _tid.ec_sel, Qpd()); + res = create_sc(sc_sel, pd_sel, _tid.ec_sel, Qpd(Qpd::DEFAULT_QUANTUM, Qpd::DEFAULT_PRIORITY + 1)); if (res != NOVA_OK) { PERR("%p - create_sc returned returned %d", this, res); throw Cpu_session::Thread_creation_failed(); diff --git a/base-nova/src/core/platform_thread.cc b/base-nova/src/core/platform_thread.cc index dae419408..ce46e7ae3 100644 --- a/base-nova/src/core/platform_thread.cc +++ b/base-nova/src/core/platform_thread.cc @@ -154,7 +154,8 @@ int Platform_thread::start(void *ip, void *sp) _pager->initial_esp((addr_t)sp); /* let the thread run */ - res = create_sc(_sel_sc(), pd_sel, _sel_ec(), Qpd()); + res = create_sc(_sel_sc(), pd_sel, _sel_ec(), + Qpd(Qpd::DEFAULT_QUANTUM, _priority)); if (res != NOVA_OK) { /* * Reset pd cap since thread got not running and pd cap will @@ -208,7 +209,8 @@ void Platform_thread::resume() using namespace Nova; if (!is_worker()) { - uint8_t res = create_sc(_sel_sc(), _pd->pd_sel(), _sel_ec(), Qpd()); + uint8_t res = create_sc(_sel_sc(), _pd->pd_sel(), _sel_ec(), + Qpd(Qpd::DEFAULT_QUANTUM, _priority)); if (res == NOVA_OK) return; } @@ -287,11 +289,12 @@ Weak_ptr Platform_thread::address_space() } -Platform_thread::Platform_thread(const char *name, unsigned, int thread_id) +Platform_thread::Platform_thread(const char *name, unsigned prio, int thread_id) : _pd(0), _pager(0), _id_base(cap_map()->insert(1)), _sel_exc_base(Native_thread::INVALID_INDEX), _location(boot_cpu(), 0, 0, 0), - _features(0) + _features(0), + _priority(Cpu_session::scale_priority(Nova::Qpd::DEFAULT_PRIORITY, prio)) { strncpy(_name, name, sizeof(_name)); }