/usr/src/kernel-patches/lustre/patches/raid5-stats.patch is in linux-patch-lustre 1.8.5+dfsg-3ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 | Add RAID statistics counters to /proc/mdstat
Index: 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))
|