kern: use slab allocated KSessionRequest dynamic mappings

This commit is contained in:
Michael Scire 2022-10-12 00:36:32 -07:00 committed by SciresM
parent e7a1e0fee2
commit 13238fc4fd
4 changed files with 91 additions and 72 deletions

View file

@ -36,6 +36,7 @@ namespace ams::kern::init {
size_t num_KDebug; size_t num_KDebug;
size_t num_KIoPool; size_t num_KIoPool;
size_t num_KIoRegion; size_t num_KIoRegion;
size_t num_KSessionRequestMappings;
}; };
NOINLINE void InitializeSlabResourceCounts(); NOINLINE void InitializeSlabResourceCounts();

View file

@ -29,7 +29,10 @@ namespace ams::kern {
public: public:
class SessionMappings { class SessionMappings {
private: private:
/* At most 15 buffers of each type (4-bit descriptor counts), for 45 total. */
static constexpr size_t NumMappings = ((1ul << 4) - 1) * 3;
static constexpr size_t NumStaticMappings = 8; static constexpr size_t NumStaticMappings = 8;
static constexpr size_t NumDynamicMappings = NumMappings - NumStaticMappings;
class Mapping { class Mapping {
private: private:
@ -50,16 +53,27 @@ namespace ams::kern {
constexpr ALWAYS_INLINE size_t GetSize() const { return m_size; } constexpr ALWAYS_INLINE size_t GetSize() const { return m_size; }
constexpr ALWAYS_INLINE KMemoryState GetMemoryState() const { return m_state; } constexpr ALWAYS_INLINE KMemoryState GetMemoryState() const { return m_state; }
}; };
public:
class DynamicMappings : public KSlabAllocated<DynamicMappings, true> {
private:
Mapping m_mappings[NumDynamicMappings];
public:
constexpr explicit DynamicMappings() : m_mappings() { /* ... */ }
constexpr ALWAYS_INLINE Mapping &Get(size_t idx) { return m_mappings[idx]; }
constexpr ALWAYS_INLINE const Mapping &Get(size_t idx) const { return m_mappings[idx]; }
};
static_assert(sizeof(DynamicMappings) == sizeof(Mapping) * NumDynamicMappings);
private: private:
Mapping m_static_mappings[NumStaticMappings]; Mapping m_static_mappings[NumStaticMappings];
Mapping *m_mappings; DynamicMappings *m_dynamic_mappings;
u8 m_num_send; u8 m_num_send;
u8 m_num_recv; u8 m_num_recv;
u8 m_num_exch; u8 m_num_exch;
public: public:
constexpr explicit SessionMappings(util::ConstantInitializeTag) : m_static_mappings(), m_mappings(), m_num_send(), m_num_recv(), m_num_exch() { /* ... */ } constexpr explicit SessionMappings(util::ConstantInitializeTag) : m_static_mappings(), m_dynamic_mappings(), m_num_send(), m_num_recv(), m_num_exch() { /* ... */ }
explicit SessionMappings() : m_mappings(nullptr), m_num_send(), m_num_recv(), m_num_exch() { /* ... */ } explicit SessionMappings() : m_dynamic_mappings(nullptr), m_num_send(), m_num_recv(), m_num_exch() { /* ... */ }
void Initialize() { /* ... */ } void Initialize() { /* ... */ }
void Finalize(); void Finalize();
@ -96,7 +110,7 @@ namespace ams::kern {
if (index < NumStaticMappings) { if (index < NumStaticMappings) {
return m_static_mappings[index]; return m_static_mappings[index];
} else { } else {
return m_mappings[index - NumStaticMappings]; return m_dynamic_mappings->Get(index - NumStaticMappings);
} }
} }
@ -107,7 +121,7 @@ namespace ams::kern {
if (index < NumStaticMappings) { if (index < NumStaticMappings) {
return m_static_mappings[index]; return m_static_mappings[index];
} else { } else {
return m_mappings[index - NumStaticMappings]; return m_dynamic_mappings->Get(index - NumStaticMappings);
} }
} }
@ -118,7 +132,7 @@ namespace ams::kern {
if (index < NumStaticMappings) { if (index < NumStaticMappings) {
return m_static_mappings[index]; return m_static_mappings[index];
} else { } else {
return m_mappings[index - NumStaticMappings]; return m_dynamic_mappings->Get(index - NumStaticMappings);
} }
} }
}; };

View file

