diff --git a/src/system/kernel/slab/HashedObjectCache.cpp b/src/system/kernel/slab/HashedObjectCache.cpp index 3df11e178e..b90b129d5b 100644 --- a/src/system/kernel/slab/HashedObjectCache.cpp +++ b/src/system/kernel/slab/HashedObjectCache.cpp @@ -95,7 +95,7 @@ HashedObjectCache::CreateSlab(uint32 flags, bool unlockWhileAllocating) void* pages; if ((this->*allocate_pages)(&pages, flags, unlockWhileAllocating) == B_OK) { - if (InitSlab(slab, pages, slab_size)) + if (InitSlab(slab, pages, slab_size, flags)) return slab; (this->*free_pages)(pages); @@ -129,9 +129,9 @@ HashedObjectCache::ObjectSlab(void* object) const status_t -HashedObjectCache::PrepareObject(slab* source, void* object) +HashedObjectCache::PrepareObject(slab* source, void* object, uint32 flags) { - Link* link = _AllocateLink(CACHE_DONT_SLEEP); + Link* link = _AllocateLink(flags); if (link == NULL) return B_NO_MEMORY; diff --git a/src/system/kernel/slab/HashedObjectCache.h b/src/system/kernel/slab/HashedObjectCache.h index 08e1e51302..11a069daad 100644 --- a/src/system/kernel/slab/HashedObjectCache.h +++ b/src/system/kernel/slab/HashedObjectCache.h @@ -28,7 +28,8 @@ struct HashedObjectCache : ObjectCache { virtual void ReturnSlab(slab* slab); virtual slab* ObjectSlab(void* object) const; - virtual status_t PrepareObject(slab* source, void* object); + virtual status_t PrepareObject(slab* source, void* object, + uint32 flags); virtual void UnprepareObject(slab* source, void* object); private: diff --git a/src/system/kernel/slab/ObjectCache.cpp b/src/system/kernel/slab/ObjectCache.cpp index 2a0663a8bd..ebb5b4bd22 100644 --- a/src/system/kernel/slab/ObjectCache.cpp +++ b/src/system/kernel/slab/ObjectCache.cpp @@ -148,7 +148,7 @@ ObjectCache::Delete() slab* -ObjectCache::InitSlab(slab* slab, void* pages, size_t byteCount) +ObjectCache::InitSlab(slab* slab, void* pages, size_t byteCount, uint32 flags) { TRACE_CACHE(this, "construct (%p, %p .. %p, %lu)", slab, pages, ((uint8*)pages) + byteCount, byteCount); @@ -176,7 +176,7 @@ ObjectCache::InitSlab(slab* slab, void* pages, size_t byteCount) for (size_t i = 0; i < slab->size; i++) { bool failedOnFirst = false; - status_t status = PrepareObject(slab, data); + status_t status = PrepareObject(slab, data, flags); if (status < B_OK) failedOnFirst = true; else if (constructor) @@ -235,7 +235,7 @@ ObjectCache::UninitSlab(slab* slab) status_t -ObjectCache::PrepareObject(slab* source, void* object) +ObjectCache::PrepareObject(slab* source, void* object, uint32 flags) { return B_OK; } diff --git a/src/system/kernel/slab/ObjectCache.h b/src/system/kernel/slab/ObjectCache.h index 31f8378b0d..9205886c53 100644 --- a/src/system/kernel/slab/ObjectCache.h +++ b/src/system/kernel/slab/ObjectCache.h @@ -82,10 +82,11 @@ public: virtual slab* ObjectSlab(void* object) const = 0; slab* InitSlab(slab* slab, void* pages, - size_t byteCount); + size_t byteCount, uint32 flags); void UninitSlab(slab* slab); - virtual status_t PrepareObject(slab* source, void* object); + virtual status_t PrepareObject(slab* source, void* object, + uint32 flags); virtual void UnprepareObject(slab* source, void* object); void ReturnObjectToSlab(slab* source, void* object); diff --git a/src/system/kernel/slab/ObjectDepot.cpp b/src/system/kernel/slab/ObjectDepot.cpp index fee60329cb..657a2d1ddc 100644 --- a/src/system/kernel/slab/ObjectDepot.cpp +++ b/src/system/kernel/slab/ObjectDepot.cpp @@ -12,6 +12,7 @@ #include #include +#include #include #include @@ -79,7 +80,8 @@ static DepotMagazine* alloc_magazine() { DepotMagazine* magazine = (DepotMagazine*)slab_internal_alloc( - sizeof(DepotMagazine) + kMagazineCapacity * sizeof(void*), 0); + sizeof(DepotMagazine) + kMagazineCapacity * sizeof(void*), + CACHE_DONT_SLEEP); if (magazine) { magazine->next = NULL; magazine->current_round = 0; diff --git a/src/system/kernel/slab/Slab.cpp b/src/system/kernel/slab/Slab.cpp index 2f6d0323d2..266032a17b 100644 --- a/src/system/kernel/slab/Slab.cpp +++ b/src/system/kernel/slab/Slab.cpp @@ -279,8 +279,7 @@ slab_internal_alloc(size_t size, uint32 flags) return buffer; } - // TODO: Support CACHE_DONT_SLEEP! - return block_alloc(size); + return block_alloc(size, flags); } diff --git a/src/system/kernel/slab/SmallObjectCache.cpp b/src/system/kernel/slab/SmallObjectCache.cpp index d2c62d04c4..5af322cbe4 100644 --- a/src/system/kernel/slab/SmallObjectCache.cpp +++ b/src/system/kernel/slab/SmallObjectCache.cpp @@ -50,7 +50,7 @@ SmallObjectCache::CreateSlab(uint32 flags, bool unlockWhileAllocating) return NULL; return InitSlab(slab_in_pages(pages, slab_size), pages, - slab_size - sizeof(slab)); + slab_size - sizeof(slab), flags); } diff --git a/src/system/kernel/slab/allocator.cpp b/src/system/kernel/slab/allocator.cpp index 5e19716e85..21cacaa8f2 100644 --- a/src/system/kernel/slab/allocator.cpp +++ b/src/system/kernel/slab/allocator.cpp @@ -6,14 +6,16 @@ * Hugo Santos, hugosantos@gmail.com */ -#include -#include // for ROUNDUP +#include "slab_private.h" #include #include -#include "slab_private.h" +#include // for ROUNDUP +#include +#include +#include #define DEBUG_ALLOCATOR @@ -74,7 +76,7 @@ size_to_index(size_t size) void * -block_alloc(size_t size) +block_alloc(size_t size, uint32 flags) { int index = size_to_index(size + sizeof(boundary_tag)); @@ -83,10 +85,12 @@ block_alloc(size_t size) if (index < 0) { void *pages; - area_id area = create_area("alloc'ed block", &pages, - B_ANY_KERNEL_ADDRESS, ROUNDUP(size + sizeof(area_boundary_tag), - B_PAGE_SIZE), B_NO_LOCK, B_READ_AREA | B_WRITE_AREA); - if (area < B_OK) + area_id area = create_area_etc(VMAddressSpace::KernelID(), + "alloc'ed block", &pages, B_ANY_KERNEL_ADDRESS, + ROUNDUP(size + sizeof(area_boundary_tag), B_PAGE_SIZE), B_FULL_LOCK, + B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA, 0, + (flags & CACHE_DONT_SLEEP) != 0 ? CREATE_AREA_DONT_WAIT : 0); + if (area < 0) return NULL; area_boundary_tag *areaTag = (area_boundary_tag *)pages; @@ -94,7 +98,7 @@ block_alloc(size_t size) tag = &areaTag->tag; block = areaTag + 1; } else { - tag = (boundary_tag *)object_cache_alloc(sBlockCaches[index], 0); + tag = (boundary_tag *)object_cache_alloc(sBlockCaches[index], flags); if (tag == NULL) return NULL; atomic_add(&sBlockCacheWaste[index], kBlockSizes[index] - size diff --git a/src/system/kernel/slab/slab_private.h b/src/system/kernel/slab/slab_private.h index 42809c857c..111887d7ad 100644 --- a/src/system/kernel/slab/slab_private.h +++ b/src/system/kernel/slab/slab_private.h @@ -29,7 +29,7 @@ struct ObjectCache; void* slab_internal_alloc(size_t size, uint32 flags); void slab_internal_free(void *_buffer); -void* block_alloc(size_t size); +void* block_alloc(size_t size, uint32 flags); void block_free(void *block); void block_allocator_init_boot(); void block_allocator_init_rest();