📄 raid5-stats.patch
字号:
Add RAID statistics counters to /proc/mdstatIndex: linux-2.6.9/include/linux/raid/raid5.h===================================================================--- linux-2.6.9.orig/include/linux/raid/raid5.h 2004-10-19 01:54:55.000000000 +0400+++ linux-2.6.9/include/linux/raid/raid5.h 2006-05-17 14:10:53.000000000 +0400@@ -222,6 +222,22 @@ struct raid5_private_data { int inactive_blocked; /* release of inactive stripes blocked, * waiting for 25% to be free */ + /*+ * Stats+ */+ atomic_t reads_in;+ atomic_t writes_in;+ atomic_t reads_out;+ atomic_t writes_out;+ atomic_t handled_in_raid5d;+ atomic_t out_of_stripes;+ atomic_t reads_for_rmw;+ atomic_t reads_for_rcw;+ atomic_t handle_called;+ atomic_t delayed;+ atomic_t in_reqs_in_queue;+ atomic_t out_reqs_in_queue;+ spinlock_t device_lock; struct disk_info disks[0]; };Index: linux-2.6.9/drivers/md/raid5.c===================================================================--- linux-2.6.9.orig/drivers/md/raid5.c 2006-03-10 18:20:48.000000000 +0300+++ linux-2.6.9/drivers/md/raid5.c 2006-05-17 14:10:53.000000000 +0400@@ -77,9 +77,10 @@ static inline void __release_stripe(raid if (atomic_read(&conf->active_stripes)==0) BUG(); if (test_bit(STRIPE_HANDLE, &sh->state)) {- if (test_bit(STRIPE_DELAYED, &sh->state))+ if (test_bit(STRIPE_DELAYED, &sh->state)) { list_add_tail(&sh->lru, &conf->delayed_list);- else+ atomic_inc(&conf->delayed);+ } else list_add_tail(&sh->lru, &conf->handle_list); md_wakeup_thread(conf->mddev->thread); } else {@@ -250,6 +251,7 @@ static struct stripe_head *get_active_st if (noblock && sh == NULL) break; if (!sh) {+ atomic_inc(&conf->out_of_stripes); conf->inactive_blocked = 1; wait_event_lock_irq(conf->wait_for_stripe, !list_empty(&conf->inactive_list) &&@@ -271,6 +273,8 @@ static struct stripe_head *get_active_st if (list_empty(&sh->lru)) BUG(); list_del_init(&sh->lru);+ if (test_bit(STRIPE_DELAYED, &sh->state))+ atomic_dec(&conf->delayed); } } } while (sh == NULL);@@ -349,6 +353,8 @@ static int raid5_end_read_request (struc if (bi->bi_size) return 1; + atomic_dec(&conf->out_reqs_in_queue);+ for (i=0 ; i<disks; i++) if (bi == &sh->dev[i].req) break;@@ -422,6 +428,8 @@ static int raid5_end_write_request (stru if (bi->bi_size) return 1; + atomic_dec(&conf->out_reqs_in_queue);+ for (i=0 ; i<disks; i++) if (bi == &sh->dev[i].req) break;@@ -882,6 +890,7 @@ static void handle_stripe(struct stripe_ spin_lock(&sh->lock); clear_bit(STRIPE_HANDLE, &sh->state); clear_bit(STRIPE_DELAYED, &sh->state);+ atomic_inc(&conf->handle_called); syncing = test_bit(STRIPE_SYNCING, &sh->state); /* Now to look around and see what can be done */@@ -1127,6 +1136,7 @@ static void handle_stripe(struct stripe_ set_bit(R5_LOCKED, &dev->flags); set_bit(R5_Wantread, &dev->flags); locked++;+ atomic_inc(&conf->reads_for_rmw); } else { set_bit(STRIPE_DELAYED, &sh->state); set_bit(STRIPE_HANDLE, &sh->state);@@ -1146,6 +1156,7 @@ static void handle_stripe(struct stripe_ set_bit(R5_LOCKED, &dev->flags); set_bit(R5_Wantread, &dev->flags); locked++;+ atomic_inc(&conf->reads_for_rcw); } else { set_bit(STRIPE_DELAYED, &sh->state); set_bit(STRIPE_HANDLE, &sh->state);@@ -1228,6 +1239,7 @@ static void handle_stripe(struct stripe_ bi->bi_next = NULL; bi->bi_size = 0; bi->bi_end_io(bi, bytes, 0);+ atomic_dec(&conf->in_reqs_in_queue); } for (i=disks; i-- ;) { int rw;@@ -1243,10 +1255,13 @@ static void handle_stripe(struct stripe_ bi = &sh->dev[i].req; bi->bi_rw = rw;- if (rw)+ if (rw) {+ atomic_inc(&conf->writes_out); bi->bi_end_io = raid5_end_write_request;- else+ } else {+ atomic_inc(&conf->reads_out); bi->bi_end_io = raid5_end_read_request;+ } spin_lock_irq(&conf->device_lock); rdev = conf->disks[i].rdev;@@ -1274,6 +1289,7 @@ static void handle_stripe(struct stripe_ bi->bi_io_vec[0].bv_offset = 0; bi->bi_size = STRIPE_SIZE; bi->bi_next = NULL;+ atomic_inc(&conf->out_reqs_in_queue); generic_make_request(bi); } else { PRINTK("skip op %ld on disc %d for sector %llu\n",@@ -1296,6 +1312,7 @@ static inline void raid5_activate_delaye if (!test_and_set_bit(STRIPE_PREREAD_ACTIVE, &sh->state)) atomic_inc(&conf->preread_active_stripes); list_add_tail(&sh->lru, &conf->handle_list);+ atomic_dec(&conf->delayed); } } }@@ -1395,12 +1412,16 @@ static int make_request (request_queue_t sector_t logical_sector, last_sector; struct stripe_head *sh; + atomic_inc(&conf->in_reqs_in_queue);+ if (bio_data_dir(bi)==WRITE) { disk_stat_inc(mddev->gendisk, writes); disk_stat_add(mddev->gendisk, write_sectors, bio_sectors(bi));+ atomic_inc(&conf->writes_in); } else { disk_stat_inc(mddev->gendisk, reads); disk_stat_add(mddev->gendisk, read_sectors, bio_sectors(bi));+ atomic_inc(&conf->reads_in); } logical_sector = bi->bi_sector & ~((sector_t)STRIPE_SECTORS-1);@@ -1439,6 +1460,7 @@ static int make_request (request_queue_t if ( bio_data_dir(bi) == WRITE ) md_write_end(mddev);+ atomic_dec(&conf->in_reqs_in_queue); bi->bi_size = 0; bi->bi_end_io(bi, bytes, 0); }@@ -1535,6 +1557,7 @@ static void raid5d (mddev_t *mddev) spin_unlock_irq(&conf->device_lock); handled++;+ atomic_inc(&conf->handled_in_raid5d); handle_stripe(sh); release_stripe(sh); @@ -1767,6 +1790,21 @@ static void status (struct seq_file *seq conf->disks[i].rdev && conf->disks[i].rdev->in_sync ? "U" : "_"); seq_printf (seq, "]");+ seq_printf (seq, "\n\t\tin: %u reads, %u writes; out: %u reads, %u writes",+ atomic_read(&conf->reads_in), atomic_read(&conf->writes_in),+ atomic_read(&conf->reads_out), atomic_read(&conf->writes_out));+ seq_printf (seq, "\n\t\t%u in raid5d, %u out of stripes, %u handle called",+ atomic_read(&conf->handled_in_raid5d),+ atomic_read(&conf->out_of_stripes),+ atomic_read(&conf->handle_called));+ seq_printf (seq, "\n\t\treads: %u for rmw, %u for rcw",+ atomic_read(&conf->reads_for_rmw),+ atomic_read(&conf->reads_for_rcw));+ seq_printf (seq, "\n\t\t%u delayed, %u active, queues: %u in, %u out\n",+ atomic_read(&conf->delayed),+ atomic_read(&conf->active_stripes),+ atomic_read(&conf->in_reqs_in_queue),+ atomic_read(&conf->out_reqs_in_queue)); #if RAID5_DEBUG #define D(x) \ seq_printf (seq, "<"#x":%d>", atomic_read(&conf->x))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -