summaryrefslogtreecommitdiff
path: root/Kernel
diff options
context:
space:
mode:
Diffstat (limited to 'Kernel')
-rw-r--r--Kernel/Process.cpp14
-rw-r--r--Kernel/Process.h10
-rw-r--r--Kernel/Syscall.h3
-rw-r--r--Kernel/Thread.h2
4 files changed, 27 insertions, 2 deletions
diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp
index 7196f44e3f..779c42f6a7 100644
--- a/Kernel/Process.cpp
+++ b/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;
+}
diff --git a/Kernel/Process.h b/Kernel/Process.h
index 5694f59b03..d91c5668a1 100644
--- a/Kernel/Process.h
+++ b/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;
+}
diff --git a/Kernel/Syscall.h b/Kernel/Syscall.h
index 7a595b7c81..3661d9a594 100644
--- a/Kernel/Syscall.h
+++ b/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 {
diff --git a/Kernel/Thread.h b/Kernel/Thread.h
index 681401909d..ff1a4d8659 100644
--- a/Kernel/Thread.h
+++ b/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; }