RE: [PATCH PREVIEW RFC 3/6] crypto: use bootcache to cache fastest algorithm
"Bird, Tim" <[email protected]> Mon, 29 Sep 2025 23:48:11 +0000
| Newsgroups | org.kernel.vger.linux-embedded |
|---|---|
| Message-ID | <MW5PR13MB56323768BFB9EE9C5D18DB8DFD1BA@MW5PR13MB5632.namprd13.prod.outlook.com> |
> -----Original Message----- > From: acampanella-thegoodpenguin <[email protected]> > Sent: Tuesday, September 23, 2025 8:24 AM > To: [email protected] > Subject: [PATCH PREVIEW RFC 3/6] crypto: use bootcache to cache fastest algorithm > > From: Andrew Murray <amurray@ thegoodpenguin. co. uk> During boot xor_blocks may determine the fastest xor algorithm by using > do_xor_speed to perform a speed test on available algorithms. This process can increase the overall boot time. Let's > From: Andrew Murray <[email protected]> > > During boot xor_blocks may determine the fastest xor algorithm > by using do_xor_speed to perform a speed test on available > algorithms. This process can increase the overall boot time. It would be good to mention the amount of time we're talking about here. It won't be the same value for all platforms, but you could mention the amount of time this takes on the platform you're working on (or on a particularly slow machine, if you want, just to highlight where it might be a problem for some situations but not all.) > > Let's make use of bootcache to cache the result of the speed > test for subsequent boots. > > Signed-off-by: Andrew Murray <[email protected]> > --- > crypto/xor.c | 29 ++++++++++++++++++++++++++++- > 1 file changed, 28 insertions(+), 1 deletion(-) > > diff --git a/crypto/xor.c b/crypto/xor.c > index f39621a57bb33c4015c06dff00e03a07716618f6..3457df0414064758a1923752e91642d2237af7b3 100644 > --- a/crypto/xor.c > +++ b/crypto/xor.c > @@ -14,6 +14,7 @@ > #include <linux/raid/xor.h> > #include <linux/jiffies.h> > #include <linux/preempt.h> > +#include <linux/bootcache.h> > #include <asm/xor.h> > > #ifndef XOR_SELECT_TEMPLATE > @@ -54,13 +55,13 @@ EXPORT_SYMBOL(xor_blocks); > /* Set of all registered templates. */ > static struct xor_block_template *__initdata template_list; > > -#ifndef MODULE > static void __init do_xor_register(struct xor_block_template *tmpl) > { > tmpl->next = template_list; > template_list = tmpl; > } > > +#ifndef MODULE > static int __init register_xor_blocks(void) > { > active_template = XOR_SELECT_TEMPLATE(NULL); > @@ -79,6 +80,21 @@ static int __init register_xor_blocks(void) > #define BENCH_SIZE 4096 > #define REPS 800U > > +static struct xor_block_template * __init > +xor_get_template_by_name(char *fastest_name) > +{ > + struct xor_block_template *f; > + > +#define xor_speed do_xor_register > + // build a list of templates > + XOR_TRY_TEMPLATES; > +#undef xor_speed > + for (f = template_list; f; f = f->next) > + if (!strcmp(f->name, fastest_name)) > + return f; > + return NULL; > +} > + > static void __init > do_xor_speed(struct xor_block_template *tmpl, void *b1, void *b2) > { > @@ -117,9 +133,18 @@ calibrate_xor_blocks(void) > { > void *b1, *b2; > struct xor_block_template *f, *fastest; > + char cached_name[32]; > + int ret; > > fastest = XOR_SELECT_TEMPLATE(NULL); > > + if (!fastest) { > + ret = bootcache_get_string("xor_blocks_fastest", > + cached_name, sizeof(cached_name)); > + if (!ret) > + fastest = xor_get_template_by_name(cached_name); I presume that if CONFIG_BOOTCACHE is not defined, then ret ends up being -ENOENT always, which makes this whole block completely evaporate. Is that right? In that case, do you end up with a warning about unused variable cached_name? Or does the compiler know not to complain about that? Do you still end up with space reserved on the stack? > + } > + > if (fastest) { > printk(KERN_INFO "xor: automatically using best " > "checksumming function %-10s\n", > @@ -149,6 +174,8 @@ calibrate_xor_blocks(void) > if (f->speed > fastest->speed) > fastest = f; > > + bootcache_set_string("xor_blocks_fastest", fastest->name); > + > pr_info("xor: using function: %s (%d MB/sec)\n", > fastest->name, fastest->speed); > > > -- > 2.48.1 >