Chinaunix首页 | 论坛 | 博客
  • 博客访问: 67868
  • 博文数量: 8
  • 博客积分: 1416
  • 博客等级: 上尉
  • 技术积分: 90
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-21 22:35
个人简介

The best or nothing!

文章分类

全部博文(8)

文章存档

2020年(1)

2015年(3)

2011年(3)

2010年(1)

分类: LINUX

2011-07-13 17:07:11

注:这里关于内核部分的代码都来自于2.6.34.2版本.

一, __read_mostly

       __read_mostly是内核链接时使用的, 与体系结构的cache机制密切相关. 在linux kernel里定义在x86, ia64, powerpc, parisc, s390, sh, sparc 体系结构的 asm/cache.h中:
 

#define __read_mostly __attribute__((__section__(".data.read_mostly")))


从定义的字面意思可以理解为将需要经常读取的数据链接进内核的 .data.read_mostly段. 在x86, ia64, powerpc, parisc, s390, sh, sparc 的链接脚本里(arch/xxx/kernel/vmlinux.lds.S)有关于 .data.read_mostly的定义, 就是指定 .data.read_mostly段的数据在内核加载时放到CPU的cache中. 在那些没有cache的体系结构上, __read_mostly被定义为空, 即:


#define __read_mostly


二, likely(x)和unlikely(x)

likely()和unlikely()定义在linux/compiler.h中:



#if defined(CONFIG_TRACE_BRANCH_PROFILING) \
    && !defined(DISABLE_BRANCH_PROFILING) && !defined(__CHECKER__)
void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);

#define likely_notrace(x)    __builtin_expect(!!(x), 1)
#define unlikely_notrace(x)    __builtin_expect(!!(x), 0)

#define __branch_check__(x, expect) ({                    \
            int ______r;                    \
            static struct ftrace_branch_data        \
                __attribute__((__aligned__(4)))        \
                __attribute__((section("_ftrace_annotated_branch"))) \
                ______f = {                \
                .func = __func__,            \
                .file = __FILE__,            \
                .line = __LINE__,            \
            };                        \
            ______r = likely_notrace(x);            \
            ftrace_likely_update(&______f, ______r, expect); \
            ______r;                    \
        })

/*
 * Using __builtin_constant_p(x) to ignore cases where the return
 * value is always the same. This idea is taken from a similar patch
 * written by Daniel Walker.
 */
# ifndef likely
# define likely(x)    (__builtin_constant_p(x) ? !!(x) : __branch_check__(x, 1))
# endif
# ifndef unlikely
# define unlikely(x)    (__builtin_constant_p(x) ? !!(x) : __branch_check__(x, 0))
# endif

#ifdef CONFIG_PROFILE_ALL_BRANCHES
/*
 * "Define 'is'", Bill Clinton
 * "Define 'if'", Steven Rostedt
 */
#define if(cond, ...) __trace_if( (cond , ## __VA_ARGS__) )
#define __trace_if(cond) \
    if (__builtin_constant_p((cond)) ? !!(cond) :            \
    ({                                \
        int ______r;                        \
        static struct ftrace_branch_data            \
            __attribute__((__aligned__(4)))            \
            __attribute__((section("_ftrace_branch")))    \
            ______f = {                    \
                .func = __func__,            \
                .file = __FILE__,            \
                .line = __LINE__,            \
            };                        \
        ______r = !!(cond);                    \
        ______f.miss_hit[______r]++;                    \
        ______r;                        \
    }))
#endif /* CONFIG_PROFILE_ALL_BRANCHES */

#else
# define likely(x)    __builtin_expect(!!(x), 1)
# define unlikely(x)    __builtin_expect(!!(x), 0)
#endif

/* Optimization barrier */
#ifndef barrier
# define barrier() __memory_barrier()
#endif


        在编译内核时, 如果配置了TRACE_BRANCH_PROFILING(允许编译时优化分支语句), 那么likely()分支的语句将会在编译成二进制代码时紧跟在刚执行过的代码后面, 这样便于预读进cache中, 从而加快程序的执行速度. 而unlikely()则相反.
阅读(2492) | 评论(0) | 转发(0) |
0

上一篇:send()系统调用的超时

下一篇:IPSec 协议

给主人留下些什么吧!~~