From d88a145e9e7581affe75cd11c5512ed802399499 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Thu, 14 Aug 2008 00:44:05 +0000 Subject: [PATCH] Added an allocator providing memory associated with VIP (i.e. page writer) I/O requests. Not used yet. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26966 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../kernel/device_manager/device_manager.cpp | 2 + .../kernel/device_manager/io_requests.cpp | 67 +++++++++++++++++++ .../kernel/device_manager/io_requests.h | 11 +++ 3 files changed, 80 insertions(+) diff --git a/src/system/kernel/device_manager/device_manager.cpp b/src/system/kernel/device_manager/device_manager.cpp index 503da86418..ea52fe4173 100644 --- a/src/system/kernel/device_manager/device_manager.cpp +++ b/src/system/kernel/device_manager/device_manager.cpp @@ -2207,6 +2207,8 @@ device_manager_init(struct kernel_args* args) { TRACE(("device manager init\n")); + vip_io_request_allocator_init(); + dm_init_id_generator(); dm_init_io_resources(); diff --git a/src/system/kernel/device_manager/io_requests.cpp b/src/system/kernel/device_manager/io_requests.cpp index 1e0c1ce742..6efd77bd92 100644 --- a/src/system/kernel/device_manager/io_requests.cpp +++ b/src/system/kernel/device_manager/io_requests.cpp @@ -8,6 +8,7 @@ #include +#include #include #include #include @@ -24,6 +25,8 @@ #endif +#define VIP_HEAP_SIZE 1024 * 1024 + // partial I/O operation phases enum { PHASE_READ_BEGIN = 0, @@ -31,6 +34,11 @@ enum { PHASE_DO_ALL = 2 }; +heap_allocator* sVIPHeap; + + +// #pragma mark - + IORequestChunk::IORequestChunk() : @@ -1142,6 +1150,64 @@ IORequest::Dump() const } +// #pragma mark - allocator + + +void* +vip_io_request_malloc(size_t size) +{ + return heap_memalign(sVIPHeap, 0, size); +} + + +void +vip_io_request_free(void* address) +{ + heap_free(sVIPHeap, address); +} + + +void +io_request_free(void* address) +{ + if (heap_free(sVIPHeap, address) != B_OK) + free(address); +} + + +void +vip_io_request_allocator_init() +{ + static const heap_class heapClass = { + "VIP I/O", /* name */ + 100, /* initial percentage */ + B_PAGE_SIZE / 8, /* max allocation size */ + B_PAGE_SIZE, /* page size */ + 8, /* min bin size */ + 4, /* bin alignment */ + 8, /* min count per page */ + 16 /* max waste per page */ + }; + + void* address = NULL; + area_id area = create_area("VIP I/O heap", &address, B_ANY_KERNEL_ADDRESS, + VIP_HEAP_SIZE, B_FULL_LOCK, B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA); + if (area < B_OK) { + panic("vip_io_request_allocator_init(): couldn't allocate VIP I/O " + "heap area"); + return; + } + + sVIPHeap = heap_create_allocator("VIP I/O heap", (addr_t)address, + VIP_HEAP_SIZE, &heapClass); + if (sVIPHeap == NULL) { + panic("vip_io_request_allocator_init(): failed to create VIP I/O " + "heap\n"); + return; + } +} + + // #pragma mark - @@ -1246,3 +1312,4 @@ delete_io_request(io_request* request) } #endif // 0 + diff --git a/src/system/kernel/device_manager/io_requests.h b/src/system/kernel/device_manager/io_requests.h index b6da468e3d..804769a0d3 100644 --- a/src/system/kernel/device_manager/io_requests.h +++ b/src/system/kernel/device_manager/io_requests.h @@ -320,4 +320,15 @@ private: typedef DoublyLinkedList IORequestList; +// allocator for VIP I/O request memory +void* vip_io_request_malloc(size_t size); +void vip_io_request_free(void* address); + +void io_request_free(void* address); + // frees regardless of whether allocated with vip_io_request_malloc() or + // malloc() + +void vip_io_request_allocator_init(); + + #endif // IO_REQUESTS_H