Whamcloud - gitweb
b=22514 kernel update for rhel5.5 & oel5.5.
[fs/lustre-release.git] / lustre / kernel_patches / patches / raid5-stats-rhel5.patch
1 diff -pru linux-2.6.18-53.orig/drivers/md/raid5.c linux-2.6.18-53/drivers/md/raid5.c
2 --- linux-2.6.18-53.orig/drivers/md/raid5.c     2007-12-06 17:15:22.000000000 +0800
3 +++ linux-2.6.18-53/drivers/md/raid5.c  2007-12-06 17:17:30.000000000 +0800
4 @@ -115,10 +115,12 @@ static void __release_stripe(raid5_conf_
5                         if (test_bit(STRIPE_DELAYED, &sh->state)) {
6                                 list_add_tail(&sh->lru, &conf->delayed_list);
7                                 blk_plug_device(conf->mddev->queue);
8 +                               atomic_inc(&conf->delayed);
9                         } else if (test_bit(STRIPE_BIT_DELAY, &sh->state) &&
10                                    sh->bm_seq - conf->seq_write > 0) {
11                                 list_add_tail(&sh->lru, &conf->bitmap_list);
12                                 blk_plug_device(conf->mddev->queue);
13 +                               atomic_inc(&conf->bit_delayed);
14                         } else {
15                                 clear_bit(STRIPE_BIT_DELAY, &sh->state);
16                                 list_add_tail(&sh->lru, &conf->handle_list);
17 @@ -289,6 +291,7 @@ static struct stripe_head *get_active_st
18                         if (noblock && sh == NULL)
19                                 break;
20                         if (!sh) {
21 +                               atomic_inc(&conf->out_of_stripes);
22                                 conf->inactive_blocked = 1;
23                                 wait_event_lock_irq(conf->wait_for_stripe,
24                                                     !list_empty(&conf->inactive_list) &&
25 @@ -311,6 +314,10 @@ static struct stripe_head *get_active_st
26                                     !test_bit(STRIPE_EXPANDING, &sh->state))
27                                         BUG();
28                                 list_del_init(&sh->lru);
29 +                               if (test_bit(STRIPE_DELAYED, &sh->state))
30 +                                       atomic_dec(&conf->delayed);
31 +                               if (test_bit(STRIPE_BIT_DELAY, &sh->state))
32 +                                       atomic_dec(&conf->bit_delayed);
33                         }
34                 }
35         } while (sh == NULL);
36 @@ -529,6 +536,8 @@ static int raid5_end_read_request(struct
37         if (bi->bi_size)
38                 return 1;
39  
40 +       atomic_dec(&conf->out_reqs_in_queue);
41 +
42         for (i=0 ; i<disks; i++)
43                 if (bi == &sh->dev[i].req)
44                         break;
45 @@ -642,6 +651,8 @@ static int raid5_end_write_request (stru
46         if (bi->bi_size)
47                 return 1;
48  
49 +       atomic_dec(&conf->out_reqs_in_queue);
50 +
51         for (i=0 ; i<disks; i++)
52                 if (bi == &sh->dev[i].req)
53                         break;
54 @@ -1402,6 +1413,8 @@ static void handle_stripe5(struct stripe
55         clear_bit(STRIPE_HANDLE, &sh->state);
56         clear_bit(STRIPE_DELAYED, &sh->state);
57  
58 +       atomic_inc(&conf->handle_called);
59 +
60         syncing = test_bit(STRIPE_SYNCING, &sh->state);
61         expanding = test_bit(STRIPE_EXPAND_SOURCE, &sh->state);
62         expanded = test_bit(STRIPE_EXPAND_READY, &sh->state);
63 @@ -1684,6 +1697,7 @@ static void handle_stripe5(struct stripe
64                                                 set_bit(R5_LOCKED, &dev->flags);
65                                                 set_bit(R5_Wantread, &dev->flags);
66                                                 locked++;
67 +                                               atomic_inc(&conf->reads_for_rmw);
68                                         } else {
69                                                 set_bit(STRIPE_DELAYED, &sh->state);
70                                                 set_bit(STRIPE_HANDLE, &sh->state);
71 @@ -1703,6 +1717,7 @@ static void handle_stripe5(struct stripe
72                                                 set_bit(R5_LOCKED, &dev->flags);
73                                                 set_bit(R5_Wantread, &dev->flags);
74                                                 locked++;
75 +                                               atomic_inc(&conf->reads_for_rcw);
76                                         } else {
77                                                 set_bit(STRIPE_DELAYED, &sh->state);
78                                                 set_bit(STRIPE_HANDLE, &sh->state);
79 @@ -1870,6 +1885,7 @@ static void handle_stripe5(struct stripe
80                 bi->bi_end_io(bi, bytes,
81                               test_bit(BIO_UPTODATE, &bi->bi_flags)
82                                 ? 0 : -EIO);
83 +               atomic_dec(&conf->in_reqs_in_queue);
84         }
85         for (i=disks; i-- ;) {
86                 int rw;
87 @@ -1885,10 +1901,13 @@ static void handle_stripe5(struct stripe
88                 bi = &sh->dev[i].req;
89   
90                 bi->bi_rw = rw;
91 -               if (rw)
92 +               if (rw) {
93 +                       atomic_inc(&conf->writes_out);
94                         bi->bi_end_io = raid5_end_write_request;
95 -               else
96 +               } else {
97 +                       atomic_inc(&conf->reads_out);
98                         bi->bi_end_io = raid5_end_read_request;
99 +               }
100   
101                 rcu_read_lock();
102                 rdev = rcu_dereference(conf->disks[i].rdev);
103 @@ -1919,6 +1938,7 @@ static void handle_stripe5(struct stripe
104                         if (rw == WRITE &&
105                             test_bit(R5_ReWrite, &sh->dev[i].flags))
106                                 atomic_add(STRIPE_SECTORS, &rdev->corrected_errors);
107 +                       atomic_inc(&conf->out_reqs_in_queue);
108                         generic_make_request(bi);
109                 } else {
110                         if (rw == 1)
111 @@ -1955,6 +1975,8 @@ static void handle_stripe6(struct stripe
112         clear_bit(STRIPE_HANDLE, &sh->state);
113         clear_bit(STRIPE_DELAYED, &sh->state);
114  
115 +       atomic_inc(&conf->handle_called);
116 +
117         syncing = test_bit(STRIPE_SYNCING, &sh->state);
118         /* Now to look around and see what can be done */
119  
120 @@ -2255,6 +2277,7 @@ static void handle_stripe6(struct stripe
121                                                 set_bit(R5_LOCKED, &dev->flags);
122                                                 set_bit(R5_Wantread, &dev->flags);
123                                                 locked++;
124 +                                               atomic_inc(&conf->reads_for_rcw);
125                                         } else {
126                                                 PRINTK("Request delayed stripe %llu block %d for Reconstruct\n",
127                                                        (unsigned long long)sh->sector, i);
128 @@ -2423,6 +2446,7 @@ static void handle_stripe6(struct stripe
129                 bi->bi_end_io(bi, bytes,
130                               test_bit(BIO_UPTODATE, &bi->bi_flags)
131                                 ? 0 : -EIO);
132 +               atomic_dec(&conf->in_reqs_in_queue);
133         }
134         for (i=disks; i-- ;) {
135                 int rw;
136 @@ -2438,10 +2462,13 @@ static void handle_stripe6(struct stripe
137                 bi = &sh->dev[i].req;
138  
139                 bi->bi_rw = rw;
140 -               if (rw)
141 +               if (rw) {
142 +                       atomic_inc(&conf->writes_out);
143                         bi->bi_end_io = raid5_end_write_request;
144 -               else
145 +               } else {
146 +                       atomic_inc(&conf->reads_out);
147                         bi->bi_end_io = raid5_end_read_request;
148 +               }
149  
150                 rcu_read_lock();
151                 rdev = rcu_dereference(conf->disks[i].rdev);
152 @@ -2473,6 +2500,7 @@ static void handle_stripe6(struct stripe
153                             test_bit(R5_ReWrite, &sh->dev[i].flags))
154                                 atomic_add(STRIPE_SECTORS, &rdev->corrected_errors);
155                         generic_make_request(bi);
156 +                       atomic_inc(&conf->out_reqs_in_queue);
157                 } else {
158                         if (rw == 1)
159                                 set_bit(STRIPE_DEGRADED, &sh->state);
160 @@ -2506,6 +2534,7 @@ static void raid5_activate_delayed(raid5
161                         if (!test_and_set_bit(STRIPE_PREREAD_ACTIVE, &sh->state))
162                                 atomic_inc(&conf->preread_active_stripes);
163                         list_add_tail(&sh->lru, &conf->handle_list);
164 +                       atomic_dec(&conf->delayed);
165                 }
166         }
167  }
168 @@ -2608,6 +2637,8 @@ static int make_request(request_queue_t 
169         const int rw = bio_data_dir(bi);
170         int remaining;
171  
172 +       atomic_inc(&conf->in_reqs_in_queue);
173 +
174         if (unlikely(bio_barrier(bi))) {
175                 bio_endio(bi, bi->bi_size, -EOPNOTSUPP);
176                 return 0;
177 @@ -2617,6 +2648,11 @@ static int make_request(request_queue_t 
178  
179         disk_stat_inc(mddev->gendisk, ios[rw]);
180         disk_stat_add(mddev->gendisk, sectors[rw], bio_sectors(bi));
181 +       if (rw == WRITE)
182 +               atomic_inc(&conf->writes_in);
183 +       else
184 +               atomic_inc(&conf->reads_in);
185 +
186  
187         logical_sector = bi->bi_sector & ~((sector_t)STRIPE_SECTORS-1);
188         last_sector = bi->bi_sector + (bi->bi_size>>9);
189 @@ -2724,6 +2760,7 @@ static int make_request(request_queue_t 
190  
191                 if ( rw == WRITE )
192                         md_write_end(mddev);
193 +               atomic_dec(&conf->in_reqs_in_queue);
194                 bi->bi_size = 0;
195                 bi->bi_end_io(bi, bytes, 0);
196         }
197 @@ -2985,6 +3022,7 @@ static void raid5d (mddev_t *mddev)
198                 spin_unlock_irq(&conf->device_lock);
199                 
200                 handled++;
201 +               atomic_inc(&conf->handled_in_raid5d);
202                 handle_stripe(sh, conf->spare_page);
203                 release_stripe(sh);
204  
205 @@ -3381,6 +3419,21 @@ static void status (struct seq_file *seq
206                                conf->disks[i].rdev &&
207                                test_bit(In_sync, &conf->disks[i].rdev->flags) ? "U" : "_");
208         seq_printf (seq, "]");
209 +       seq_printf (seq, "\n\t\tin: %u reads, %u writes; out: %u reads, %u writes",
210 +                       atomic_read(&conf->reads_in), atomic_read(&conf->writes_in),
211 +                       atomic_read(&conf->reads_out), atomic_read(&conf->writes_out));
212 +       seq_printf (seq, "\n\t\t%u in raid5d, %u out of stripes, %u handle called",
213 +                       atomic_read(&conf->handled_in_raid5d),
214 +                       atomic_read(&conf->out_of_stripes),
215 +                       atomic_read(&conf->handle_called));
216 +       seq_printf (seq, "\n\t\treads: %u for rmw, %u for rcw",
217 +                       atomic_read(&conf->reads_for_rmw),
218 +                       atomic_read(&conf->reads_for_rcw));
219 +       seq_printf (seq, "\n\t\t%u delayed, %u bit delayed, %u active, queues: %u in, %u out\n",
220 +                       atomic_read(&conf->delayed), atomic_read(&conf->bit_delayed),
221 +                       atomic_read(&conf->active_stripes),
222 +                       atomic_read(&conf->in_reqs_in_queue),
223 +                       atomic_read(&conf->out_reqs_in_queue));
224  #if RAID5_DEBUG
225         seq_printf (seq, "\n");
226         printall(seq, conf);
227 diff -pru linux-2.6.18-53.orig/include/linux/raid/raid5.h linux-2.6.18-53/include/linux/raid/raid5.h
228 --- linux-2.6.18-53.orig/include/linux/raid/raid5.h     2007-12-06 17:15:22.000000000 +0800
229 +++ linux-2.6.18-53/include/linux/raid/raid5.h  2007-12-06 17:15:32.000000000 +0800
230 @@ -259,6 +259,25 @@ struct raid5_private_data {
231         int                     pool_size; /* number of disks in stripeheads in pool */
232         spinlock_t              device_lock;
233         struct disk_info        *disks;
234 +
235 +       /*
236 +        * Stats
237 +        */
238 +       atomic_t                reads_in;
239 +       atomic_t                writes_in;
240 +       atomic_t                reads_out;
241 +       atomic_t                writes_out;
242 +       atomic_t                handled_in_raid5d;
243 +       atomic_t                out_of_stripes;
244 +       atomic_t                reads_for_rmw;
245 +       atomic_t                reads_for_rcw;
246 +       atomic_t                writes_zcopy;
247 +       atomic_t                writes_copied;
248 +       atomic_t                handle_called;
249 +       atomic_t                delayed;
250 +       atomic_t                bit_delayed;
251 +       atomic_t                in_reqs_in_queue;
252 +       atomic_t                out_reqs_in_queue;
253  };
254  
255  typedef struct raid5_private_data raid5_conf_t;
256 Only in linux-2.6.18-53.orig/include/linux/raid: .raid5.h.swp