From 308f594e2a5d3674bd019a7620e193ab0a845e6f Mon Sep 17 00:00:00 2001 From: Pawel Dziepak Date: Wed, 20 Nov 2013 23:32:40 +0100 Subject: [PATCH] kernel, libroot: Make scheduler modes interface public --- headers/os/kernel/scheduler.h | 11 +++++++++ headers/private/kernel/kscheduler.h | 9 +++---- headers/private/system/syscalls.h | 3 +++ .../processcontroller/ProcessController.cpp | 24 +++++++++++++++++++ src/system/kernel/scheduler/scheduler.cpp | 23 +++++++++++++----- src/system/libroot/os/scheduler.c | 14 +++++++++++ 6 files changed, 74 insertions(+), 10 deletions(-) diff --git a/headers/os/kernel/scheduler.h b/headers/os/kernel/scheduler.h index f55eb2ff57..be3508775e 100644 --- a/headers/os/kernel/scheduler.h +++ b/headers/os/kernel/scheduler.h @@ -49,6 +49,11 @@ enum be_task_flags { B_MIDI_PROCESSING = 0x800 }; +enum scheduler_mode { + SCHEDULER_MODE_LOW_LATENCY, + SCHEDULER_MODE_POWER_SAVING, +}; + #if defined(__cplusplus) extern "C" { @@ -58,6 +63,9 @@ int32 suggest_thread_priority(uint32 task_flags = B_DEFAULT_MEDIA_PRIORITY, bigtime_t estimate_max_scheduling_latency(thread_id th = -1); /* default is current thread */ +status_t set_scheduler_mode(int32 mode); +int32 get_scheduler_mode(void); + } #else @@ -67,6 +75,9 @@ int32 suggest_thread_priority(uint32 what, int32 period, bigtime_t jitter, bigtime_t estimate_max_scheduling_latency(thread_id th); /* default is current thread */ +status_t set_scheduler_mode(int32 mode); +int32 get_scheduler_mode(void); + #endif #endif // SCHEDULER_H diff --git a/headers/private/kernel/kscheduler.h b/headers/private/kernel/kscheduler.h index dc2bb88093..92a82e9ccc 100644 --- a/headers/private/kernel/kscheduler.h +++ b/headers/private/kernel/kscheduler.h @@ -18,12 +18,10 @@ struct scheduling_analysis; struct SchedulerListener; -typedef enum scheduler_mode { +enum scheduler_mode { SCHEDULER_MODE_LOW_LATENCY, SCHEDULER_MODE_POWER_SAVING, - // ... - SCHEDULER_MODE_COUNT -} scheduler_mode; +}; #ifdef __cplusplus @@ -95,6 +93,9 @@ bigtime_t _user_estimate_max_scheduling_latency(thread_id thread); status_t _user_analyze_scheduling(bigtime_t from, bigtime_t until, void* buffer, size_t size, struct scheduling_analysis* analysis); +status_t _user_set_scheduler_mode(int32 mode); +int32 _user_get_scheduler_mode(void); + #ifdef __cplusplus } #endif diff --git a/headers/private/system/syscalls.h b/headers/private/system/syscalls.h index 438a3ea310..6b1abb6b0b 100644 --- a/headers/private/system/syscalls.h +++ b/headers/private/system/syscalls.h @@ -192,6 +192,9 @@ extern status_t _kern_unblock_threads(thread_id* threads, uint32 count, extern bigtime_t _kern_estimate_max_scheduling_latency(thread_id thread); +extern status_t _kern_set_scheduler_mode(int32 mode); +extern int32 _kern_get_scheduler_mode(void); + // user/group functions extern gid_t _kern_getgid(bool effective); extern uid_t _kern_getuid(bool effective); diff --git a/src/apps/processcontroller/ProcessController.cpp b/src/apps/processcontroller/ProcessController.cpp index 4925f065f3..3987582371 100644 --- a/src/apps/processcontroller/ProcessController.cpp +++ b/src/apps/processcontroller/ProcessController.cpp @@ -42,6 +42,7 @@ #include #include +#include #include #include "AutoIcon.h" @@ -441,6 +442,14 @@ ProcessController::MessageReceived(BMessage *message) break; } + case 'Schd': + { + int32 mode; + if (message->FindInt32 ("mode", &mode) == B_OK) + set_scheduler_mode(mode); + break; + } + case B_ABOUT_REQUESTED: AboutRequested(); break; @@ -786,6 +795,21 @@ thread_popup(void *arg) addtopbottom (new BSeparatorItem ()); } + // Scheduler modes + static const char* schedulerModes[] = { "Low Latency", "Power Saving" }; + unsigned int modesCount = sizeof(schedulerModes) / sizeof(const char*); + int32 currentMode = get_scheduler_mode(); + for (unsigned int i = 0; i < modesCount; i++) { + BMessage* m = new BMessage('Schd'); + m->AddInt32("mode", i); + item = new BMenuItem(B_TRANSLATE(schedulerModes[i]), m); + if ((uint32)currentMode == i) + item->SetMarked(true); + item->SetTarget(gPCView); + addtopbottom(item); + } + addtopbottom(new BSeparatorItem()); + if (!be_roster->IsRunning(kTrackerSig)) { item = new IconMenuItem(gPCView->fTrackerIcon, B_TRANSLATE("Restart Tracker"), new BMessage('Trac')); diff --git a/src/system/kernel/scheduler/scheduler.cpp b/src/system/kernel/scheduler/scheduler.cpp index aacd89d35d..b8f738d695 100644 --- a/src/system/kernel/scheduler/scheduler.cpp +++ b/src/system/kernel/scheduler/scheduler.cpp @@ -43,8 +43,9 @@ static bool sSchedulerEnabled; SchedulerListenerList gSchedulerListeners; spinlock gSchedulerListenersLock = B_SPINLOCK_INITIALIZER; -static struct scheduler_mode_operations* sCurrentMode; -static struct scheduler_mode_operations* sSchedulerModes[] = { +static scheduler_mode sCurrentModeID; +static scheduler_mode_operations* sCurrentMode; +static scheduler_mode_operations* sSchedulerModes[] = { &gSchedulerLowLatencyMode, &gSchedulerPowerSavingMode, }; @@ -1353,6 +1354,7 @@ scheduler_set_operation_mode(scheduler_mode mode) for (int32_t i = 0; i < smp_get_num_cpus(); i++) acquire_write_spinlock(&gCPUEntries[i].fSchedulerModeLock); + sCurrentModeID = mode; sCurrentMode = sSchedulerModes[mode]; sCurrentMode->switch_to_mode(); @@ -1539,11 +1541,7 @@ _scheduler_init() return result; } -#if 0 scheduler_set_operation_mode(SCHEDULER_MODE_LOW_LATENCY); -#else - scheduler_set_operation_mode(SCHEDULER_MODE_POWER_SAVING); -#endif add_debugger_command_etc("run_queue", &dump_run_queue, "List threads in run queue", "\nLists threads in run queue", 0); @@ -1663,3 +1661,16 @@ _user_estimate_max_scheduling_latency(thread_id id) return 2 * kMinThreadQuantum; } + +status_t +_user_set_scheduler_mode(int32 mode) +{ + return scheduler_set_operation_mode(static_cast(mode)); +} + + +int32 +_user_get_scheduler_mode(void) +{ + return sCurrentModeID; +} diff --git a/src/system/libroot/os/scheduler.c b/src/system/libroot/os/scheduler.c index 65e9713c16..dda2826595 100644 --- a/src/system/libroot/os/scheduler.c +++ b/src/system/libroot/os/scheduler.c @@ -60,3 +60,17 @@ estimate_max_scheduling_latency(thread_id thread) return _kern_estimate_max_scheduling_latency(thread); } + +status_t +set_scheduler_mode(int32 mode) +{ + return _kern_set_scheduler_mode(mode); +} + + +int32 +get_scheduler_mode(void) +{ + return _kern_get_scheduler_mode(); +} +