In 2.6.14, doing a cat /proc/mdstat during a raid1 resync results in long pauses.
Can anyone tell me if adding kthread_should_stop() calls in the areas marked at the
end of this post would help and be a correct way to fix this?
Every 20.0s: cat /proc/mdstat
Tue Nov 1 11:47:07 2005
Personalities : [raid0] [raid1]
md1 : active raid1 sdb3[2] sda3[0]
154312256 blocks [2/1] [U_]
[=============>.......] recovery = 65.3% (100798208/154312256)
finish=20.1min speed=44337K/sec
md0 : active raid1 sdb1[1] sda1[0]
987840 blocks [2/2] [UU]
unused devices: <none>
Note / is md0 and should have no reason to be in device wait.
/dev/md0 / reiserfs defaults 0 0
/dev/sda2 swap swap defaults 0 0
/dev/sdb2 swap swap defaults 0 0
/dev/mapper/vortex_vg-tmp /tmp reiserfs defaults 0 0
/dev/mapper/vortex_vg-var /var reiserfs defaults 0 0
/dev/mapper/vortex_vg-usr /usr reiserfs defaults 0 0
/dev/mapper/vortex_vg-data /mnt/data reiserfs defaults 0 0
vortex_vg is on top of /dev/md1
During a md1 raid 1 resync, as soon as I cat /proc/mdstat many things device
wait (on an otherwise idle system):
132 root 15 0 0 0 0 D 0.0 0.0 0:03.64 pdflush
282 root 10 -5 0 0 0 D 0.0 0.0 0:00.23 md0_raid1
283 root 10 -5 0 0 0 D 0.0 0.0 0:00.19 reiserfs/0
28230 root 10 -5 0 0 0 D 0.7 0.0 0:15.99 md1_resync
In linux/drivers/md/bitmap.c:
static void bitmap_writeback_daemon(mddev_t *mddev)
{
struct bitmap *bitmap = mddev->bitmap;
struct page *page;
struct page_list *item;
int err = 0;
------> if (signal_pending(current)) {
printk(KERN_INFO
"%s: bitmap writeback daemon got signal, exiting...\n",
bmname(bitmap));
err = -EINTR;
goto out;
}
In linux/drivers/md/md.c
void md_check_recovery(mddev_t *mddev)
{
mdk_rdev_t *rdev;
struct list_head *rtmp;
if (mddev->bitmap)
bitmap_daemon_work(mddev->bitmap);
if (mddev->ro)
return;
------> if (signal_pending(current)) {
if (mddev->pers->sync_request) {
printk(KERN_INFO "md: %s in immediate safe mode\n",
mdname(mddev));
mddev->safemode = 2;
}
flush_signals(current);
}