block: row: Add some debug information on ROW queues
1. Add a counter for number of requests on queue.
2. Add function to print queues status (number requests
currently on queue and number of already dispatched requests
in current dispatch cycle).
Change-Id: I1e98b9ca33853e6e6a8ddc53240f6cd6981e6024
Signed-off-by: Tatyana Brokhman <tlinder@codeaurora.org>
diff --git a/block/row-iosched.c b/block/row-iosched.c
index a4184da..f610a39 100644
--- a/block/row-iosched.c
+++ b/block/row-iosched.c
@@ -1,7 +1,7 @@
/*
* ROW (Read Over Write) I/O scheduler.
*
- * Copyright (c) 2012, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -104,6 +104,7 @@
* @nr_dispatched: number of requests already dispatched in
* the current dispatch cycle
* @slice: number of requests to dispatch in a cycle
+ * @nr_req: number of requests in queue
* @idle_data: data for idling on queues
*
*/
@@ -115,6 +116,8 @@
unsigned int nr_dispatched;
unsigned int slice;
+ unsigned int nr_req;
+
/* used only for READ queues */
struct rowq_idling_data idle_data;
};
@@ -191,6 +194,19 @@
return rd->cycle_flags & (1 << qnum);
}
+static inline void __maybe_unused row_dump_queues_stat(struct row_data *rd)
+{
+ int i;
+
+ row_log(rd->dispatch_queue, " Queues status (curr_queue=%d):",
+ rd->curr_queue);
+ for (i = 0; i < ROWQ_MAX_PRIO; i++)
+ row_log(rd->dispatch_queue,
+ "queue%d: dispatched= %d, nr_req=%d", i,
+ rd->row_queues[i].nr_dispatched,
+ rd->row_queues[i].nr_req);
+}
+
/******************** Static helper functions ***********************/
/*
* kick_queue() - Wake up device driver queue thread
@@ -264,6 +280,7 @@
list_add_tail(&rq->queuelist, &rqueue->fifo);
rd->nr_reqs[rq_data_dir(rq)]++;
+ rqueue->nr_req++;
rq_set_fifo_time(rq, jiffies); /* for statistics*/
if (queue_idling_enabled[rqueue->prio]) {
@@ -285,10 +302,11 @@
if (urgent_queues[rqueue->prio] &&
row_rowq_unserved(rd, rqueue->prio)) {
row_log_rowq(rd, rqueue->prio,
- "added urgent req curr_queue = %d",
- rd->curr_queue);
+ "added urgent request (total on queue=%d)",
+ rqueue->nr_req);
} else
- row_log_rowq(rd, rqueue->prio, "added request");
+ row_log_rowq(rd, rqueue->prio,
+ "added request (total on queue=%d)", rqueue->nr_req);
}
/**
@@ -317,8 +335,10 @@
list_add(&rq->queuelist, &rqueue->fifo);
rd->nr_reqs[rq_data_dir(rq)]++;
+ rqueue->nr_req++;
- row_log_rowq(rd, rqueue->prio, "request reinserted");
+ row_log_rowq(rd, rqueue->prio,
+ "request reinserted (total on queue=%d)", rqueue->nr_req);
return 0;
}
@@ -355,8 +375,10 @@
struct request *rq)
{
struct row_data *rd = (struct row_data *)q->elevator->elevator_data;
+ struct row_queue *rqueue = RQ_ROWQ(rq);
rq_fifo_clear(rq);
+ rqueue->nr_req--;
rd->nr_reqs[rq_data_dir(rq)]--;
}
@@ -438,7 +460,8 @@
if (row_rowq_unserved(rd, i) &&
!list_empty(&rd->row_queues[i].rqueue.fifo)) {
row_log_rowq(rd, currq,
- " Preemting for unserved rowq%d", i);
+ " Preemting for unserved rowq%d. (nr_req=%u)",
+ i, rd->row_queues[currq].rqueue.nr_req);
rd->curr_queue = i;
row_dispatch_insert(rd);
ret = 1;
@@ -583,6 +606,7 @@
struct row_queue *rqueue = RQ_ROWQ(next);
list_del_init(&next->queuelist);
+ rqueue->nr_req--;
rqueue->rdata->nr_reqs[rq_data_dir(rq)]--;
}