aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDarrick J. Wong <darrick.wong@oracle.com>2018-02-02 09:32:45 -0600
committerEric Sandeen <sandeen@redhat.com>2018-02-02 09:32:45 -0600
commite031d90f536d192cb9206cbc55222beeca68d057 (patch)
treeac0416786a456a02a1518062ee55b04fcaa34257
parent173a02839e85915bd4feca0170fd6a0ca87d3bb9 (diff)
downloadxfsprogs-dev-e031d90f536d192cb9206cbc55222beeca68d057.tar.gz
xfs_scrub: figure out how many threads we're going to need
Create the plumbing to figure out how many threads we're going to want to do all of our scrubbing. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Eric Sandeen <sandeen@redhat.com> Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
-rw-r--r--scrub/common.c26
-rw-r--r--scrub/common.h2
-rw-r--r--scrub/xfs_scrub.h3
3 files changed, 31 insertions, 0 deletions
diff --git a/scrub/common.c b/scrub/common.c
index 37ccd4a36e..05bb89b1de 100644
--- a/scrub/common.c
+++ b/scrub/common.c
@@ -168,3 +168,29 @@ no_prefix:
*units = "";
return number;
}
+
+/* How many threads to kick off? */
+unsigned int
+scrub_nproc(
+ struct scrub_ctx *ctx)
+{
+ if (nr_threads)
+ return nr_threads;
+ return ctx->nr_io_threads;
+}
+
+/*
+ * How many threads to kick off for a workqueue? If we only want one
+ * thread, save ourselves the overhead and just run it in the main thread.
+ */
+unsigned int
+scrub_nproc_workqueue(
+ struct scrub_ctx *ctx)
+{
+ unsigned int x;
+
+ x = scrub_nproc(ctx);
+ if (x == 1)
+ x = 0;
+ return x;
+}
diff --git a/scrub/common.h b/scrub/common.h
index e26e0e849a..4779dbdc5c 100644
--- a/scrub/common.h
+++ b/scrub/common.h
@@ -61,5 +61,7 @@ debug_tweak_on(
double timeval_subtract(struct timeval *tv1, struct timeval *tv2);
double auto_space_units(unsigned long long kilobytes, char **units);
double auto_units(unsigned long long number, char **units);
+unsigned int scrub_nproc(struct scrub_ctx *ctx);
+unsigned int scrub_nproc_workqueue(struct scrub_ctx *ctx);
#endif /* XFS_SCRUB_COMMON_H_ */
diff --git a/scrub/xfs_scrub.h b/scrub/xfs_scrub.h
index 51b8b7a44d..6d9f0c1e2d 100644
--- a/scrub/xfs_scrub.h
+++ b/scrub/xfs_scrub.h
@@ -54,6 +54,9 @@ struct scrub_ctx {
/* How does the user want us to react to errors? */
enum error_action error_action;
+ /* Number of threads for metadata scrubbing */
+ unsigned int nr_io_threads;
+
/* Mutable scrub state; use lock. */
pthread_mutex_t lock;
unsigned long long max_errors;