Whamcloud - gitweb
JBD2_HAS_COMPAT_FEATURE was used instead of JBD2_HAS_INCOMPAT_FEATURE for
[fs/lustre-release.git] / lustre / kernel_patches / patches / raid6-stats.patch
1 diff -pur linux-2.6.9-55.0.9.orig/drivers/md/raid6main.c linux-2.6.9-55.0.9/drivers/md/raid6main.c
2 --- linux-2.6.9-55.0.9.orig/drivers/md/raid6main.c      2007-09-28 17:53:55.000000000 +0800
3 +++ linux-2.6.9-55.0.9/drivers/md/raid6main.c   2007-12-13 20:19:11.000000000 +0800
4 @@ -96,9 +96,10 @@ static inline void __release_stripe(raid
5                 if (atomic_read(&conf->active_stripes)==0)
6                         BUG();
7                 if (test_bit(STRIPE_HANDLE, &sh->state)) {
8 -                       if (test_bit(STRIPE_DELAYED, &sh->state))
9 +                       if (test_bit(STRIPE_DELAYED, &sh->state)) {
10                                 list_add_tail(&sh->lru, &conf->delayed_list);
11 -                       else
12 +                               atomic_inc(&conf->delayed);
13 +                       } else
14                                 list_add_tail(&sh->lru, &conf->handle_list);
15                         md_wakeup_thread(conf->mddev->thread);
16                 } else {
17 @@ -269,6 +270,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 @@ -290,6 +292,9 @@ static struct stripe_head *get_active_st
26                                 if (list_empty(&sh->lru))
27                                         BUG();
28                                 list_del_init(&sh->lru);
29 +                               if (test_bit(STRIPE_DELAYED, &sh->state))
30 +                                       atomic_dec(&conf->delayed);
31 +
32                         }
33                 }
34         } while (sh == NULL);
35 @@ -368,6 +373,8 @@ static int raid6_end_read_request (struc
36         if (bi->bi_size)
37                 return 1;
38  
39 +       atomic_dec(&conf->out_reqs_in_queue);
40 +
41         for (i=0 ; i<disks; i++)
42                 if (bi == &sh->dev[i].req)
43                         break;
44 @@ -445,6 +452,8 @@ static int raid6_end_write_request (stru
45                 if (bi == &sh->dev[i].req)
46                         break;
47  
48 +       atomic_dec(&conf->out_reqs_in_queue);
49 +
50         PRINTK("end_write_request %llu/%d, count %d, uptodate: %d.\n",
51                 (unsigned long long)sh->sector, i, atomic_read(&sh->count),
52                 uptodate);
53 @@ -989,6 +998,7 @@ static void handle_stripe(struct stripe_
54         spin_lock(&sh->lock);
55         clear_bit(STRIPE_HANDLE, &sh->state);
56         clear_bit(STRIPE_DELAYED, &sh->state);
57 +       atomic_inc(&conf->handle_called);
58  
59         syncing = test_bit(STRIPE_SYNCING, &sh->state);
60         /* Now to look around and see what can be done */
61 @@ -1257,6 +1267,7 @@ static void handle_stripe(struct stripe_
62                                                 set_bit(R5_LOCKED, &dev->flags);
63                                                 set_bit(R5_Wantread, &dev->flags);
64                                                 locked++;
65 +                                               atomic_inc(&conf->reads_for_rcw);
66                                         } else {
67                                                 PRINTK("Request delayed stripe %llu block %d for Reconstruct\n",
68                                                        (unsigned long long)sh->sector, i);
69 @@ -1390,6 +1401,7 @@ static void handle_stripe(struct stripe_
70                 bi->bi_next = NULL;
71                 bi->bi_size = 0;
72                 bi->bi_end_io(bi, bytes, 0);
73 +               atomic_dec(&conf->in_reqs_in_queue);
74         }
75         for (i=disks; i-- ;) {
76                 int rw;
77 @@ -1405,10 +1417,13 @@ static void handle_stripe(struct stripe_
78                 bi = &sh->dev[i].req;
79  
80                 bi->bi_rw = rw;
81 -               if (rw)
82 +               if (rw) {
83 +                       atomic_inc(&conf->writes_out);
84                         bi->bi_end_io = raid6_end_write_request;
85 -               else
86 +               } else {
87 +                       atomic_inc(&conf->reads_out);
88                         bi->bi_end_io = raid6_end_read_request;
89 +               }
90  
91                 spin_lock_irq(&conf->device_lock);
92                 rdev = conf->disks[i].rdev;
93 @@ -1436,12 +1451,14 @@ static void handle_stripe(struct stripe_
94                         bi->bi_io_vec[0].bv_offset = 0;
95                         bi->bi_size = STRIPE_SIZE;
96                         bi->bi_next = NULL;
97 +                       atomic_inc(&conf->out_reqs_in_queue);
98                         generic_make_request(bi);
99                 } else {
100                         PRINTK("skip op %ld on disc %d for sector %llu\n",
101                                 bi->bi_rw, i, (unsigned long long)sh->sector);
102                         clear_bit(R5_LOCKED, &sh->dev[i].flags);
103                         set_bit(STRIPE_HANDLE, &sh->state);
104 +                       atomic_dec(&conf->delayed);
105                 }
106         }
107  }
108 @@ -1555,6 +1572,8 @@ static int make_request (request_queue_t
109         sector_t logical_sector, last_sector;
110         struct stripe_head *sh;
111  
112 +       atomic_inc(&conf->in_reqs_in_queue);
113 +
114         if (unlikely(bio_barrier(bi))) {
115                 bio_endio(bi, bi->bi_size, -EOPNOTSUPP);
116                 return 0;
117 @@ -1563,9 +1582,11 @@ static int make_request (request_queue_t
118         if (bio_data_dir(bi)==WRITE) {
119                 disk_stat_inc(mddev->gendisk, writes);
120                 disk_stat_add(mddev->gendisk, write_sectors, bio_sectors(bi));
121 +               atomic_inc(&conf->writes_in);
122         } else {
123                 disk_stat_inc(mddev->gendisk, reads);
124                 disk_stat_add(mddev->gendisk, read_sectors, bio_sectors(bi));
125 +               atomic_inc(&conf->reads_in);
126         }
127  
128         logical_sector = bi->bi_sector & ~((sector_t)STRIPE_SECTORS-1);
129 @@ -1605,6 +1626,7 @@ static int make_request (request_queue_t
130  
131                 if ( bio_data_dir(bi) == WRITE )
132                         md_write_end(mddev);
133 +               atomic_dec(&conf->in_reqs_in_queue);
134                 bi->bi_size = 0;
135                 bi->bi_end_io(bi, bytes, 0);
136         }
137 @@ -1701,6 +1723,8 @@ static void raid6d (mddev_t *mddev)
138                 spin_unlock_irq(&conf->device_lock);
139  
140                 handled++;
141 +
142 +               atomic_inc(&conf->handled_in_raid5d);
143                 handle_stripe(sh);
144                 release_stripe(sh);
145  
146 @@ -1940,6 +1964,23 @@ static void status (struct seq_file *seq
147                             conf->disks[i].rdev &&
148                             conf->disks[i].rdev->in_sync ? "U" : "_");
149         seq_printf (seq, "]");
150
151 +       seq_printf (seq, "\n\t\tin: %u reads, %u writes; out: %u reads, %u writes",
152 +               atomic_read(&conf->reads_in), atomic_read(&conf->writes_in),
153 +               atomic_read(&conf->reads_out), atomic_read(&conf->writes_out));
154 +       seq_printf (seq, "\n\t\t%u in raid5d, %u out of stripes, %u handle called",
155 +               atomic_read(&conf->handled_in_raid5d),
156 +               atomic_read(&conf->out_of_stripes),
157 +               atomic_read(&conf->handle_called));
158 +       seq_printf (seq, "\n\t\treads: %u for rmw, %u for rcw",
159 +               atomic_read(&conf->reads_for_rmw),
160 +               atomic_read(&conf->reads_for_rcw));
161 +       seq_printf (seq, "\n\t\t%u delayed, %u active, queues: %u in, %u out\n",
162 +               atomic_read(&conf->delayed),
163 +               atomic_read(&conf->active_stripes),
164 +               atomic_read(&conf->in_reqs_in_queue),
165 +               atomic_read(&conf->out_reqs_in_queue));
166 +
167  #if RAID6_DUMPSTATE
168         seq_printf (seq, "\n");
169         printall(seq, conf);