CFQ了解`cfq_cfq_cfqq_slice_new(cfqq)`

时间:2014-04-16 04:25:19

标签: c linux-kernel kernel kernel-module

 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.

所以有人知道这段代码的作用或外观如何吗?

1 个答案:

答案 0 :(得分:0)

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