juruqiang 发表于 2013-05-07 20:32

SetPageReserved的定义


2.6内核的低版本中,SetPageReserved是直接用宏定义的:
#define SetPageReserved(page)                set_bit(PG_reserved, &(page)->flags)


而在2.6的高版本中,SetPageReserved的定义变成了:
#define SETPAGEFLAG(uname, lname)                                        \
static inline void SetPage##uname(struct page *page)                        \
                        { set_bit(PG_##lname, &page->flags); }

#define PAGEFLAG(uname, lname) TESTPAGEFLAG(uname, lname)                \
        SETPAGEFLAG(uname, lname) CLEARPAGEFLAG(uname, lname)

PAGEFLAG(Reserved, reserved)


为什么要搞的这么复杂,又宏又内联的。

求解~~~~~~~~~~~~~~~

l4rmbr 发表于 2013-05-07 22:28

原因可能有多种, 不妄猜. 给你个建议

如果是跟踪着某个开发者的git代码库,

git blame <文件名>

然后, 找出感兴趣行上的commit ID, 用

git show<commit ID>

查看这次改动是由哪次提交引入的.一般可能会附加提交说明,
解释这次提交的初衷, 作用等.

还可以记下作者的名字 

然后放狗(google)搜: lkml +作者名字+关于这个修改或主题的一两个重要关键词,
这样可能可以直接搜到当时提交时作者发在内核列表的邮件, 可能有更详细的
讨论.

一般我看到过时的书上讲到的过时的实现或做法, 与现在代码差异巨大时,
都会这么做去找找引入这些重要变化的源由.

希望你学习后来和大家分享吧 :)

瀚海书香 发表于 2013-05-08 08:57

回复 1# juruqiang
而在2.6的高版本中,SetPageReserved的定义变成了:
#define SETPAGEFLAG(uname, lname)                                        \
static inline void SetPage##uname(struct page *page)                        \
                        { set_bit(PG_##lname, &page->flags); }

#define PAGEFLAG(uname, lname) TESTPAGEFLAG(uname, lname)                \
      SETPAGEFLAG(uname, lname) CLEARPAGEFLAG(uname, lname)

PAGEFLAG(Reserved, reserved)

为了重用。这样就不需要重复定义SetPageDirty、SetPageActive、SetPageLocked等等。。。
   

qianguozheng 发表于 2016-06-21 16:33

看了之後,我也沒有搞懂。

nswcfd 发表于 2016-06-22 19:32

就是为了图省事(少敲点代码),3个操作set/test/clear,加上N个bit,原来需要定义3*N个宏,现在只需要N个宏。

如果cpp预处理能力再强大一些,支持用宏来生成宏,估计会简化成一个宏…… (还好没有)
页: [1]
查看完整版本: SetPageReserved的定义