From 6e4ef43bf066d51d45b14e9fadb8b0008a0a9611 Mon Sep 17 00:00:00 2001 From: Martin Stein Date: Thu, 8 Jul 2021 17:46:57 +0200 Subject: [PATCH] base-hw: always use 'unsigned' for priorities At some points in the code, 'signed' was used instead of the more appropriate 'unsigned' type. Ref #4217 --- .../base-hw/src/core/kernel/cpu_scheduler.cc | 16 +++++---- repos/base-hw/src/core/kernel/cpu_scheduler.h | 36 +++++++++++-------- repos/base-hw/src/core/kernel/thread.h | 2 +- repos/base-hw/src/core/platform_thread.h | 2 +- .../core/spec/arm_v7/trustzone/kernel/vm.cc | 2 +- .../spec/arm_v7/virtualization/kernel/vm.cc | 2 +- .../spec/arm_v8/virtualization/kernel/vm.cc | 2 +- 7 files changed, 36 insertions(+), 26 deletions(-) diff --git a/repos/base-hw/src/core/kernel/cpu_scheduler.cc b/repos/base-hw/src/core/kernel/cpu_scheduler.cc index 587fa0ced2..a9ac614e5d 100644 --- a/repos/base-hw/src/core/kernel/cpu_scheduler.cc +++ b/repos/base-hw/src/core/kernel/cpu_scheduler.cc @@ -34,7 +34,7 @@ void Cpu_scheduler::_reset_claims(unsigned const p) void Cpu_scheduler::_next_round() { _residual = _quota; - _for_each_prio([&] (unsigned const p) { _reset_claims(p); }); + _for_each_prio([&] (Cpu_priority const p, bool &) { _reset_claims(p); }); } @@ -90,21 +90,23 @@ void Cpu_scheduler::_head_filled(unsigned const r) bool Cpu_scheduler::_claim_for_head() { - for (signed p = Prio::MAX; p > Prio::MIN - 1; p--) { + bool result { false }; + _for_each_prio([&] (Cpu_priority const p, bool &cancel_for_each_prio) { Double_list_item *const item { _rcl[p].head() }; if (!item) - continue; + return; Cpu_share &share { item->payload() }; if (!share._claim) - continue; + return; _set_head(share, share._claim, 1); - return 1; - } - return 0; + result = true; + cancel_for_each_prio = true; + }); + return result; } diff --git a/repos/base-hw/src/core/kernel/cpu_scheduler.h b/repos/base-hw/src/core/kernel/cpu_scheduler.h index 9fc8837733..ad8624a257 100644 --- a/repos/base-hw/src/core/kernel/cpu_scheduler.h +++ b/repos/base-hw/src/core/kernel/cpu_scheduler.h @@ -47,27 +47,28 @@ class Kernel::Cpu_priority public: - enum { - MIN = 0, - MAX = cpu_priorities - 1, - }; + static constexpr unsigned min() { return 0; } + static constexpr unsigned max() { return cpu_priorities - 1; } /** * Construct priority with value 'v' */ - Cpu_priority(signed const v) : _value(Genode::min(v, MAX)) { } + Cpu_priority(unsigned const v) + : + _value { Genode::min(v, max()) } + { } /* * Standard operators */ - Cpu_priority &operator =(signed const v) + Cpu_priority &operator =(unsigned const v) { - _value = Genode::min(v, MAX); + _value = Genode::min(v, max()); return *this; } - operator signed() const { return _value; } + operator unsigned() const { return _value; } }; @@ -79,7 +80,7 @@ class Kernel::Cpu_share Double_list_item _fill_item { *this }; Double_list_item _claim_item { *this }; - signed const _prio; + Cpu_priority const _prio; unsigned _quota; unsigned _claim; unsigned _fill { 0 }; @@ -93,7 +94,7 @@ class Kernel::Cpu_share * \param p claimed priority * \param q claimed quota */ - Cpu_share(signed const p, unsigned const q) + Cpu_share(Cpu_priority const p, unsigned const q) : _prio(p), _quota(q), _claim(q) { } /* @@ -111,8 +112,8 @@ class Kernel::Cpu_scheduler typedef Cpu_share Share; typedef Cpu_priority Prio; - Double_list _rcl[Prio::MAX + 1]; /* ready claims */ - Double_list _ucl[Prio::MAX + 1]; /* unready claims */ + Double_list _rcl[Prio::max() + 1]; /* ready claims */ + Double_list _ucl[Prio::max() + 1]; /* unready claims */ Double_list _fills { }; /* ready fills */ Share &_idle; Share *_head = nullptr; @@ -125,8 +126,15 @@ class Kernel::Cpu_scheduler bool _need_to_schedule { true }; time_t _last_time { 0 }; - template void _for_each_prio(F f) { - for (signed p = Prio::MAX; p > Prio::MIN - 1; p--) { f(p); } } + template void _for_each_prio(F f) + { + bool cancel_for_each_prio { false }; + for (unsigned p = Prio::max(); p != Prio::min() - 1; p--) { + f(p, cancel_for_each_prio); + if (cancel_for_each_prio) + return; + } + } static void _reset(Cpu_share &share); diff --git a/repos/base-hw/src/core/kernel/thread.h b/repos/base-hw/src/core/kernel/thread.h index 01b6417c93..c0636901a2 100644 --- a/repos/base-hw/src/core/kernel/thread.h +++ b/repos/base-hw/src/core/kernel/thread.h @@ -293,7 +293,7 @@ class Kernel::Thread : private Kernel::Object, public Cpu_job, private Timeout * \param label debugging label */ Thread(char const * const label) - : Thread(Cpu_priority::MIN, 0, label, true) { } + : Thread(Cpu_priority::min(), 0, label, true) { } ~Thread(); diff --git a/repos/base-hw/src/core/platform_thread.h b/repos/base-hw/src/core/platform_thread.h index 698d34c600..75018fed14 100644 --- a/repos/base-hw/src/core/platform_thread.h +++ b/repos/base-hw/src/core/platform_thread.h @@ -89,7 +89,7 @@ class Genode::Platform_thread : Noncopyable unsigned _scale_priority(unsigned virt_prio) { - return Cpu_session::scale_priority(Kernel::Cpu_priority::MAX, + return Cpu_session::scale_priority(Kernel::Cpu_priority::max(), virt_prio); } diff --git a/repos/base-hw/src/core/spec/arm_v7/trustzone/kernel/vm.cc b/repos/base-hw/src/core/spec/arm_v7/trustzone/kernel/vm.cc index 34ce968505..714c24a7c3 100644 --- a/repos/base-hw/src/core/spec/arm_v7/trustzone/kernel/vm.cc +++ b/repos/base-hw/src/core/spec/arm_v7/trustzone/kernel/vm.cc @@ -26,7 +26,7 @@ Kernel::Vm::Vm(unsigned, Identity & id) : Kernel::Object { *this }, - Cpu_job(Cpu_priority::MIN, 0), + Cpu_job(Cpu_priority::min(), 0), _state(state), _context(context), _id(id), diff --git a/repos/base-hw/src/core/spec/arm_v7/virtualization/kernel/vm.cc b/repos/base-hw/src/core/spec/arm_v7/virtualization/kernel/vm.cc index fc2f45c0be..5691068d17 100644 --- a/repos/base-hw/src/core/spec/arm_v7/virtualization/kernel/vm.cc +++ b/repos/base-hw/src/core/spec/arm_v7/virtualization/kernel/vm.cc @@ -140,7 +140,7 @@ Kernel::Vm::Vm(unsigned cpu, Identity & id) : Kernel::Object { *this }, - Cpu_job(Cpu_priority::MIN, 0), + Cpu_job(Cpu_priority::min(), 0), _state(state), _context(context), _id(id), diff --git a/repos/base-hw/src/core/spec/arm_v8/virtualization/kernel/vm.cc b/repos/base-hw/src/core/spec/arm_v8/virtualization/kernel/vm.cc index 0a3d96b1d2..08f8154d5a 100644 --- a/repos/base-hw/src/core/spec/arm_v8/virtualization/kernel/vm.cc +++ b/repos/base-hw/src/core/spec/arm_v8/virtualization/kernel/vm.cc @@ -115,7 +115,7 @@ Vm::Vm(unsigned cpu, Identity & id) : Kernel::Object { *this }, - Cpu_job(Cpu_priority::MIN, 0), + Cpu_job(Cpu_priority::min(), 0), _state(state), _context(context), _id(id),