فهرست منبع

Kernel: Also add a process boosting mechanism

Let's also have set_process_boost() for giving all threads in a process
the same boost.
Andreas Kling 5 سال پیش
والد
کامیت
a69734bf2e
6فایلهای تغییر یافته به همراه33 افزوده شده و 2 حذف شده
  1. 14 0
      Kernel/Process.cpp
  2. 10 0
      Kernel/Process.h
  3. 2 1
      Kernel/Syscall.h
  4. 1 1
      Kernel/Thread.h
  5. 5 0
      Libraries/LibC/serenity.cpp
  6. 1 0
      Libraries/LibC/serenity.h

+ 14 - 0
Kernel/Process.cpp

@@ -3922,3 +3922,17 @@ int Process::sys$set_thread_boost(int tid, int amount)
     thread->set_priority_boost(amount);
     return 0;
 }
+
+int Process::sys$set_process_boost(pid_t pid, int amount)
+{
+    if (amount < 0 || amount > 20)
+        return -EINVAL;
+    InterruptDisabler disabler;
+    auto* process = Process::from_pid(pid);
+    if (!process || process->is_dead())
+        return -ESRCH;
+    if (!is_superuser() && process->uid() != euid())
+        return -EPERM;
+    process->m_priority_boost = amount;
+    return 0;
+}

+ 10 - 0
Kernel/Process.h

@@ -235,6 +235,7 @@ public:
     void* sys$get_kernel_info_page();
     int sys$futex(const Syscall::SC_futex_params*);
     int sys$set_thread_boost(int tid, int amount);
+    int sys$set_process_boost(pid_t, int amount);
 
     static void initialize();
 
@@ -308,6 +309,8 @@ public:
 
     int icon_id() const { return m_icon_id; }
 
+    u32 priority_boost() const { return m_priority_boost; }
+
 private:
     friend class MemoryManager;
     friend class Scheduler;
@@ -396,6 +399,8 @@ private:
 
     int m_icon_id { -1 };
 
+    u32 m_priority_boost { 0 };
+
     WaitQueue& futex_queue(i32*);
     HashMap<u32, OwnPtr<WaitQueue>> m_futex_queues;
 };
@@ -520,3 +525,8 @@ inline const LogStream& operator<<(const LogStream& stream, const Process& proce
 {
     return stream << process.name() << '(' << process.pid() << ')';
 }
+
+inline u32 Thread::effective_priority() const
+{
+    return m_priority + m_process.priority_boost() + m_priority_boost + m_extra_priority;
+}

+ 2 - 1
Kernel/Syscall.h

@@ -152,7 +152,8 @@ typedef u32 socklen_t;
     __ENUMERATE_SYSCALL(profiling_disable)          \
     __ENUMERATE_SYSCALL(get_kernel_info_page)       \
     __ENUMERATE_SYSCALL(futex)                      \
-    __ENUMERATE_SYSCALL(set_thread_boost)
+    __ENUMERATE_SYSCALL(set_thread_boost)           \
+    __ENUMERATE_SYSCALL(set_process_boost)
 
 namespace Syscall {
 

+ 1 - 1
Kernel/Thread.h

@@ -65,7 +65,7 @@ public:
     void set_priority_boost(u32 boost) { m_priority_boost = boost; }
     u32 priority_boost() const { return m_priority_boost; }
 
-    u32 effective_priority() const { return m_priority + m_priority_boost + m_extra_priority; }
+    u32 effective_priority() const;
 
     void set_joinable(bool j) { m_is_joinable = j; }
     bool is_joinable() const { return m_is_joinable; }

+ 5 - 0
Libraries/LibC/serenity.cpp

@@ -34,6 +34,11 @@ int set_thread_boost(int tid, int amount)
     __RETURN_WITH_ERRNO(rc, rc, -1);
 }
 
+int set_process_boost(int tid, int amount)
+{
+    int rc = syscall(SC_set_process_boost, tid, amount);
+    __RETURN_WITH_ERRNO(rc, rc, -1);
+}
 
 int futex(int32_t* userspace_address, int futex_op, int32_t value, const struct timespec* timeout)
 {

+ 1 - 0
Libraries/LibC/serenity.h

@@ -51,6 +51,7 @@ int profiling_disable(pid_t);
 #define THREAD_PRIORITY_MAX 99
 
 int set_thread_boost(int tid, int amount);
+int set_process_boost(pid_t, int amount);
 
 #define FUTEX_WAIT 1
 #define FUTEX_WAKE 2