public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Shailabh Nagar <nagar@watson.ibm.com>
To: ckrm-tech <ckrm-tech@lists.sourceforge.net>
Cc: linux-kernel <linux-kernel@vger.kernel.org>
Subject: [PATCH][1/1] Per-priority statistics for CFQ w/iopriorities 2.6.8.1
Date: Fri, 24 Sep 2004 19:41:21 -0400	[thread overview]
Message-ID: <4154B0A1.1070305@watson.ibm.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 368 bytes --]

This patch applies over the port of I/O priorities to CFQ for 2.6.8.1
posted earlier.

It adds useful statistics like requests and sectors received/served
and number of dynamic queue addition/deletions for each priority level 
(0 through 20) created by the earlier patch.

The patch is not required for correct functioning of the I/O priority 
port.

-- Shailabh






[-- Attachment #2: cfq-priostats.2681.patch --]
[-- Type: text/plain, Size: 8429 bytes --]

diff -Nru a/drivers/block/cfq-iosched.c b/drivers/block/cfq-iosched.c
--- a/drivers/block/cfq-iosched.c	Fri Sep 24 19:16:53 2004
+++ b/drivers/block/cfq-iosched.c	Fri Sep 24 19:16:53 2004
@@ -91,6 +91,15 @@
 	int busy_queues;
 	int busy_rq;
 	unsigned long busy_sectors;
+	
+	/* requests, sectors and queues 
+         * added(in),dispatched/deleted(out) 
+	 * at this priority level. 
+	 */
+	atomic_t cum_rq_in,cum_rq_out;              
+	atomic_t cum_sectors_in,cum_sectors_out;    
+	atomic_t cum_queues_in,cum_queues_out;
+
 	struct list_head prio_list;
 	int last_rq;
 	int last_sectors;
@@ -240,7 +249,9 @@
 			cfqd->cid[crq->ioprio].busy_rq--;
 			cfqd->cid[crq->ioprio].busy_sectors -= crq->nr_sectors;
 		}
-
+		atomic_inc(&(cfqd->cid[crq->ioprio].cum_rq_out));
+		atomic_add(crq->nr_sectors,
+			   &(cfqd->cid[crq->ioprio].cum_sectors_out));
 		cfqq->queued[rq_data_dir(crq->request)]--;
 		rb_erase(&crq->rb_node, &cfqq->sort_list);
 	}
@@ -283,6 +294,9 @@
 		cfqd->cid[crq->ioprio].busy_rq++;
 		cfqd->cid[crq->ioprio].busy_sectors += crq->nr_sectors;
 	}
