這兩個函數的定義均在include/linux/slab_def.h中,其實現如下:
static inline void *kmalloc(size_t size, gfp_t flags)
{
if (__builtin_constant_p(size)) {
int i = 0;
#define CACHE(x) /
if (size <= x) /
goto found; /
else /
i++;
#include "kmalloc_sizes.h"
#undef CACHE
{
extern void __you_cannot_kmalloc_that_much(void);
__you_cannot_kmalloc_that_much();
}
found:
#ifdef CONFIG_ZONE_DMA
if (flags & GFP_DMA)
return kmem_cache_alloc(malloc_sizes[i].cs_dmacachep,
flags);
#endif
return kmem_cache_alloc(malloc_sizes[i].cs_cachep, flags);
}
return __kmalloc(size, flags);
}
static inline void *kzalloc(size_t size, gfp_t flags)
{
if (__builtin_constant_p(size)) {
int i = 0;
#define CACHE(x) /
if (size <= x) /
goto found; /
else /
i++;
#include "kmalloc_sizes.h"
#undef CACHE
{
extern void __you_cannot_kzalloc_that_much(void);
__you_cannot_kzalloc_that_much();
}
found:
#ifdef CONFIG_ZONE_DMA
if (flags & GFP_DMA)
return kmem_cache_zalloc(malloc_sizes[i].cs_dmacachep,
flags);
#endif
return kmem_cache_zalloc(malloc_sizes[i].cs_cachep, flags);
}
return __kzalloc(size, flags);
}
在這兩個函數中,根據size是否為編譯時常數做了優化,但是在移植時由於VDSP5不支持__builtin_constant_p這個宏,因此直接將這兩個函數改為:
static inline void *kmalloc(size_t size, gfp_t flags)
{
if (__builtin_constant_p(size)) {
int i = 0;
#define CACHE(x) /
if (size <= x) /
goto found; /
else /
i++;
#include "kmalloc_sizes.h"
#undef CACHE
// {
// extern void __you_cannot_kmalloc_that_much(void);
// __you_cannot_kmalloc_that_much();
// }
found:
#ifdef CONFIG_ZONE_DMA
// if (flags & GFP_DMA)
// return kmem_cache_alloc(malloc_sizes[i].cs_dmacachep,
// flags);
#endif
// return kmem_cache_alloc(malloc_sizes[i].cs_cachep, flags);
}
return __kmalloc(size, flags);
}
static inline void *kzalloc(size_t size, gfp_t flags)
{
if (__builtin_constant_p(size)) {
int i = 0;
#define CACHE(x) /
if (size <= x) /
goto found; /
else /
i++;
#include "kmalloc_sizes.h"
#undef CACHE
// {
// extern void __you_cannot_kzalloc_that_much(void);
// __you_cannot_kzalloc_that_much();
// }
found:
#ifdef CONFIG_ZONE_DMA
// if (flags & GFP_DMA)
// return kmem_cache_zalloc(malloc_sizes[i].cs_dmacachep,
// flags);
#endif
// return kmem_cache_zalloc(malloc_sizes[i].cs_cachep, flags);
}
return __kzalloc(size, flags);
}
雖然對性能會略有影響,但是也能完成正確的功能。
uclinux-2008R1-RC8(bf561)到VDSP5的移植(55):filemap.c的問題
uclinux-2008R1-RC8(bf561)到VDSP5的移植(54):initramfs的問題
uclinux-2008R1-RC8(bf561)到VDSP5的移植(53):reboot.c的問題
uclinux-2008R1-RC8(bf561)到VDSP5的移植(50):jiffies_64的定義問題
uclinux-2008R1-RC8(bf561)到VDSP5的移植(49):kernel_thread_helper的問題
uclinux-2008R1-RC8(bf561)到VDSP5的移植(48):__cmpxchg的問題