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 for (i = 0 ; kmalloc_cache[i].object_size != 076 for (i = 0 ; kmalloc_cache[i].object_size != 0 ; i ++)
077 { 077 {
078 if (kmalloc_cache[i].object_size >= size 078 if (kmalloc_cache[i].object_size >= size)
079 return sos_kmem_cache_alloc(kmalloc_ca 079 return sos_kmem_cache_alloc(kmalloc_cache[i].cache,
080 (flags 080 (flags
081 & SOS_KMA 081 & SOS_KMALLOC_ATOMIC)?
082 SOS_KSLAB_ 082 SOS_KSLAB_ALLOC_ATOMIC:0);
083 } 083 }
084 084
085 085
086 086
087 return sos_kmem_vmm_alloc(SOS_PAGE_ALIGN_SUP 087 return sos_kmem_vmm_alloc(SOS_PAGE_ALIGN_SUP(size) / SOS_PAGE_SIZE,
088 ( (flags 088 ( (flags
089 & SOS_KMALLOC_A 089 & SOS_KMALLOC_ATOMIC)?
090 SOS_KMEM_VMM_ATO 090 SOS_KMEM_VMM_ATOMIC:0)
091 | SOS_KMEM_VMM_MAP 091 | SOS_KMEM_VMM_MAP
092 ); 092 );
093 } 093 }
094 094
095 095
096 sos_ret_t sos_kfree(sos_vaddr_t vaddr) 096 sos_ret_t sos_kfree(sos_vaddr_t vaddr)
097 { 097 {
098 098
099 099
100 100
101 101
102 102
103 103
104 if (! sos_kmem_cache_free(vaddr)) 104 if (! sos_kmem_cache_free(vaddr))
105 return SOS_OK; 105 return SOS_OK;
106 106
107 107
108 108
109 109
110 return sos_kmem_vmm_free(vaddr); 110 return sos_kmem_vmm_free(vaddr);
111 } 111 }
112 112
113 113