Diff markup
001 001
002 002
003 003
004 004
005 005
006 006
007 007
008 008
009 009
010 010
011 011
012 012
013 013
014 014
015 015
016 016
017 017
018 018
019 #include <sos/assert.h> 019 #include <sos/assert.h>
020 #include <sos/macros.h> 020 #include <sos/macros.h>
021 021
022 #include "physmem.h" 022 #include "physmem.h"
023 #include "kmem_vmm.h" 023 #include "kmem_vmm.h"
024 #include "kmem_slab.h" 024 #include "kmem_slab.h"
025 025
026 #include "kmalloc.h" 026 #include "kmalloc.h"
027 027
028 028
029 029
030 030
031 static struct { 031 static struct {
032 const char *name; 032 const char *name;
033 sos_size_t object_size; 033 sos_size_t object_size;
034 sos_count_t pages_per_slab; 034 sos_count_t pages_per_slab;
035 struct sos_kslab_cache *cache; 035 struct sos_kslab_cache *cache;
036 } kmalloc_cache[] = 036 } kmalloc_cache[] =
037 { 037 {
038 { "kmalloc 8B objects", 8, 1 }, 038 { "kmalloc 8B objects", 8, 1 },
039 { "kmalloc 16B objects", 16, 1 }, 039 { "kmalloc 16B objects", 16, 1 },
040 { "kmalloc 32B objects", 32, 1 }, 040 { "kmalloc 32B objects", 32, 1 },
041 { "kmalloc 64B objects", 64, 1 }, 041 { "kmalloc 64B objects", 64, 1 },
042 { "kmalloc 128B objects", 128, 1 }, 042 { "kmalloc 128B objects", 128, 1 },
043 { "kmalloc 256B objects", 256, 2 }, 043 { "kmalloc 256B objects", 256, 2 },
044 { "kmalloc 1024B objects", 1024, 2 }, 044 { "kmalloc 1024B objects", 1024, 2 },
045 { "kmalloc 2048B objects", 2048, 3 }, 045 { "kmalloc 2048B objects", 2048, 3 },
046 { "kmalloc 4096B objects", 4096, 4 }, 046 { "kmalloc 4096B objects", 4096, 4 },
047 { "kmalloc 8192B objects", 8192, 8 }, 047 { "kmalloc 8192B objects", 8192, 8 },
048 { "kmalloc 16384B objects", 16384, 12 }, 048 { "kmalloc 16384B objects", 16384, 12 },
049 { NULL, 0, 0, NULL } 049 { NULL, 0, 0, NULL }
050 }; 050 };
051 051
052 052
053 sos_ret_t sos_kmalloc_subsystem_setup() 053 sos_ret_t sos_kmalloc_subsystem_setup()
054 { 054 {
055 int i; 055 int i;
056 for (i = 0 ; kmalloc_cache[i].object_size != 056 for (i = 0 ; kmalloc_cache[i].object_size != 0 ; i ++)
057 { 057 {
058 struct sos_kslab_cache *new_cache; 058 struct sos_kslab_cache *new_cache;
059 new_cache = sos_kmem_cache_create(kmallo 059 new_cache = sos_kmem_cache_create(kmalloc_cache[i].name,
060 kmallo 060 kmalloc_cache[i].object_size,
061 kmallo 061 kmalloc_cache[i].pages_per_slab,
062 0, 062 0,
063 SOS_KS 063 SOS_KSLAB_CREATE_MAP
064 ); 064 );
065 SOS_ASSERT_FATAL(new_cache != NULL); 065 SOS_ASSERT_FATAL(new_cache != NULL);
066 kmalloc_cache[i].cache = new_cache; 066 kmalloc_cache[i].cache = new_cache;
067 } 067 }
068 return SOS_OK; 068 return SOS_OK;
069 } 069 }
070 070
071 071
072 sos_vaddr_t sos_kmalloc(sos_size_t size, sos_u 072 sos_vaddr_t sos_kmalloc(sos_size_t size, sos_ui32_t flags)
073 { 073 {
074 074
075 int i; 075 int i;
>> 076 SOS_ASSERT_FATAL(size > 0);
076 for (i = 0 ; kmalloc_cache[i].object_size != 077 for (i = 0 ; kmalloc_cache[i].object_size != 0 ; i ++)
077 { 078 {
078 if (kmalloc_cache[i].object_size >= size 079 if (kmalloc_cache[i].object_size >= size)
079 return sos_kmem_cache_alloc(kmalloc_ca 080 return sos_kmem_cache_alloc(kmalloc_cache[i].cache,
080 (flags 081 (flags
081 & SOS_KMA 082 & SOS_KMALLOC_ATOMIC)?
082 SOS_KSLAB_ 083 SOS_KSLAB_ALLOC_ATOMIC:0);
083 } 084 }
084 085
085 086
086 087
087 return sos_kmem_vmm_alloc(SOS_PAGE_ALIGN_SUP 088 return sos_kmem_vmm_alloc(SOS_PAGE_ALIGN_SUP(size) / SOS_PAGE_SIZE,
088 ( (flags 089 ( (flags
089 & SOS_KMALLOC_A 090 & SOS_KMALLOC_ATOMIC)?
090 SOS_KMEM_VMM_ATO 091 SOS_KMEM_VMM_ATOMIC:0)
091 | SOS_KMEM_VMM_MAP 092 | SOS_KMEM_VMM_MAP
092 ); 093 );
093 } 094 }
094 095
095 096
096 sos_ret_t sos_kfree(sos_vaddr_t vaddr) 097 sos_ret_t sos_kfree(sos_vaddr_t vaddr)
097 { 098 {
098 099
099 100
100 101
101 102
102 103
103 104
104 if (! sos_kmem_cache_free(vaddr)) 105 if (! sos_kmem_cache_free(vaddr))
105 return SOS_OK; 106 return SOS_OK;
106 107
107 108
108 109
109 110
110 return sos_kmem_vmm_free(vaddr); 111 return sos_kmem_vmm_free(vaddr);
111 } 112 }
112 113
113 114