+	atomic_inc(&(cfqd->cid[crq->ioprio].cum_rq_in));
+	atomic_add(crq->nr_sectors,
+		   &(cfqd->cid[crq->ioprio].cum_sectors_in));
 retry:
 	__alias = __cfq_add_crq_rb(cfqq, crq);
 	if (!__alias) {
@@ -399,6 +413,7 @@
 {
 	struct cfq_data *cfqd = q->elevator.elevator_data;
 	struct cfq_rq *crq = RQ_ELV_DATA(req);
+	int tmp;
 
 	cfq_del_crq_hash(crq);
 	cfq_add_crq_hash(cfqd, crq);
@@ -410,9 +425,11 @@
 		cfq_add_crq_rb(cfqd, cfqq, crq);
 	}
 
-	cfqd->busy_sectors += req->hard_nr_sectors - crq->nr_sectors;
-	cfqd->cid[crq->ioprio].busy_sectors += 
-		req->hard_nr_sectors - crq->nr_sectors;
+	tmp = req->hard_nr_sectors - crq->nr_sectors;
+	cfqd->busy_sectors += tmp;
+	cfqd->cid[crq->ioprio].busy_sectors += tmp;
+	atomic_add(tmp,&(cfqd->cid[crq->ioprio].cum_sectors_in));
+
 	crq->nr_sectors = req->hard_nr_sectors;
 
 	q->last_merge = req;
@@ -683,6 +700,7 @@
 
 	cfqd->cid[cfqq->ioprio].busy_queues--;
 	WARN_ON(cfqd->cid[cfqq->ioprio].busy_queues < 0);
+	atomic_inc(&(cfqd->cid[cfqq->ioprio].cum_queues_out));
 
 	list_del(&cfqq->cfq_list);
 	hlist_del(&cfqq->cfq_hash);
@@ -756,7 +774,9 @@
 			if (!list_empty(&cfqq->cfq_list)) {
 				cfqd->cid[cfqq->ioprio].busy_queues--;
 				WARN_ON(cfqd->cid[cfqq->ioprio].busy_queues<0);
+				atomic_inc(&(cfqd->cid[cfqq->ioprio].cum_queues_out));
 				cfqd->cid[prio].busy_queues++;
+				atomic_inc(&(cfqd->cid[prio].cum_queues_in));
 				list_move_tail(&cfqq->cfq_list, 
 					       &cfqd->cid[prio].rr_list);
 			}
@@ -769,6 +789,7 @@
 			list_add_tail(&cfqq->cfq_list, 
 				      &cfqd->cid[prio].rr_list);
 			cfqd->cid[prio].busy_queues++;
+			atomic_inc(&(cfqd->cid[prio].cum_queues_in));
 			cfqd->busy_queues++;
 		}
 
@@ -1052,6 +1073,13 @@
 		INIT_LIST_HEAD(&cid->prio_list);
 		cid->last_rq = -1;
 		cid->last_sectors = -1;
