]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
Perform parallel processing based on AG stride/concat unit
authorBarry Naujok <bnaujok@sgi.com>
Mon, 16 Jul 2007 15:52:53 +0000 (15:52 +0000)
committerBarry Naujok <bnaujok@sgi.com>
Mon, 16 Jul 2007 15:52:53 +0000 (15:52 +0000)
Merge of master-melb:xfs-cmds:29143a by kenmcd.

  Declare AG stride variable

repair/globals.h
repair/init.c
repair/phase3.c
repair/phase4.c
repair/xfs_repair.c

index 53b7859450782ee328c045c265c55ab03f1b403e..5982377c13765f30f9e6c2e1abe0638402ef9c09 100644 (file)
@@ -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 */
index 2996be96371cb16dfa4f61b4618de072105132ee..4036677dc48fa89ea47eb6fff3e69de42cfff183 100644 (file)
@@ -149,5 +149,4 @@ xfs_init(libxfs_init_t *args)
                if (do_prefetch)
                        libxfs_lio_allocate();
        }
-       thread_init();
 }
index 01ff95de67c10390f9b86dbbb7fdba465173470c..2e2ec510dd815ea848996a809ba7e5f1bc03f3e1 100644 (file)
@@ -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();
index 77b4709bcef7f367c05fa76c904527b09c6d733e..eb7a61fde1baf147100a43833f2190e0c35bcad1 100644 (file)
@@ -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();
 
index 3f4f5cecb88e3feab5e4a92c8d8d81f5ded6dcac..01d6af751c0049d81cdab90459f42b824d48711d 100644 (file)
@@ -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);