From 4ebe37ab694f3941b36d8d61a0d6614cc76791b2 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Wed, 20 Jan 2010 17:46:06 +0000 Subject: [PATCH] Added ObjectCache::objects_per_slab, which allowed to squash the TODO in object_cache_reserve_internal(). git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35203 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/system/kernel/slab/HashedObjectCache.cpp | 2 ++ src/system/kernel/slab/ObjectCache.h | 1 + src/system/kernel/slab/Slab.cpp | 5 +---- src/system/kernel/slab/SmallObjectCache.cpp | 3 +++ 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/system/kernel/slab/HashedObjectCache.cpp b/src/system/kernel/slab/HashedObjectCache.cpp index b90b129d5b..3de684091f 100644 --- a/src/system/kernel/slab/HashedObjectCache.cpp +++ b/src/system/kernel/slab/HashedObjectCache.cpp @@ -72,6 +72,8 @@ HashedObjectCache::Create(const char* name, size_t object_size, cache->slab_size = max_c(16 * B_PAGE_SIZE, 8 * object_size); cache->lower_boundary = __fls0(cache->object_size); + cache->objects_per_slab = cache->slab_size / cache->object_size; + return cache; } diff --git a/src/system/kernel/slab/ObjectCache.h b/src/system/kernel/slab/ObjectCache.h index 9205886c53..b4cb59a828 100644 --- a/src/system/kernel/slab/ObjectCache.h +++ b/src/system/kernel/slab/ObjectCache.h @@ -47,6 +47,7 @@ struct ObjectCache : DoublyLinkedListLinkImpl { // minimum number of free objects size_t slab_size; + size_t objects_per_slab; size_t usage; size_t maximum; uint32 flags; diff --git a/src/system/kernel/slab/Slab.cpp b/src/system/kernel/slab/Slab.cpp index 266032a17b..c939967e5a 100644 --- a/src/system/kernel/slab/Slab.cpp +++ b/src/system/kernel/slab/Slab.cpp @@ -316,10 +316,7 @@ static status_t object_cache_reserve_internal(ObjectCache* cache, size_t objectCount, uint32 flags, bool unlockWhileAllocating) { - size_t numBytes = objectCount * cache->object_size; - size_t slabCount = ((numBytes - 1) / cache->slab_size) + 1; - // TODO: This also counts the unusable space of each slab, which can - // sum up. + size_t slabCount = (objectCount - 1) / cache->objects_per_slab + 1; while (slabCount > 0) { slab* newSlab = cache->CreateSlab(flags, unlockWhileAllocating); diff --git a/src/system/kernel/slab/SmallObjectCache.cpp b/src/system/kernel/slab/SmallObjectCache.cpp index 5af322cbe4..aa4b0af430 100644 --- a/src/system/kernel/slab/SmallObjectCache.cpp +++ b/src/system/kernel/slab/SmallObjectCache.cpp @@ -35,6 +35,9 @@ SmallObjectCache::Create(const char* name, size_t object_size, else cache->slab_size = B_PAGE_SIZE; + cache->objects_per_slab = (cache->slab_size - sizeof(slab)) + / cache->object_size; + return cache; }