+
+		atomic_set(&cid->cum_rq_in,0);		
+		atomic_set(&cid->cum_rq_out,0);
+		atomic_set(&cid->cum_sectors_in,0);
+		atomic_set(&cid->cum_sectors_out,0);		
+		atomic_set(&cid->cum_queues_in,0);
+		atomic_set(&cid->cum_queues_out,0);
 	}
 
 	cfqd->crq_hash = kmalloc(sizeof(struct hlist_head) * CFQ_MHASH_ENTRIES,
@@ -1179,6 +1207,100 @@
 STORE_FUNCTION(cfq_grace_idle_store, &cfqd->cfq_grace_idle, 0, INT_MAX);
 #undef STORE_FUNCTION
 
+
+/* Additional entries to get priority level data */
+static ssize_t
+cfq_prio_show(struct cfq_data *cfqd, char *page, unsigned int priolvl)
+{
+	int r1,r2,s1,s2,q1,q2;
+
+	if (!(priolvl >= IOPRIO_IDLE && priolvl <= IOPRIO_RT)) 
+		return 0;
+	
+	r1 = (int)atomic_read(&(cfqd->cid[priolvl].cum_rq_in));
+	r2 = (int)atomic_read(&(cfqd->cid[priolvl].cum_rq_out));
+	s1 = (int)atomic_read(&(cfqd->cid[priolvl].cum_sectors_in));
+	s2 = (int)atomic_read(&(cfqd->cid[priolvl].cum_sectors_out));
+	q1 = (int)atomic_read(&(cfqd->cid[priolvl].cum_queues_in)); 
+	q2 = (int)atomic_read(&(cfqd->cid[priolvl].cum_queues_out));
+	
+	return sprintf(page,"rq (%d,%d) sec (%d,%d) q (%d,%d)\n",
+		      r1,r2,
+		      s1,s2,
+		      q1,q2);
+}
+
+#define SHOW_PRIO_DATA(__PRIOLVL)                                               \
+static ssize_t cfq_prio_##__PRIOLVL##_show(struct cfq_data *cfqd, char *page)	\
+{									        \
+	return cfq_prio_show(cfqd,page,__PRIOLVL);				\
+}
+SHOW_PRIO_DATA(0);
+SHOW_PRIO_DATA(1);
+SHOW_PRIO_DATA(2);
+SHOW_PRIO_DATA(3);
+SHOW_PRIO_DATA(4);
+SHOW_PRIO_DATA(5);
+SHOW_PRIO_DATA(6);
+SHOW_PRIO_DATA(7);
+SHOW_PRIO_DATA(8);
+SHOW_PRIO_DATA(9);
+SHOW_PRIO_DATA(10);
+SHOW_PRIO_DATA(11);
+SHOW_PRIO_DATA(12);
+SHOW_PRIO_DATA(13);
+SHOW_PRIO_DATA(14);
+SHOW_PRIO_DATA(15);
+SHOW_PRIO_DATA(16);
+SHOW_PRIO_DATA(17);
+SHOW_PRIO_DATA(18);
+SHOW_PRIO_DATA(19);
+SHOW_PRIO_DATA(20);
+#undef SHOW_PRIO_DATA
+
+
+static ssize_t cfq_prio_store(struct cfq_data *cfqd, const char *page, size_t count, int priolvl)
+{	
+	atomic_set(&(cfqd->cid[priolvl].cum_rq_in),0);
+	atomic_set(&(cfqd->cid[priolvl].cum_rq_out),0);
+	atomic_set(&(cfqd->cid[priolvl].cum_sectors_in),0);
+	atomic_set(&(cfqd->cid[priolvl].cum_sectors_out),0);
+	atomic_set(&(cfqd->cid[priolvl].cum_queues_in),0);
+	atomic_set(&(cfqd->cid[priolvl].cum_queues_out),0);
+
+	return count;
+}
+
+
+#define STORE_PRIO_DATA(__PRIOLVL)				                                   \
+static ssize_t cfq_prio_##__PRIOLVL##_store(struct cfq_data *cfqd, const char *page, size_t count) \
+{									                           \
+        return cfq_prio_store(cfqd,page,count,__PRIOLVL);                                          \
+}                  
+STORE_PRIO_DATA(0);     
+STORE_PRIO_DATA(1);
+STORE_PRIO_DATA(2);
+STORE_PRIO_DATA(3);
+STORE_PRIO_DATA(4);
+STORE_PRIO_DATA(5);
+STORE_PRIO_DATA(6);
+STORE_PRIO_DATA(7);
+STORE_PRIO_DATA(8);
+STORE_PRIO_DATA(9);
+STORE_PRIO_DATA(10);
+STORE_PRIO_DATA(11);
+STORE_PRIO_DATA(12);
+STORE_PRIO_DATA(13);
+STORE_PRIO_DATA(14);
+STORE_PRIO_DATA(15);
+STORE_PRIO_DATA(16);
+STORE_PRIO_DATA(17);
+STORE_PRIO_DATA(18);
+STORE_PRIO_DATA(19);
+STORE_PRIO_DATA(20);
+#undef STORE_PRIO_DATA
+
+
 static struct cfq_fs_entry cfq_quantum_entry = {
 	.attr = {.name = "quantum", .mode = S_IRUGO | S_IWUSR },
 	.show = cfq_quantum_show,
@@ -1215,6 +1337,58 @@
 	.store = cfq_grace_idle_store,
 };
 
+#define P_0_STR   "p0"
+#define P_1_STR   "p1"
+#define P_2_STR   "p2"
+#define P_3_STR   "p3"
+#define P_4_STR   "p4"
+#define P_5_STR   "p5"
+#define P_6_STR   "p6"
+#define P_7_STR   "p7"
+#define P_8_STR   "p8"
+#define P_9_STR   "p9"
+#define P_10_STR  "p10"
+#define P_11_STR  "p11"
+#define P_12_STR  "p12"
+#define P_13_STR  "p13"
+#define P_14_STR  "p14"
+#define P_15_STR  "p15"
+#define P_16_STR  "p16"
+#define P_17_STR  "p17"
+#define P_18_STR  "p18"
+#define P_19_STR  "p19"
+#define P_20_STR  "p20"
+
+
+#define CFQ_PRIO_SYSFS_ENTRY(__PRIOLVL)				           \
+static struct cfq_fs_entry cfq_prio_##__PRIOLVL##_entry = {                \
+	.attr = {.name = P_##__PRIOLVL##_STR, .mode = S_IRUGO | S_IWUSR }, \
+	.show = cfq_prio_##__PRIOLVL##_show,                               \
+	.store = cfq_prio_##__PRIOLVL##_store,                             \
+};
+CFQ_PRIO_SYSFS_ENTRY(0);
+CFQ_PRIO_SYSFS_ENTRY(1);
+CFQ_PRIO_SYSFS_ENTRY(2);
+CFQ_PRIO_SYSFS_ENTRY(3);
+CFQ_PRIO_SYSFS_ENTRY(4);
+CFQ_PRIO_SYSFS_ENTRY(5);
+CFQ_PRIO_SYSFS_ENTRY(6);
+CFQ_PRIO_SYSFS_ENTRY(7);
+CFQ_PRIO_SYSFS_ENTRY(8);
+CFQ_PRIO_SYSFS_ENTRY(9);
+CFQ_PRIO_SYSFS_ENTRY(10);
+CFQ_PRIO_SYSFS_ENTRY(11);
+CFQ_PRIO_SYSFS_ENTRY(12);
+CFQ_PRIO_SYSFS_ENTRY(13);
+CFQ_PRIO_SYSFS_ENTRY(14);
+CFQ_PRIO_SYSFS_ENTRY(15);
+CFQ_PRIO_SYSFS_ENTRY(16);
+CFQ_PRIO_SYSFS_ENTRY(17);
+CFQ_PRIO_SYSFS_ENTRY(18);
+CFQ_PRIO_SYSFS_ENTRY(19);
+CFQ_PRIO_SYSFS_ENTRY(20);
+#undef CFQ_PRIO_SYSFS_ENTRY
+
 static struct attribute *default_attrs[] = {
 	&cfq_quantum_entry.attr,
 	&cfq_quantum_io_entry.attr,
@@ -1223,6 +1397,27 @@
 	&cfq_queued_entry.attr,
 	&cfq_grace_rt_entry.attr,
 	&cfq_grace_idle_entry.attr,
+	&cfq_prio_0_entry.attr,
+	&cfq_prio_1_entry.attr,
+	&cfq_prio_2_entry.attr,
+	&cfq_prio_3_entry.attr,
+	&cfq_prio_4_entry.attr,
+	&cfq_prio_5_entry.attr,
+	&cfq_prio_6_entry.attr,
+	&cfq_prio_7_entry.attr,
+	&cfq_prio_8_entry.attr,
+	&cfq_prio_9_entry.attr,
+	&cfq_prio_10_entry.attr,
+	&cfq_prio_11_entry.attr,
+	&cfq_prio_12_entry.attr,
+	&cfq_prio_13_entry.attr,
+	&cfq_prio_14_entry.attr,
+	&cfq_prio_15_entry.attr,
+	&cfq_prio_16_entry.attr,
+	&cfq_prio_17_entry.attr,
+	&cfq_prio_18_entry.attr,
+	&cfq_prio_19_entry.attr,
+	&cfq_prio_20_entry.attr,
 	NULL,
 };
 

             reply	other threads:[~2004-09-24 23:44 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-09-24 23:41 Shailabh Nagar [this message]
  -- strict thread matches above, loose matches on Subject: below --
2004-09-30  6:59 [PATCH][1/1] Per-priority statistics for CFQ w/iopriorities 2.6.8.1 Jens Axboe
2004-09-30 14:20 ` Shailabh Nagar
2004-09-30 14:20   ` Jens Axboe
2004-09-30 14:47     ` Shailabh Nagar
2004-09-30 14:49       ` Jens Axboe

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4154B0A1.1070305@watson.ibm.com \
    --to=nagar@watson.ibm.com \
    --cc=ckrm-tech@lists.sourceforge.net \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox