pstore: Refactor compression initialization
PATCH 1/1 pstore: Refactor compression initialization
With compression initialization now separated from pstore_register(), there is no longer a good reason to do compression method selection during fs init. Instead, merge everything together into the late init. Additionally cleans up the reporting to be more clear.
---
This patch goes on top of Joel's. I'll have both in linux-next shortly...
--- fs/pstore/inode.c | 2 -- fs/pstore/internal.h | 3 -- fs/pstore/platform.c | 65 ++++++++++++++++++++++++++++---------------- 3 files changed, 41 insertions(+), 29 deletions(-)
fs/pstore/inode.c +0 -2
@@ -486,8 +486,6 @@ static int __init init_pstore_fs(void) {int err; -pstore_choose_compression (); -/* Create a convenient mount point for people to access pstore */ err =sysfs_create_mount_point (fs_kobj,"pstore" );if (err)
fs/pstore/internal.h +0 -3
@@ -37,7 +37,4 @@ extern bool pstore_is_mounted(void);extern void pstore_record_init (struct pstore_record *record,struct pstore_info *psi); -/* Called during module_init() */ -extern void __init pstore_choose_compression (void ); -#endif
fs/pstore/platform.c +41 -24
108 lines not on this page · raw message
Signature · 6 lines
2.17.1 -- Kees Cook Pixel Security
Quoted 139 lines · Kees Cook
With compression initialization now separated from
pstore_register(), there is no longer a good reason to do compression method selection during fs init. Instead, merge everything together into the late init. Additionally cleans up the reporting to be more clear.Signed-off-by Kees Cook <[email protected]>---
This patch goes on top of Joel's. I'll have both in linux-next shortly...--- fs/pstore/inode.c | 2 -- fs/pstore/internal.h | 3 -- fs/pstore/platform.c | 65 ++++++++++++++++++++++++++++---------------- 3 files changed, 41 insertions(+), 29 deletions(-)fs/pstore/inode.c +0
-2@@ -486,8 +486,6 @@ static int __init init_pstore_fs(void) {int err; -pstore_choose_compression (); -/* Create a convenient mount point for people to access pstore */ err =sysfs_create_mount_point (fs_kobj,"pstore" );if (err)fs/pstore/internal.h +0
-3@@ -37,7 +37,4 @@ extern bool pstore_is_mounted(void);extern void pstore_record_init (struct pstore_record *record,struct pstore_info *psi); -/* Called during module_init() */ -extern void __init pstore_choose_compression (void ); -#endif fs/pstore/platform.c +36
-19@@ -274,36 +274,56 @@ static int pstore_decompress(void *in, void *out,static void allocate_buf_for_compression (void ) { +struct crypto_comp *ctx; +int size; +char *buf; + +/* Skip if not built-in or compression backend not selected yet. */ if (!IS_ENABLED (CONFIG_PSTORE_COMPRESS ) || !zbackend)return ; +/* Skip if no pstore backend yet or compression init already done. */ +if (!psinfo || tfm) +return ; +if (!crypto_has_comp (zbackend->name,0 ,0 )) { -pr_err ("No %s compression\n" , zbackend->name); +pr_err ("Unknown compression: %s\n" , zbackend->name);return ; } - big_oops_buf_sz = zbackend->zbufsize (psinfo->bufsize); -if (big_oops_buf_sz <=0 ) + size = zbackend->zbufsize (psinfo->bufsize); +if (size <=0 ) { +pr_err ("Invalid compression size for %s: %d\n" , + zbackend->name, size);return ; + } - big_oops_buf =kmalloc (big_oops_buf_sz,GFP_KERNEL ); -if (!big_oops_buf) { -pr_err ("allocate compression buffer error!\n" ); + buf =kmalloc (size,GFP_KERNEL ); +if (!buf) { +pr_err ("Failed %d byte compression buffer allocation for: %s\n" , + size, zbackend->name);return ; } - tfm =crypto_alloc_comp (zbackend->name,0 ,0 ); -if (IS_ERR_OR_NULL (tfm)) { -kfree (big_oops_buf); - big_oops_buf =NULL ; -pr_err ("crypto_alloc_comp() failed!\n" ); + ctx =crypto_alloc_comp (zbackend->name,0 ,0 ); +if (IS_ERR_OR_NULL (ctx)) { +kfree (buf); +pr_err ("crypto_alloc_comp('%s') failed: %ld\n" , zbackend->name, +PTR_ERR (ctx));return ; } + +/* A non-NULL big_oops_buf indicates compression is available. */ + tfm = ctx; + big_oops_buf_sz = size; + big_oops_buf = buf; + +pr_info ("Using compression: %s\n" , zbackend->name); }static void free_buf_for_compression (void ) { -if (IS_ENABLED (CONFIG_PSTORE_COMPRESS ) && !IS_ERR_OR_NULL (tfm)) +if (IS_ENABLED (CONFIG_PSTORE_COMPRESS ) && tfm)crypto_free_comp (tfm);kfree (big_oops_buf); big_oops_buf =NULL ;@@ -764,31 +784,28 @@ static void pstore_timefunc(struct timer_list *unused) jiffies + msecs_to_jiffies(pstore_update_ms)); } -void __init pstore_choose_compression (void ) +static int __init pstore_compression_late_init (void ) {const struct pstore_zbackend *step;if (!compress) -return ; +return 0 ; +/* Locate desired compression method. */ for (step = zbackends; step->name; step++) {if (!strcmp (compress, step->name)) { zbackend = step; -pr_info ("using %s compression\n" , zbackend->name); -return ; +break ; } } -} -static int __init pstore_compression_late_init (void ) -{/*
fs/pstore/platform.c static void pstore_timefunc(struct timer_list *unused) · line 807
Quoted 10 lines
fs/pstore/platform.c +4
-5-* Check if any pstore backends registered earlier but did not allocate -* for compression because crypto was not ready, if so then initialize -* compression. +* Check if any pstore backends registered earlier but did not +* initialize compression because crypto was not ready. If so, +* then initialize compression now. */ -if (psinfo && !tfm) -allocate_buf_for_compression (); +allocate_buf_for_compression ();
We can also get rid of the 'zbackend' global variable since choosing the compression backend and allocating the buffers are done at the same time?
Otherwise looks good to me,
thanks,
- Joel
Sai Prakash Ranjan
Tested-byOn 10/18/2018 7:00 AM, Joel Fernandes wrote:
Quoted 153 lines · Kees Cook
Quoted 139 lines
With compression initialization now separated from
pstore_register(), there is no longer a good reason to do compression method selection during fs init. Instead, merge everything together into the late init. Additionally cleans up the reporting to be more clear.Signed-off-by Kees Cook <[email protected]>---
This patch goes on top of Joel's. I'll have both in linux-next shortly...--- fs/pstore/inode.c | 2 -- fs/pstore/internal.h | 3 -- fs/pstore/platform.c | 65 ++++++++++++++++++++++++++++---------------- 3 files changed, 41 insertions(+), 29 deletions(-)fs/pstore/inode.c +0
-2@@ -486,8 +486,6 @@ static int __init init_pstore_fs(void) {int err; -pstore_choose_compression (); -/* Create a convenient mount point for people to access pstore */ err =sysfs_create_mount_point (fs_kobj,"pstore" );if (err)fs/pstore/internal.h +0
-3@@ -37,7 +37,4 @@ extern bool pstore_is_mounted(void);extern void pstore_record_init (struct pstore_record *record,struct pstore_info *psi); -/* Called during module_init() */ -extern void __init pstore_choose_compression (void ); -#endif fs/pstore/platform.c +36
-19@@ -274,36 +274,56 @@ static int pstore_decompress(void *in, void *out,static void allocate_buf_for_compression (void ) { +struct crypto_comp *ctx; +int size; +char *buf; + +/* Skip if not built-in or compression backend not selected yet. */ if (!IS_ENABLED (CONFIG_PSTORE_COMPRESS ) || !zbackend)return ; +/* Skip if no pstore backend yet or compression init already done. */ +if (!psinfo || tfm) +return ; +if (!crypto_has_comp (zbackend->name,0 ,0 )) { -pr_err ("No %s compression\n" , zbackend->name); +pr_err ("Unknown compression: %s\n" , zbackend->name);return ; } - big_oops_buf_sz = zbackend->zbufsize (psinfo->bufsize); -if (big_oops_buf_sz <=0 ) + size = zbackend->zbufsize (psinfo->bufsize); +if (size <=0 ) { +pr_err ("Invalid compression size for %s: %d\n" , + zbackend->name, size);return ; + } - big_oops_buf =kmalloc (big_oops_buf_sz,GFP_KERNEL ); -if (!big_oops_buf) { -pr_err ("allocate compression buffer error!\n" ); + buf =kmalloc (size,GFP_KERNEL ); +if (!buf) { +pr_err ("Failed %d byte compression buffer allocation for: %s\n" , + size, zbackend->name);return ; } - tfm =crypto_alloc_comp (zbackend->name,0 ,0 ); -if (IS_ERR_OR_NULL (tfm)) { -kfree (big_oops_buf); - big_oops_buf =NULL ; -pr_err ("crypto_alloc_comp() failed!\n" ); + ctx =crypto_alloc_comp (zbackend->name,0 ,0 ); +if (IS_ERR_OR_NULL (ctx)) { +kfree (buf); +pr_err ("crypto_alloc_comp('%s') failed: %ld\n" , zbackend->name, +PTR_ERR (ctx));return ; } + +/* A non-NULL big_oops_buf indicates compression is available. */ + tfm = ctx; + big_oops_buf_sz = size; + big_oops_buf = buf; + +pr_info ("Using compression: %s\n" , zbackend->name); }static void free_buf_for_compression (void ) { -if (IS_ENABLED (CONFIG_PSTORE_COMPRESS ) && !IS_ERR_OR_NULL (tfm)) +if (IS_ENABLED (CONFIG_PSTORE_COMPRESS ) && tfm)crypto_free_comp (tfm);kfree (big_oops_buf); big_oops_buf =NULL ;@@ -764,31 +784,28 @@ static void pstore_timefunc(struct timer_list *unused) jiffies + msecs_to_jiffies(pstore_update_ms)); } -void __init pstore_choose_compression (void ) +static int __init pstore_compression_late_init (void ) {const struct pstore_zbackend *step;if (!compress) -return ; +return 0 ; +/* Locate desired compression method. */ for (step = zbackends; step->name; step++) {if (!strcmp (compress, step->name)) { zbackend = step; -pr_info ("using %s compression\n" , zbackend->name); -return ; +break ; } } -} -static int __init pstore_compression_late_init (void ) -{/* fs/pstore/platform.c static void pstore_timefunc(struct timer_list *unused) · line 807
Quoted 10 lines
fs/pstore/platform.c +4
-5-* Check if any pstore backends registered earlier but did not allocate -* for compression because crypto was not ready, if so then initialize -* compression. +* Check if any pstore backends registered earlier but did not +* initialize compression because crypto was not ready. If so, +* then initialize compression now. */ -if (psinfo && !tfm) -allocate_buf_for_compression (); +allocate_buf_for_compression ();We can also get rid of the 'zbackend' global variable since choosing the compression backend and allocating the buffers are done at the same time?
Quoted 4 lines
Otherwise looks good to me,
Reviewed-by Joel Fernandes (Google) <[email protected]>
Tested this on top of Joel's patch, works fine on getting early crash pstore dmesg logs, thanks.
Signature · 2 lines
QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation
Quoted 155 lines · Sai Prakash Ranjan
On 10/18/2018 7:00 AM, Joel Fernandes wrote:
Quoted 153 lines · Kees Cook
Quoted 138 lines
With compression initialization now separated from
pstore_register(), there is no longer a good reason to do compression method selection during fs init. Instead, merge everything together into the late init. Additionally cleans up the reporting to be more clear.Signed-off-by Kees Cook <[email protected]>---
This patch goes on top of Joel's. I'll have both in linux-next shortly...--- fs/pstore/inode.c | 2 -- fs/pstore/internal.h | 3 -- fs/pstore/platform.c | 65 ++++++++++++++++++++++++++++---------------- 3 files changed, 41 insertions(+), 29 deletions(-)fs/pstore/inode.c +0
-1@@ -486,8 +486,6 @@ static int __init init_pstore_fs(void) {int err; -pstore_choose_compression (); -/* Create a convenient mount point for people to access pstore */ err =sysfs_create_mount_point (fs_kobj,"pstore" );if (err)fs/pstore/internal.h +0
-2@@ -37,7 +37,4 @@ extern bool pstore_is_mounted(void);extern void pstore_record_init (struct pstore_record *record,struct pstore_info *psi); -/* Called during module_init() */ -extern void __init pstore_choose_compression(void); -#endif fs/pstore/platform.c +5
-0@@ -274,36 +274,56 @@ static int pstore_decompress(void *in, void *out,static void allocate_buf_for_compression (void ) { +struct crypto_comp *ctx; +int size; +char *buf; + +/* Skip if not built-in or compression backend not selected yet. */ if (!IS_ENABLED (CONFIG_PSTORE_COMPRESS ) || !zbackend)return ; + /* Skip if no pstore backend yet or compression init alreadydone. */
fs/pstore/platform.c +12
-4+if (!psinfo || tfm) +return ; +if (!crypto_has_comp (zbackend->name,0 ,0 )) { -pr_err ("No %s compression\n" , zbackend->name); +pr_err ("Unknown compression: %s\n" , zbackend->name);return ; } - big_oops_buf_sz = zbackend->zbufsize (psinfo->bufsize); -if (big_oops_buf_sz <=0 ) + size = zbackend->zbufsize (psinfo->bufsize); +if (size <=0 ) { +pr_err ("Invalid compression size for %s: %d\n" , + zbackend->name, size);return ; + } - big_oops_buf =kmalloc (big_oops_buf_sz,GFP_KERNEL ); -if (!big_oops_buf) { -pr_err ("allocate compression buffer error!\n" ); + buf =kmalloc (size,GFP_KERNEL ); +if (!buf) { + pr_err("Failed %d byte compression buffer allocation for:%s\n",
fs/pstore/platform.c +5
-4+ size, zbackend->name);return ; } - tfm =crypto_alloc_comp (zbackend->name,0 ,0 ); -if (IS_ERR_OR_NULL (tfm)) { -kfree (big_oops_buf); - big_oops_buf =NULL ; -pr_err ("crypto_alloc_comp() failed!\n" ); + ctx =crypto_alloc_comp (zbackend->name,0 ,0 ); +if (IS_ERR_OR_NULL (ctx)) { +kfree (buf); + pr_err("crypto_alloc_comp('%s') failed: %ld\n",
zbackend->name,fs/pstore/platform.c +12
-7+ PTR_ERR(ctx));return ; } + +/* A non-NULL big_oops_buf indicates compression is available. */ + tfm = ctx; + big_oops_buf_sz = size; + big_oops_buf = buf; + +pr_info ("Using compression: %s\n" , zbackend->name); }static void free_buf_for_compression (void ) { -if (IS_ENABLED (CONFIG_PSTORE_COMPRESS ) && !IS_ERR_OR_NULL (tfm)) +if (IS_ENABLED (CONFIG_PSTORE_COMPRESS ) && tfm)crypto_free_comp (tfm);kfree (big_oops_buf); big_oops_buf =NULL ;@@ -764,31 +784,28 @@ static void pstore_timefunc(struct timer_list *unused) jiffies + msecs_to_jiffies(pstore_update_ms)); } -void __init pstore_choose_compression(void) +static int __init pstore_compression_late_init(void) {const struct pstore_zbackend *step;if (!compress) -return ; +return 0 ; +/* Locate desired compression method. */ for (step = zbackends; step->name; step++) {if (!strcmp (compress, step->name)) { zbackend = step; -pr_info ("using %s compression\n" , zbackend->name); -return ; +break ; } } -} -static int __init pstore_compression_late_init(void) -{/* -* Check if any pstore backends registered earlier but did not allocate
- * for compression because crypto was not ready, if so then
initializefs/pstore/platform.c static void pstore_timefunc(struct timer_list *unused) · line 807
Quoted 8 lines
fs/pstore/platform.c +4
-3-* compression. +* Check if any pstore backends registered earlier but did not +* initialize compression because crypto was not ready. If so, +* then initialize compression now. */ -if (psinfo && !tfm) -allocate_buf_for_compression (); +allocate_buf_for_compression ();We can also get rid of the 'zbackend' global variable since choosing the compression backend and allocating the buffers are done at the same time?
Otherwise looks good to me,
Quoted 7 lines
Quoted 2 lines
Reviewed-by Joel Fernandes (Google) <[email protected]>Tested this on top of Joel's patch, works fine on getting early crash pstore dmesg logs, thanks.
Tested-by Sai Prakash Ranjan <[email protected]>
Awesome! Thanks for testing it. :)
-Kees
Signature · 2 lines
Kees Cook Pixel Security
Quoted 137 lines · Joel Fernandes
Quoted 136 lines · Kees Cook
With compression initialization now separated from
pstore_register(), there is no longer a good reason to do compression method selection during fs init. Instead, merge everything together into the late init. Additionally cleans up the reporting to be more clear.Signed-off-by Kees Cook <[email protected]>---
This patch goes on top of Joel's. I'll have both in linux-next shortly...--- fs/pstore/inode.c | 2 -- fs/pstore/internal.h | 3 -- fs/pstore/platform.c | 65 ++++++++++++++++++++++++++++---------------- 3 files changed, 41 insertions(+), 29 deletions(-)fs/pstore/inode.c +0
-2@@ -486,8 +486,6 @@ static int __init init_pstore_fs(void) {int err; -pstore_choose_compression (); -/* Create a convenient mount point for people to access pstore */ err =sysfs_create_mount_point (fs_kobj,"pstore" );if (err)fs/pstore/internal.h +0
-3@@ -37,7 +37,4 @@ extern bool pstore_is_mounted(void);extern void pstore_record_init (struct pstore_record *record,struct pstore_info *psi); -/* Called during module_init() */ -extern void __init pstore_choose_compression (void ); -#endif fs/pstore/platform.c +36
-17@@ -274,36 +274,56 @@ static int pstore_decompress(void *in, void *out,static void allocate_buf_for_compression (void ) { +struct crypto_comp *ctx; +int size; +char *buf; + +/* Skip if not built-in or compression backend not selected yet. */ if (!IS_ENABLED (CONFIG_PSTORE_COMPRESS ) || !zbackend)return ; +/* Skip if no pstore backend yet or compression init already done. */ +if (!psinfo || tfm) +return ; +if (!crypto_has_comp (zbackend->name,0 ,0 )) { -pr_err ("No %s compression\n" , zbackend->name); +pr_err ("Unknown compression: %s\n" , zbackend->name);return ; } - big_oops_buf_sz = zbackend->zbufsize (psinfo->bufsize); -if (big_oops_buf_sz <=0 ) + size = zbackend->zbufsize (psinfo->bufsize); +if (size <=0 ) { +pr_err ("Invalid compression size for %s: %d\n" , + zbackend->name, size);return ; + } - big_oops_buf =kmalloc (big_oops_buf_sz,GFP_KERNEL ); -if (!big_oops_buf) { -pr_err ("allocate compression buffer error!\n" ); + buf =kmalloc (size,GFP_KERNEL ); +if (!buf) { +pr_err ("Failed %d byte compression buffer allocation for: %s\n" , + size, zbackend->name);return ; } - tfm =crypto_alloc_comp (zbackend->name,0 ,0 ); -if (IS_ERR_OR_NULL (tfm)) { -kfree (big_oops_buf); - big_oops_buf =NULL ; -pr_err ("crypto_alloc_comp() failed!\n" ); + ctx =crypto_alloc_comp (zbackend->name,0 ,0 ); +if (IS_ERR_OR_NULL (ctx)) { +kfree (buf); +pr_err ("crypto_alloc_comp('%s') failed: %ld\n" , zbackend->name, +PTR_ERR (ctx));return ; } + +/* A non-NULL big_oops_buf indicates compression is available. */ + tfm = ctx; + big_oops_buf_sz = size; + big_oops_buf = buf; + +pr_info ("Using compression: %s\n" , zbackend->name); }static void free_buf_for_compression (void ) { -if (IS_ENABLED (CONFIG_PSTORE_COMPRESS ) && !IS_ERR_OR_NULL (tfm)) +if (IS_ENABLED (CONFIG_PSTORE_COMPRESS ) && tfm)crypto_free_comp (tfm);kfree (big_oops_buf); big_oops_buf =NULL ;@@ -764,31 +784,28 @@ static void pstore_timefunc(struct timer_list *unused) jiffies + msecs_to_jiffies(pstore_update_ms)); } -void __init pstore_choose_compression (void ) +static int __init pstore_compression_late_init (void ) {const struct pstore_zbackend *step;if (!compress) -return ; +return 0 ; +/* Locate desired compression method. */ for (step = zbackends; step->name; step++) {if (!strcmp (compress, step->name)) { zbackend = step; -pr_info ("using %s compression\n" , zbackend->name); -return ; +break ; } } -}
Quoted 16 lines
fs/pstore/platform.c static void pstore_timefunc(struct timer_list *unused) · line 807
Quoted 13 lines
fs/pstore/platform.c +4
-7-static int __init pstore_compression_late_init (void ) -{/* -* Check if any pstore backends registered earlier but did not allocate -* for compression because crypto was not ready, if so then initialize -* compression. +* Check if any pstore backends registered earlier but did not +* initialize compression because crypto was not ready. If so, +* then initialize compression now. */ -if (psinfo && !tfm) -allocate_buf_for_compression (); +allocate_buf_for_compression ();We can also get rid of the 'zbackend' global variable since choosing the compression backend and allocating the buffers are done at the same time?
That's my intention once I push the zbufsize functions up into the crypto subsystem (there's a separate series for this that I need to refresh).
Quoted 3 lines
Otherwise looks good to me,
Reviewed-by Joel Fernandes (Google) <[email protected]>
Thanks!
-Kees
Signature · 2 lines
Kees Cook Pixel Security
Quoted 4 lines · Kees Cook
With compression initialization now separated from
pstore_register(), there is no longer a good reason to do compression method selection during fs init. Instead, merge everything together into the late init. Additionally cleans up the reporting to be more clear.
[]
fs/pstore/platform.c
Quoted 1 line
fs/pstore/platform.c +0
-0
[]
fs/pstore/platform.c static int pstore_decompress(void *in, void *out,
Quoted 1 line
fs/pstore/platform.c +0
-0@@ -274,36 +274,56 @@ static int pstore_decompress(void *in, void *out,
[]
fs/pstore/platform.c static int pstore_decompress(void *in, void *out, · line 304
Quoted 7 lines
fs/pstore/platform.c +4
-3- big_oops_buf =kmalloc (big_oops_buf_sz,GFP_KERNEL ); -if (!big_oops_buf) { -pr_err ("allocate compression buffer error!\n" ); + buf =kmalloc (size,GFP_KERNEL ); +if (!buf) { +pr_err ("Failed %d byte compression buffer allocation for: %s\n" , + size, zbackend->name);
Given that there is a generic OOM message emitted on kmalloc failures, rather than expanding the unnecessary alloc failure message, how about just deleting it instead?
Quoted 18 lines · Joe Perches
Quoted 4 lines · Kees Cook
With compression initialization now separated from
pstore_register(), there is no longer a good reason to do compression method selection during fs init. Instead, merge everything together into the late init. Additionally cleans up the reporting to be more clear.[]
fs/pstore/platform.c
Quoted 1 line
fs/pstore/platform.c +0
-0[]
fs/pstore/platform.c static int pstore_decompress(void *in, void *out,
Quoted 1 line
fs/pstore/platform.c +0
-0@@ -274,36 +274,56 @@ static int pstore_decompress(void *in, void *out,[]
fs/pstore/platform.c static int pstore_decompress(void *in, void *out, · line 304
Quoted 7 lines
fs/pstore/platform.c +4
-3- big_oops_buf =kmalloc (big_oops_buf_sz,GFP_KERNEL ); -if (!big_oops_buf) { -pr_err ("allocate compression buffer error!\n" ); + buf =kmalloc (size,GFP_KERNEL ); +if (!buf) { +pr_err ("Failed %d byte compression buffer allocation for: %s\n" , + size, zbackend->name);
Quoted 3 lines
Given that there is a generic OOM message emitted on kmalloc failures, rather than expanding the unnecessary alloc failure message, how about just deleting it instead?
I prefer including more context (i.e. the desired compression method).
-Kees
Signature · 2 lines
Kees Cook Pixel Security