网站公告列表

  没有公告

加入收藏
设为首页
联系本站
您现在的位置: AnalogCN安诺电子 >> 文章 >> 技术交流 >> 文章正文
  uclinux-2008R1-RC8(bf561)到VDSP5的移植(44):kmalloc和kzalloc的问题           ★★★ 【字体:
uclinux-2008R1-RC8(bf561)到VDSP5的移植(44):kmalloc和kzalloc的问题
作者:快乐虾    文章来源:http://blog.csdn.net/lights_joy    点击数:    更新时间:2008-6-24    
这两个函数的定义均在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);
}
虽然对性能会略有影响,但是也能完成正确的功能。
文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    前置放大器在移动医疗服务系
    便携式多通道大容量生理信号
    防腐监测仪的设计与应用
    基于AD1674的酶标仪的设计
    基于C/S模式的JRTPLIB库的测
    ffmpeg与jrtplib相结合应用
    blackfin模拟摄像头驱动中的
    可编程逻辑在数字信号处理系
    发现VDSP4.5一个BUG:单步调
    VDSP5.0双核工程下sml3中的变
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    版权所有:AnalogCN安诺电子 湘ICP备06016315号