Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1203854
  • 博文数量: 185
  • 博客积分: 495
  • 博客等级: 下士
  • 技术积分: 1418
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-02 15:12
个人简介

治肾虚不含糖,专注内核性能优化二十年。 https://github.com/KnightKu

文章分类

全部博文(185)

文章存档

2019年(1)

2018年(12)

2017年(5)

2016年(23)

2015年(1)

2014年(22)

2013年(82)

2012年(39)

分类: LINUX

2016-08-17 18:18:36

从文件系统的一致性角度讲,元数据比普通数据要关键,因此在处理request时最好能给与一定的优先级,因此REQ_META在旧版的内核是自带priority的,但是这有一个问题就是对于想给与优先级,但是又不是metadata的request就有点蛋疼,用了REQ_META会引起歧义,直到这个patch的出现:
commit 65299a3b788bd274bed92f9fa3232082c9f3ea70
Author: Christoph Hellwig
Date:   Tue Aug 23 14:50:29 2011 +0200

    block: separate priority boosting from REQ_META
    
    Add a new REQ_PRIO to let requests preempt others in the cfq I/O schedule,
    and lave REQ_META purely for marking requests as metadata in blktrace.
    
    All existing callers of REQ_META except for XFS are updated to also
    set REQ_PRIO for now.
    
    Signed-off-by: Christoph Hellwig
    Reviewed-by: Namhyung Kim
    Signed-off-by: Jens Axboe

把REQ_PRIO和REQ_META分离,各司其职,REQ_META仅用于描述request是一个元数据请求,而REQ_PRIO用于给CFQ在调度时的优先级hint:
static void cfqq_boost_on_prio(struct cfq_queue *cfqq, int op_flags)
{
    /*
     * If REQ_PRIO is set, boost class and prio level, if it's below
     * BE/NORM. If prio is not set, restore the potentially boosted
     * class/prio level.
     */
    if (!(op_flags & REQ_PRIO)) {
        cfqq->ioprio_class = cfqq->org_ioprio_class;
        cfqq->ioprio = cfqq->org_ioprio;
    } else {
        if (cfq_class_idle(cfqq))
            cfqq->ioprio_class = IOPRIO_CLASS_BE;
        if (cfqq->ioprio > IOPRIO_NORM)
            cfqq->ioprio = IOPRIO_NORM;
    }
}
目前来讲REQ_PRIO只作用于cfq,也是因为它有优先级队列的原因,而其他几种调度器比较耿直,想用hint搞特权不太好弄。
阅读(1808) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~