mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 08:18:11 +00:00

Before we start disabling acquisition of the big process lock for specific syscalls, make sure to document and assert that all the lock is held during all syscalls.
76 lines
1.9 KiB
C++
76 lines
1.9 KiB
C++
/*
|
|
* Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#include <Kernel/Process.h>
|
|
|
|
namespace Kernel {
|
|
|
|
KResultOr<FlatPtr> Process::sys$yield()
|
|
{
|
|
VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this)
|
|
REQUIRE_PROMISE(stdio);
|
|
Thread::current()->yield_and_release_relock_big_lock();
|
|
return 0;
|
|
}
|
|
|
|
KResultOr<FlatPtr> Process::sys$sched_setparam(int pid, Userspace<const struct sched_param*> user_param)
|
|
{
|
|
VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this)
|
|
REQUIRE_PROMISE(proc);
|
|
struct sched_param desired_param;
|
|
if (!copy_from_user(&desired_param, user_param))
|
|
return EFAULT;
|
|
|
|
if (desired_param.sched_priority < THREAD_PRIORITY_MIN || desired_param.sched_priority > THREAD_PRIORITY_MAX)
|
|
return EINVAL;
|
|
|
|
auto* peer = Thread::current();
|
|
ScopedSpinLock lock(g_scheduler_lock);
|
|
if (pid != 0)
|
|
peer = Thread::from_tid(pid);
|
|
|
|
if (!peer)
|
|
return ESRCH;
|
|
|
|
if (!is_superuser() && euid() != peer->process().uid() && uid() != peer->process().uid())
|
|
return EPERM;
|
|
|
|
peer->set_priority((u32)desired_param.sched_priority);
|
|
return 0;
|
|
}
|
|
|
|
KResultOr<FlatPtr> Process::sys$sched_getparam(pid_t pid, Userspace<struct sched_param*> user_param)
|
|
{
|
|
VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this)
|
|
REQUIRE_PROMISE(proc);
|
|
int priority;
|
|
{
|
|
auto* peer = Thread::current();
|
|
ScopedSpinLock lock(g_scheduler_lock);
|
|
if (pid != 0) {
|
|
// FIXME: PID/TID BUG
|
|
// The entire process is supposed to be affected.
|
|
peer = Thread::from_tid(pid);
|
|
}
|
|
|
|
if (!peer)
|
|
return ESRCH;
|
|
|
|
if (!is_superuser() && euid() != peer->process().uid() && uid() != peer->process().uid())
|
|
return EPERM;
|
|
|
|
priority = (int)peer->priority();
|
|
}
|
|
|
|
struct sched_param param {
|
|
priority
|
|
};
|
|
if (!copy_to_user(user_param, ¶m))
|
|
return EFAULT;
|
|
return 0;
|
|
}
|
|
|
|
}
|