All pastes #27320 Raw Edit

Delemas

public text v1 · immutable
#27320 ·published 2005-11-01 17:30 UTC
rendered paste body
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);
        }