lib/raid6: add option to skip algo benchmarking 70/224370/1
authorDaniel Verkamp <dverkamp@chromium.org>
Mon, 12 Nov 2018 23:26:52 +0000 (15:26 -0800)
committerJunghoon Kim <jhoon20.kim@samsung.com>
Mon, 10 Feb 2020 06:18:53 +0000 (15:18 +0900)
This is helpful for systems where fast startup time is important.
It is especially nice to avoid benchmarking RAID functions that are
never used (for example, BTRFS selects RAID6_PQ even if the parity RAID
mode is not in use).

This saves 250+ milliseconds of boot time on modern x86 and ARM systems
with a dozen or more available implementations.

The new option is defaulted to 'y' to match the previous behavior of
always benchmarking on init.

Signed-off-by: Daniel Verkamp <dverkamp@chromium.org>
Signed-off-by: Shaohua Li <shli@fb.com>
[jhoon20.kim: backport from mainline for the fast kernel startup]

Change-Id: I38c270c413d60de65f27cf9c95d44bb2e2d07ac2
Signed-off-by: Junghoon Kim <jhoon20.kim@samsung.com>
include/linux/raid/pq.h
lib/Kconfig
lib/raid6/algos.c

index 8dfaa2ce2e956e0037c469daed8586cb9a94bc68..db8fc96b843ed2996bfa37bc5a6129342b25442e 100644 (file)
@@ -67,6 +67,9 @@ extern const char raid6_empty_zero_page[PAGE_SIZE];
 #define MODULE_DESCRIPTION(desc)
 #define subsys_initcall(x)
 #define module_exit(x)
+
+#define IS_ENABLED(x) (x)
+#define CONFIG_RAID6_PQ_BENCHMARK 1
 #endif /* __KERNEL__ */
 
 /* Routine choices */
index 5637c9a1017385797f7c683ec529d3231afbaf14..c61757d405c47d138a781c62e12b1f5f5dcb2771 100644 (file)
@@ -10,6 +10,14 @@ menu "Library routines"
 config RAID6_PQ
        tristate
 
+config RAID6_PQ_BENCHMARK
+       bool "Automatically choose fastest RAID6 PQ functions"
+       depends on RAID6_PQ
+       default y
+       help
+         Benchmark all available RAID6 PQ functions on init and choose the
+         fastest one.
+
 config BITREVERSE
        tristate
 
index 6d7316fe9f30207d83bfe6f086ca98984040207d..1da2445367f968c6f655db133ed1ce9072d0cdc6 100644 (file)
@@ -131,6 +131,11 @@ static inline const struct raid6_calls *raid6_choose_gen(
                        if ((*algo)->valid && !(*algo)->valid())
                                continue;
 
+                       if (!IS_ENABLED(CONFIG_RAID6_PQ_BENCHMARK)) {
+                               best = *algo;
+                               break;
+                       }
+
                        perf = 0;
 
                        preempt_disable();