* vm_create_anonymous_area() now accepts B_ANY_KERNEL_BLOCK_ADDRESS.

* As a temporary work-around for the current slab allocator's area usage,
  I added the CACHE_LARGE_SLAB flag, which will force the allocator to 
  use larger areas.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23564 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2008-01-16 20:30:16 +00:00
parent abf34addc5
commit c6ee79ce38
3 changed files with 23 additions and 8 deletions
+3 -3
View File
@@ -1,9 +1,8 @@
/*
* Copyright 2008, Axel Dörfler. All Rights Reserved.
* Copyright 2007, Hugo Santos. All Rights Reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
* Hugo Santos, [email protected]
* Distributed under the terms of the MIT License.
*/
#ifndef _SLAB_SLAB_H_
#define _SLAB_SLAB_H_
@@ -17,6 +16,7 @@ enum {
/* create_object_cache_etc flags */
CACHE_NO_DEPOT = 1 << 0,
CACHE_UNLOCKED_PAGES = 1 << 1,
CACHE_LARGE_SLAB = 1 << 2,
/* object_cache_alloc flags */
CACHE_DONT_SLEEP = 1 << 8,
+19 -5
View File
@@ -1,4 +1,5 @@
/*
* Copyright 2008, Axel Dörfler. All Rights Reserved.
* Copyright 2007, Hugo Santos. All Rights Reserved.
* Distributed under the terms of the MIT License.
*
@@ -39,6 +40,7 @@
#define TRACE_CACHE(cache, format, bananas...) do { } while (0)
#endif
#define CACHE_ALIGN_ON_SIZE (30 << 1)
static const int kMagazineCapacity = 32;
static const size_t kCacheColorPeriod = 8;
@@ -273,10 +275,15 @@ area_allocate_pages(object_cache *cache, void **pages, uint32 flags)
if (cache->flags & CACHE_UNLOCKED_PAGES)
lock = B_NO_LOCK;
uint32 addressSpec = B_ANY_KERNEL_ADDRESS;
if ((cache->flags & CACHE_ALIGN_ON_SIZE) != 0
&& cache->slab_size != B_PAGE_SIZE)
addressSpec = B_ANY_KERNEL_BLOCK_ADDRESS;
// if we are allocating, it is because we need the pages immediatly
// so we lock them. when moving the slab to the empty list we should
// unlock them, and lock them again when getting one from the empty list.
area_id areaId = create_area(cache->name, pages, B_ANY_KERNEL_ADDRESS,
area_id areaId = create_area(cache->name, pages, addressSpec,
cache->slab_size, lock, B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA);
if (areaId < 0)
return areaId;
@@ -523,13 +530,17 @@ create_small_object_cache(const char *name, size_t object_size,
SmallObjectCache *cache = new (buffer) SmallObjectCache();
if (object_cache_init(cache, name, object_size, alignment, maximum, flags,
cookie, constructor, destructor, reclaimer) < B_OK) {
if (object_cache_init(cache, name, object_size, alignment, maximum,
flags | CACHE_ALIGN_ON_SIZE, cookie, constructor, destructor,
reclaimer) < B_OK) {
delete_cache(cache);
return NULL;
}
cache->slab_size = B_PAGE_SIZE;
if ((flags & CACHE_LARGE_SLAB) != 0)
cache->slab_size = max_c(16 * B_PAGE_SIZE, 1024 * object_size);
else
cache->slab_size = B_PAGE_SIZE;
return cache;
}
@@ -553,7 +564,10 @@ create_hashed_object_cache(const char *name, size_t object_size,
return NULL;
}
cache->slab_size = max_c(16 * B_PAGE_SIZE, 8 * object_size);
if ((flags & CACHE_LARGE_SLAB) != 0)
cache->slab_size = max_c(256 * B_PAGE_SIZE, 128 * object_size);
else
cache->slab_size = max_c(16 * B_PAGE_SIZE, 8 * object_size);
cache->lower_boundary = __fls0(cache->object_size);
return cache;
+1
View File
@@ -1409,6 +1409,7 @@ vm_create_anonymous_area(team_id team, const char *name, void **address,
case B_EXACT_ADDRESS:
case B_BASE_ADDRESS:
case B_ANY_KERNEL_ADDRESS:
case B_ANY_KERNEL_BLOCK_ADDRESS:
break;
default: