[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]
[dm-devel] [PATCH 2/2] io-controller: make rt preemption happen in the whole hierarchy
- From: Gui Jianfeng <guijianfeng cn fujitsu com>
- To: Vivek Goyal <vgoyal redhat com>
- Cc: dhaval linux vnet ibm com, snitzer redhat com, peterz infradead org, dm-devel redhat com, dpshah google com, jens axboe oracle com, agk redhat com, balbir linux vnet ibm com, paolo valente unimore it, fernando oss ntt co jp, mikew google com, jmoyer redhat com, nauman google com, m-ikeda ds jp nec com, lizf cn fujitsu com, fchecconi gmail com, akpm linux-foundation org, jbaron redhat com, linux-kernel vger kernel org, s-uchida ap jp nec com, righi andrea gmail com, containers lists linux-foundation org
- Subject: [dm-devel] [PATCH 2/2] io-controller: make rt preemption happen in the whole hierarchy
- Date: Fri, 26 Jun 2009 16:13:51 +0800
let rt queue preempt non-rt queue if needed.
Make sure comparision happens at the same level.
Signed-off-by: Gui Jianfeng <guijianfeng cn fujitsu com>
---
block/elevator-fq.c | 28 +++++++++++++++++++++++++++-
1 files changed, 27 insertions(+), 1 deletions(-)
diff --git a/block/elevator-fq.c b/block/elevator-fq.c
index 1d4ec1f..21d38f5 100644
--- a/block/elevator-fq.c
+++ b/block/elevator-fq.c
@@ -3742,6 +3742,31 @@ int elv_iosched_expire_ioq(struct request_queue *q, int slice_expired,
return ret;
}
+static int check_rt_preemption(struct io_queue *ioq)
+{
+ struct hlist_node *node;
+ struct hlist_head *hhead = &ioq->efqd->rt_ioq_list;
+ struct io_queue *rt_ioq;
+ struct io_entity *entity = &ioq->entity;
+ struct io_entity *new_entity;
+
+ rcu_read_lock();
+ hlist_for_each_entry_rcu(rt_ioq, node, hhead, rt_node) {
+ new_entity = &rt_ioq->entity;
+
+ bfq_find_matching_entity(&entity, &new_entity);
+
+ if (new_entity->ioprio_class == IOPRIO_CLASS_RT &&
+ entity->ioprio_class != IOPRIO_CLASS_RT) {
+ rcu_read_unlock();
+ return 1;
+ }
+ }
+ rcu_read_unlock();
+
+ return 0;
+}
+
/* Common layer function to select the next queue to dispatch from */
void *elv_fq_select_ioq(struct request_queue *q, int force)
{
@@ -3823,7 +3848,8 @@ void *elv_fq_select_ioq(struct request_queue *q, int force)
*/
iog = ioq_to_io_group(ioq);
- if (!elv_ioq_class_rt(ioq) && iog->busy_rt_queues) {
+ if (!elv_ioq_class_rt(ioq) &&
+ (iog->busy_rt_queues || check_rt_preemption(ioq))) {
/*
* We simulate this as cfqq timed out so that it gets to bank
* the remaining of its time slice.
--
1.5.4.rc3
[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]