static inline bool cfq_slice_used(struct cfq_queue *cfqq)
{
if (cfq_cfqq_slice_new(cfqq))
return false;
if (time_before(jiffies, cfqq->slice_end))
return false;
return true;
}我正在查看这段代码,它是一个完整的公平队列,我在http://lxr.free-electrons.com/source/block/cfq-iosched.c#L4570上找到了它
这里有一行代码if (cfq_cfqq_slice_new(cfqq)),在我看来,它就像一个函数调用,其中我只是传递一个cfqq。但是,该函数cfq_cfqq_slice_new并没有被真正声明,或者我不明白如何在执行crtl+f时声明它。
搜索结果得出:
WARN_ON(cfq_cfqq_slice_new(cfqq));
Other if statements checking the same thing, calling the same function.那么,有谁知道这段代码是做什么的,或者它看起来怎么样?
发布于 2014-04-16 06:56:10
cfq_cfqq_slice_new()是通过宏定义的。
在第441行你会看到
CFQ_CFQQ_FNS(slice_new);它调用:
#define CFQ_CFQQ_FNS(name) \
static inline void cfq_mark_cfqq_##name(struct cfq_queue *cfqq) \
{ \
(cfqq)->flags |= (1 << CFQ_CFQQ_FLAG_##name); \
} \
static inline void cfq_clear_cfqq_##name(struct cfq_queue *cfqq) \
{ \
(cfqq)->flags &= ~(1 << CFQ_CFQQ_FLAG_##name); \
} \
static inline int cfq_cfqq_##name(const struct cfq_queue *cfqq) \
{ \
return ((cfqq)->flags & (1 << CFQ_CFQQ_FLAG_##name)) != 0; \
}其结果是:
static inline void cfq_mark_cfqq_slice_new(struct cfq_queue *cfqq)
{
(cfqq)->flags |= (1 << CFQ_CFQQ_FLAG_slice_new);
}
static inline void cfq_clear_cfqq_slice_new(struct cfq_queue *cfqq)
{
(cfqq)->flags &= ~(1 << CFQ_CFQQ_FLAG_slice_new);
}
static inline int cfq_cfqq_slice_new(const struct cfq_queue *cfqq)
{
return ((cfqq)->flags & (1 << CFQ_CFQQ_FLAG_slice_new)) != 0;
}代码中稍早的是一个enum,它声明:
CFQ_CFQQ_FLAG_slice_new, /* no requests dispatched in slice */因此,cfq_cfqq_slice_new()只返回CFQ_CFQQ_FLAG_slice_new是否设置在struct cfq_queue.flags成员中。
https://stackoverflow.com/questions/23099964
复制相似问题