From add3cb90ea576613ccab062ff561b3d88c63b267 Mon Sep 17 00:00:00 2001 From: Barry Naujok Date: Mon, 16 Jul 2007 15:52:53 +0000 Subject: [PATCH] Perform parallel processing based on AG stride/concat unit Merge of master-melb:xfs-cmds:29143a by kenmcd. Declare AG stride variable --- repair/globals.h | 2 ++ repair/init.c | 1 - repair/phase3.c | 10 ++++++++-- repair/phase4.c | 30 +++++++++++++++++++----------- repair/xfs_repair.c | 17 +++++++++++++---- 5 files changed, 42 insertions(+), 18 deletions(-) diff --git a/repair/globals.h b/repair/globals.h index 53b785945..5982377c1 100644 --- a/repair/globals.h +++ b/repair/globals.h @@ -200,4 +200,6 @@ EXTERN pthread_rwlock_t *per_ag_lock; EXTERN int report_interval; EXTERN __uint64_t *prog_rpt_done; +EXTERN int ag_stride; + #endif /* _XFS_REPAIR_GLOBAL_H */ diff --git a/repair/init.c b/repair/init.c index 2996be963..4036677dc 100644 --- a/repair/init.c +++ b/repair/init.c @@ -149,5 +149,4 @@ xfs_init(libxfs_init_t *args) if (do_prefetch) libxfs_lio_allocate(); } - thread_init(); } diff --git a/repair/phase3.c b/repair/phase3.c index 01ff95de6..2e2ec510d 100644 --- a/repair/phase3.c +++ b/repair/phase3.c @@ -192,8 +192,14 @@ phase3(xfs_mount_t *mp) " - process known inodes and perform inode discovery...\n")); set_progress_msg(PROG_FMT_PROCESS_INO, (__uint64_t) mp->m_sb.sb_icount); - for (i = 0; i < mp->m_sb.sb_agcount; i++) { - queue_work(parallel_p3_process_aginodes, mp, i); + if (ag_stride) { + int steps = (mp->m_sb.sb_agcount + ag_stride - 1) / ag_stride; + for (i = 0; i < steps; i++) + for (j = i; j < mp->m_sb.sb_agcount; j += ag_stride) + queue_work(parallel_p3_process_aginodes, mp, j); + } else { + for (i = 0; i < mp->m_sb.sb_agcount; i++) + parallel_p3_process_aginodes(mp, i); } wait_for_workers(); print_final_rpt(); diff --git a/repair/phase4.c b/repair/phase4.c index 77b4709bc..eb7a61fde 100644 --- a/repair/phase4.c +++ b/repair/phase4.c @@ -1342,18 +1342,26 @@ phase4(xfs_mount_t *mp) do_log(_(" - check for inodes claiming duplicate blocks...\n")); set_progress_msg(PROG_FMT_DUP_BLOCKS, (__uint64_t) mp->m_sb.sb_icount); - for (i = 0; i < mp->m_sb.sb_agcount; i++) { - /* - * ok, now process the inodes -- signal 2-pass check per inode. - * first pass checks if the inode conflicts with a known - * duplicate extent. if so, the inode is cleared and second - * pass is skipped. second pass sets the block bitmap - * for all blocks claimed by the inode. directory - * and attribute processing is turned OFF since we did that - * already in phase 3. - */ - queue_work(parallel_p4_process_aginodes, mp, i); + + /* + * ok, now process the inodes -- signal 2-pass check per inode. + * first pass checks if the inode conflicts with a known + * duplicate extent. if so, the inode is cleared and second + * pass is skipped. second pass sets the block bitmap + * for all blocks claimed by the inode. directory + * and attribute processing is turned OFF since we did that + * already in phase 3. + */ + if (ag_stride) { + int steps = (mp->m_sb.sb_agcount + ag_stride - 1) / ag_stride; + for (i = 0; i < steps; i++) + for (j = i; j < mp->m_sb.sb_agcount; j += ag_stride) + queue_work(parallel_p4_process_aginodes, mp, j); + } else { + for (i = 0; i < mp->m_sb.sb_agcount; i++) + parallel_p4_process_aginodes(mp, i); } + wait_for_workers(); print_final_rpt(); diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c index 3f4f5cecb..01d6af751 100644 --- a/repair/xfs_repair.c +++ b/repair/xfs_repair.c @@ -65,8 +65,8 @@ char *o_opts[] = { "pfdir", #define PREFETCH_AIO_CNT 6 "pfaio", -#define THREAD_CNT 7 - "thread", +#define AG_STRIDE 7 + "ag_stride", NULL }; @@ -186,6 +186,9 @@ process_args(int argc, char **argv) fs_has_extflgbit_allowed = 1; pre_65_beta = 0; fs_shared_allowed = 1; + ag_stride = 0; + thread_count = 0; + do_parallel = 0; report_interval = PROG_RPT_DEFAULT; /* @@ -233,8 +236,8 @@ process_args(int argc, char **argv) case PREFETCH_AIO_CNT: libxfs_lio_aio_count = (int) strtol(val, 0, 0); break; - case THREAD_CNT: - thread_count = (int) strtol(val, 0, 0); + case AG_STRIDE: + ag_stride = (int) strtol(val, 0, 0); break; default: unknown('o', val); @@ -525,6 +528,12 @@ main(int argc, char **argv) max_symlink_blocks = howmany(MAXPATHLEN - 1, mp->m_sb.sb_blocksize); inodes_per_cluster = XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_inodelog; + if (ag_stride) { + do_parallel = 1; + thread_count = (mp->m_sb.sb_agcount + ag_stride - 1) / ag_stride; + thread_init(); + } + if (do_parallel && report_interval) { init_progress_rpt(); msgbuf = malloc(DURATION_BUF_SIZE); -- 2.47.2