core: hle: kernel: KProcess: Pass in KResourceLimit on process creation.
- This allows us to have a resource limit per process, rather than use the global system resource limit.
This commit is contained in:
parent
57ebcbf2c4
commit
a74fddc98f
|
@ -28,7 +28,9 @@
|
||||||
#include "core/file_sys/vfs_real.h"
|
#include "core/file_sys/vfs_real.h"
|
||||||
#include "core/hardware_interrupt_manager.h"
|
#include "core/hardware_interrupt_manager.h"
|
||||||
#include "core/hid/hid_core.h"
|
#include "core/hid/hid_core.h"
|
||||||
|
#include "core/hle/kernel/k_memory_manager.h"
|
||||||
#include "core/hle/kernel/k_process.h"
|
#include "core/hle/kernel/k_process.h"
|
||||||
|
#include "core/hle/kernel/k_resource_limit.h"
|
||||||
#include "core/hle/kernel/k_scheduler.h"
|
#include "core/hle/kernel/k_scheduler.h"
|
||||||
#include "core/hle/kernel/kernel.h"
|
#include "core/hle/kernel/kernel.h"
|
||||||
#include "core/hle/kernel/physical_core.h"
|
#include "core/hle/kernel/physical_core.h"
|
||||||
|
@ -252,9 +254,16 @@ struct System::Impl {
|
||||||
}
|
}
|
||||||
|
|
||||||
telemetry_session->AddInitialInfo(*app_loader, fs_controller, *content_provider);
|
telemetry_session->AddInitialInfo(*app_loader, fs_controller, *content_provider);
|
||||||
|
|
||||||
|
// Create a resource limit for the process.
|
||||||
|
const auto physical_memory_size =
|
||||||
|
kernel.MemoryManager().GetSize(Kernel::KMemoryManager::Pool::Application);
|
||||||
|
auto* resource_limit = Kernel::CreateResourceLimitForProcess(system, physical_memory_size);
|
||||||
|
|
||||||
|
// Create the process.
|
||||||
auto main_process = Kernel::KProcess::Create(system.Kernel());
|
auto main_process = Kernel::KProcess::Create(system.Kernel());
|
||||||
ASSERT(Kernel::KProcess::Initialize(main_process, system, "main",
|
ASSERT(Kernel::KProcess::Initialize(main_process, system, "main",
|
||||||
Kernel::KProcess::ProcessType::Userland)
|
Kernel::KProcess::ProcessType::Userland, resource_limit)
|
||||||
.IsSuccess());
|
.IsSuccess());
|
||||||
const auto [load_result, load_parameters] = app_loader->Load(*main_process, system);
|
const auto [load_result, load_parameters] = app_loader->Load(*main_process, system);
|
||||||
if (load_result != Loader::ResultStatus::Success) {
|
if (load_result != Loader::ResultStatus::Success) {
|
||||||
|
|
|
@ -123,12 +123,11 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
ResultCode KProcess::Initialize(KProcess* process, Core::System& system, std::string process_name,
|
ResultCode KProcess::Initialize(KProcess* process, Core::System& system, std::string process_name,
|
||||||
ProcessType type) {
|
ProcessType type, KResourceLimit* res_limit) {
|
||||||
auto& kernel = system.Kernel();
|
auto& kernel = system.Kernel();
|
||||||
|
|
||||||
process->name = std::move(process_name);
|
process->name = std::move(process_name);
|
||||||
|
process->resource_limit = res_limit;
|
||||||
process->resource_limit = kernel.GetSystemResourceLimit();
|
|
||||||
process->status = ProcessStatus::Created;
|
process->status = ProcessStatus::Created;
|
||||||
process->program_id = 0;
|
process->program_id = 0;
|
||||||
process->process_id = type == ProcessType::KernelInternal ? kernel.CreateNewKernelProcessID()
|
process->process_id = type == ProcessType::KernelInternal ? kernel.CreateNewKernelProcessID()
|
||||||
|
@ -143,9 +142,6 @@ ResultCode KProcess::Initialize(KProcess* process, Core::System& system, std::st
|
||||||
|
|
||||||
kernel.AppendNewProcess(process);
|
kernel.AppendNewProcess(process);
|
||||||
|
|
||||||
// Open a reference to the resource limit.
|
|
||||||
process->resource_limit->Open();
|
|
||||||
|
|
||||||
// Clear remaining fields.
|
// Clear remaining fields.
|
||||||
process->num_running_threads = 0;
|
process->num_running_threads = 0;
|
||||||
process->is_signaled = false;
|
process->is_signaled = false;
|
||||||
|
@ -153,6 +149,9 @@ ResultCode KProcess::Initialize(KProcess* process, Core::System& system, std::st
|
||||||
process->is_suspended = false;
|
process->is_suspended = false;
|
||||||
process->schedule_count = 0;
|
process->schedule_count = 0;
|
||||||
|
|
||||||
|
// Open a reference to the resource limit.
|
||||||
|
process->resource_limit->Open();
|
||||||
|
|
||||||
return ResultSuccess;
|
return ResultSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -91,7 +91,7 @@ public:
|
||||||
static constexpr std::size_t RANDOM_ENTROPY_SIZE = 4;
|
static constexpr std::size_t RANDOM_ENTROPY_SIZE = 4;
|
||||||
|
|
||||||
static ResultCode Initialize(KProcess* process, Core::System& system, std::string process_name,
|
static ResultCode Initialize(KProcess* process, Core::System& system, std::string process_name,
|
||||||
ProcessType type);
|
ProcessType type, KResourceLimit* res_limit);
|
||||||
|
|
||||||
/// Gets a reference to the process' page table.
|
/// Gets a reference to the process' page table.
|
||||||
KPageTable& PageTable() {
|
KPageTable& PageTable() {
|
||||||
|
|
|
@ -3,7 +3,9 @@
|
||||||
// Refer to the license.txt file included.
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
#include "core/core.h"
|
#include "core/core.h"
|
||||||
|
#include "core/core_timing.h"
|
||||||
#include "core/hle/kernel/k_event.h"
|
#include "core/hle/kernel/k_event.h"
|
||||||
|
#include "core/hle/kernel/k_memory_manager.h"
|
||||||
#include "core/hle/kernel/k_process.h"
|
#include "core/hle/kernel/k_process.h"
|
||||||
#include "core/hle/kernel/k_readable_event.h"
|
#include "core/hle/kernel/k_readable_event.h"
|
||||||
#include "core/hle/kernel/k_resource_limit.h"
|
#include "core/hle/kernel/k_resource_limit.h"
|
||||||
|
@ -15,10 +17,21 @@ namespace Service::KernelHelpers {
|
||||||
|
|
||||||
ServiceContext::ServiceContext(Core::System& system_, std::string name_)
|
ServiceContext::ServiceContext(Core::System& system_, std::string name_)
|
||||||
: kernel(system_.Kernel()) {
|
: kernel(system_.Kernel()) {
|
||||||
|
|
||||||
|
// Create a resource limit for the process.
|
||||||
|
const auto physical_memory_size =
|
||||||
|
kernel.MemoryManager().GetSize(Kernel::KMemoryManager::Pool::System);
|
||||||
|
auto* resource_limit = Kernel::CreateResourceLimitForProcess(system_, physical_memory_size);
|
||||||
|
|
||||||
|
// Create the process.
|
||||||
process = Kernel::KProcess::Create(kernel);
|
process = Kernel::KProcess::Create(kernel);
|
||||||
ASSERT(Kernel::KProcess::Initialize(process, system_, std::move(name_),
|
ASSERT(Kernel::KProcess::Initialize(process, system_, std::move(name_),
|
||||||
Kernel::KProcess::ProcessType::Userland)
|
Kernel::KProcess::ProcessType::KernelInternal,
|
||||||
|
resource_limit)
|
||||||
.IsSuccess());
|
.IsSuccess());
|
||||||
|
|
||||||
|
// Close reference to our resource limit, as the process opens one.
|
||||||
|
resource_limit->Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
ServiceContext::~ServiceContext() {
|
ServiceContext::~ServiceContext() {
|
||||||
|
|
Reference in New Issue