[sys-kernel/linux-sabayon, sys-kernel/linux-sabayon-sources,

sys-kernel/linux-server]  Added an IO latency patch for the cfq
ioscheduler.  Please note this patch is backported from the 2.6.32
kernel source, so this patch should be dropped from the 2.6.32
ebuilds.
This commit is contained in:
dontpanic
2009-10-30 12:56:04 -05:00
parent d0f5194fad
commit 4ebacbb52c
9 changed files with 355 additions and 5 deletions
+2 -1
View File
@@ -1,5 +1,6 @@
AUX 2.6.31/cfq-iosched-IO-latency.patch 3363 RMD160 2f65f79c75b6562c5ba1e7164bce9cd211a4ffd9 SHA1 f16c0bea0a8e8ccb42285273dfaa65d2964eed69 SHA256 c15487140738ce18a6561dec82a47608e8c2b7c6005b8aa57a33438eba34b784
AUX linux-server-2.6.31-amd64.config 100571 RMD160 385f369ebe2ef37e4aa542c96420f1324969224e SHA1 8270d0df23a7d41e188deea5b0af24a7a7a6a4cd SHA256 dcaded6b2001e8c03e962cd65a79277a83892511c2464166a7f7627d4e1c280d
AUX linux-server-2.6.31-x86.config 100842 RMD160 7c7f5a1350f53763b95dce2e6645402ed780d1c0 SHA1 817f467e4346bb64d33cc96d6cee046b6a3d8628 SHA256 301b169751ea1bba4eba5a3801292776e7f674cc3627dd307470e11a4a33f373
DIST 2.6.31-2.tar.bz2 268156 RMD160 6740fef6a150456c67fa0b51f6219edcd3b56253 SHA1 00671dbe2a72b735c2c0c84b30e353915d568233 SHA256 af977768a1aac5f55a84149a9d9bc72fe18b73fbee65b833b6c39109c27626c6
DIST linux-2.6.31.tar.bz2 61494822 RMD160 c0d88e63740abf0d4f9d82557260a31643f5a01b SHA1 c6e0e6b473ba2b80d164e37cfabf294e783c03d9 SHA256 0acd83f7b85db7ee18c2b0b7505e1ba6fd722c36f49a8870a831c851660e3512
EBUILD linux-server-2.6.31.ebuild 5035 RMD160 4d2f6aab22b91524bfce09b5a9a47d2e6994ef18 SHA1 dbdd60046d14f8c8dfb06e26f1bb19983c8ac94d SHA256 2938de341c362f4907f959a6a629e1921eb3ee76036f03b5be86df7554da4a99
EBUILD linux-server-2.6.31.ebuild 5145 RMD160 81ee702c87f3177af1495ca4727239e25421185a SHA1 0b421384148da1931ace84935e27f7fb03b2750a SHA256 d57b395a195d7d576c9476032529476e8d3998e213cbed601f2646499fc5a284
@@ -0,0 +1,112 @@
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c
index 87276eb..57ed6fc 100644
--- a/block/cfq-iosched.c
+++ b/block/cfq-iosched.c
@@ -140,7 +140,7 @@ struct cfq_data {
*/
unsigned int busy_rt_queues;
- int rq_in_driver;
+ int rq_in_driver[2];
int sync_flight;
/*
@@ -239,6 +239,11 @@ static struct cfq_queue *cfq_get_queue(struct cfq_data *, int,
static struct cfq_io_context *cfq_cic_lookup(struct cfq_data *,
struct io_context *);
+static inline int rq_in_driver(struct cfq_data *cfqd)
+{
+ return cfqd->rq_in_driver[0] + cfqd->rq_in_driver[1];
+}
+
static inline struct cfq_queue *cic_to_cfqq(struct cfq_io_context *cic,
int is_sync)
{
@@ -760,9 +765,9 @@ static void cfq_activate_request(struct request_queue *q, struct request *rq)
{
struct cfq_data *cfqd = q->elevator->elevator_data;
- cfqd->rq_in_driver++;
+ cfqd->rq_in_driver[rq_is_sync(rq)]++;
cfq_log_cfqq(cfqd, RQ_CFQQ(rq), "activate rq, drv=%d",
- cfqd->rq_in_driver);
+ rq_in_driver(cfqd));
cfqd->last_position = blk_rq_pos(rq) + blk_rq_sectors(rq);
}
@@ -770,11 +775,12 @@ static void cfq_activate_request(struct request_queue *q, struct request *rq)
static void cfq_deactivate_request(struct request_queue *q, struct request *rq)
{
struct cfq_data *cfqd = q->elevator->elevator_data;
+ const int sync = rq_is_sync(rq);
- WARN_ON(!cfqd->rq_in_driver);
- cfqd->rq_in_driver--;
+ WARN_ON(!cfqd->rq_in_driver[sync]);
+ cfqd->rq_in_driver[sync]--;
cfq_log_cfqq(cfqd, RQ_CFQQ(rq), "deactivate rq, drv=%d",
- cfqd->rq_in_driver);
+ rq_in_driver(cfqd));
}
static void cfq_remove_request(struct request *rq)
@@ -1080,7 +1086,7 @@ static void cfq_arm_slice_timer(struct cfq_data *cfqd)
/*
* still requests with the driver, don't idle
*/
- if (cfqd->rq_in_driver)
+ if (rq_in_driver(cfqd))
return;
/*
@@ -1312,6 +1318,12 @@ static int cfq_dispatch_requests(struct request_queue *q, int force)
return 0;
/*
+ * Drain async requests before we start sync IO
+ */
+ if (cfq_cfqq_idle_window(cfqq) && cfqd->rq_in_driver[BLK_RW_ASYNC])
+ return 0;
+
+ /*
* If this is an async queue and we have sync IO in flight, let it wait
*/
if (cfqd->sync_flight && !cfq_cfqq_sync(cfqq))
@@ -2130,11 +2142,11 @@ static void cfq_insert_request(struct request_queue *q, struct request *rq)
*/
static void cfq_update_hw_tag(struct cfq_data *cfqd)
{
- if (cfqd->rq_in_driver > cfqd->rq_in_driver_peak)
- cfqd->rq_in_driver_peak = cfqd->rq_in_driver;
+ if (rq_in_driver(cfqd) > cfqd->rq_in_driver_peak)
+ cfqd->rq_in_driver_peak = rq_in_driver(cfqd);
if (cfqd->rq_queued <= CFQ_HW_QUEUE_MIN &&
- cfqd->rq_in_driver <= CFQ_HW_QUEUE_MIN)
+ rq_in_driver(cfqd) <= CFQ_HW_QUEUE_MIN)
return;
if (cfqd->hw_tag_samples++ < 50)
@@ -2161,9 +2173,9 @@ static void cfq_completed_request(struct request_queue *q, struct request *rq)
cfq_update_hw_tag(cfqd);
- WARN_ON(!cfqd->rq_in_driver);
+ WARN_ON(!cfqd->rq_in_driver[sync]);
WARN_ON(!cfqq->dispatched);
- cfqd->rq_in_driver--;
+ cfqd->rq_in_driver[sync]--;
cfqq->dispatched--;
if (cfq_cfqq_sync(cfqq))
@@ -2197,7 +2209,7 @@ static void cfq_completed_request(struct request_queue *q, struct request *rq)
cfq_arm_slice_timer(cfqd);
}
- if (!cfqd->rq_in_driver)
+ if (!rq_in_driver(cfqd))
cfq_schedule_dispatch(cfqd);
}
@@ -36,6 +36,11 @@ KERN_INITRAMFS_SEARCH_NAME="initramfs-genkernel-${ARCH}-*-server-*"
# patches
UNIPATCH_LIST="${DISTFILES}/${K_SABPATCHES_PKG}"
# patches
UNIPATCH_LIST="
${DISTFILES}/${K_SABPATCHES_PKG}
${FILESDIR}/${PV}/cfq-iosched-IO-latency.patch
"
src_unpack() {