@ -17,6 +17,9 @@
namespace ams::kern::init { namespace ams::kern::init {
/* For macro convenience. */
using KSessionRequestMappings = KSessionRequest::SessionMappings::DynamicMappings;
#define SLAB_COUNT(CLASS) g_slab_resource_counts.num_##CLASS #define SLAB_COUNT(CLASS) g_slab_resource_counts.num_##CLASS
#define FOREACH_SLAB_TYPE(HANDLER, ...) \ #define FOREACH_SLAB_TYPE(HANDLER, ...) \
@ -40,7 +43,8 @@ namespace ams::kern::init {
HANDLER(KDebug, (SLAB_COUNT(KDebug)), ## __VA_ARGS__) \ HANDLER(KDebug, (SLAB_COUNT(KDebug)), ## __VA_ARGS__) \
HANDLER(KIoPool, (SLAB_COUNT(KIoPool)), ## __VA_ARGS__) \ HANDLER(KIoPool, (SLAB_COUNT(KIoPool)), ## __VA_ARGS__) \
HANDLER(KIoRegion, (SLAB_COUNT(KIoRegion)), ## __VA_ARGS__) \ HANDLER(KIoRegion, (SLAB_COUNT(KIoRegion)), ## __VA_ARGS__) \
HANDLER(KSecureSystemResource, (SLAB_COUNT(KProcess)), ## __VA_ARGS__) HANDLER(KSecureSystemResource, (SLAB_COUNT(KProcess)), ## __VA_ARGS__) \
HANDLER(KSessionRequestMappings, (SLAB_COUNT(KSessionRequestMappings)), ## __VA_ARGS__)
namespace { namespace {
@ -71,6 +75,7 @@ namespace ams::kern::init {
constexpr size_t SlabCountKDebug = cpu::NumCores; constexpr size_t SlabCountKDebug = cpu::NumCores;
constexpr size_t SlabCountKIoPool = 1; constexpr size_t SlabCountKIoPool = 1;
constexpr size_t SlabCountKIoRegion = 6; constexpr size_t SlabCountKIoRegion = 6;
constexpr size_t SlabcountKSessionRequestMappings = 40;
constexpr size_t SlabCountExtraKThread = (1024 + 256 + 256) - SlabCountKThread; constexpr size_t SlabCountExtraKThread = (1024 + 256 + 256) - SlabCountKThread;
@ -102,6 +107,7 @@ namespace ams::kern::init {
.num_KDebug = SlabCountKDebug, .num_KDebug = SlabCountKDebug,
.num_KIoPool = SlabCountKIoPool, .num_KIoPool = SlabCountKIoPool,
.num_KIoRegion = SlabCountKIoRegion, .num_KIoRegion = SlabCountKIoRegion,
.num_KSessionRequestMappings = SlabcountKSessionRequestMappings,
}; };
template<typename T> template<typename T>

View file

@ -19,22 +19,20 @@ namespace ams::kern {
Result KSessionRequest::SessionMappings::PushMap(KProcessAddress client, KProcessAddress server, size_t size, KMemoryState state, size_t index) { Result KSessionRequest::SessionMappings::PushMap(KProcessAddress client, KProcessAddress server, size_t size, KMemoryState state, size_t index) {
/* At most 15 buffers of each type (4-bit descriptor counts). */ /* At most 15 buffers of each type (4-bit descriptor counts). */
MESOSPHERE_ASSERT(index < ((1ul << 4) - 1) * 3); MESOSPHERE_ASSERT(index < NumMappings);
/* Get the mapping. */ /* Get the mapping. */
Mapping *mapping; Mapping *mapping;
if (index < NumStaticMappings) { if (index < NumStaticMappings) {
mapping = std::addressof(m_static_mappings[index]); mapping = std::addressof(m_static_mappings[index]);
} else { } else {
/* Allocate a page for the extra mappings. */ /* Allocate dynamic mappings as necessary. */
if (m_mappings == nullptr) { if (m_dynamic_mappings == nullptr) {
KPageBuffer *page_buffer = KPageBuffer::Allocate(); m_dynamic_mappings = DynamicMappings::Allocate();
R_UNLESS(page_buffer != nullptr, svc::ResultOutOfMemory()); R_UNLESS(m_dynamic_mappings != nullptr, svc::ResultOutOfMemory());
m_mappings = reinterpret_cast<Mapping *>(page_buffer);
} }
mapping = std::addressof(m_mappings[index - NumStaticMappings]); mapping = std::addressof(m_dynamic_mappings->Get(index - NumStaticMappings));
} }
/* Set the mapping. */ /* Set the mapping. */
@ -59,9 +57,9 @@ namespace ams::kern {
} }
void KSessionRequest::SessionMappings::Finalize() { void KSessionRequest::SessionMappings::Finalize() {
if (m_mappings) { if (m_dynamic_mappings) {
KPageBuffer::Free(reinterpret_cast<KPageBuffer *>(m_mappings)); DynamicMappings::Free(m_dynamic_mappings);
m_mappings = nullptr; m_dynamic_mappings = nullptr;
} }
} }