首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解`cfq_cfq_cfqq_slice_new(Cfqq)

理解`cfq_cfq_cfqq_slice_new(Cfqq)
EN

Stack Overflow用户
提问于 2014-04-16 04:25:19
回答 1查看 73关注 0票数 0
代码语言:javascript
复制
 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时声明它。

搜索结果得出:

代码语言:javascript
复制
WARN_ON(cfq_cfqq_slice_new(cfqq));
Other if statements checking the same thing, calling the same function.

那么,有谁知道这段代码是做什么的,或者它看起来怎么样?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-16 06:56:10

cfq_cfqq_slice_new()是通过宏定义的。

在第441行你会看到

代码语言:javascript
复制
CFQ_CFQQ_FNS(slice_new);

它调用:

代码语言:javascript
复制
#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;      \
}

其结果是:

代码语言:javascript
复制
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,它声明:

代码语言:javascript
复制
CFQ_CFQQ_FLAG_slice_new,        /* no requests dispatched in slice */

因此,cfq_cfqq_slice_new()只返回CFQ_CFQQ_FLAG_slice_new是否设置在struct cfq_queue.flags成员中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23099964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档