歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> uclinux-2008R1-RC8(bf561)到VDSP5的移植(44):kmalloc和kzalloc的問題

uclinux-2008R1-RC8(bf561)到VDSP5的移植(44):kmalloc和kzalloc的問題

日期:2017/3/3 16:43:29   编辑:關於Linux

這兩個函數的定義均在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);
}

雖然對性能會略有影響,但是也能完成正確的功能。

Copyright © Linux教程網 All Rights Reserved