mirror of
https://github.com/Atmosphere-NX/Atmosphere
synced 2024-12-22 20:31:14 +00:00
kern: use slab allocated KSessionRequest dynamic mappings
This commit is contained in:
parent
e7a1e0fee2
commit
13238fc4fd
4 changed files with 91 additions and 72 deletions
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue