RE: [PATCH v2] pstore: Adjust buffer size for compression forsmaller registered buffers

From: Seiji Aguchi
Date: Thu Sep 12 2013 - 12:23:17 EST


efivars works fine with this v2 patch.

Tested-by: Seiji Aguchi <seiji.aguchi@xxxxxxx>

> -----Original Message-----
> From: Aruna Balakrishnaiah [mailto:aruna@xxxxxxxxxxxxxxxxxx]
> Sent: Thursday, September 12, 2013 2:51 AM
> To: linuxppc-dev@xxxxxxxxxx; tony.luck@xxxxxxxxx; Seiji Aguchi; linux-kernel@xxxxxxxxxxxxxxx; keescook@xxxxxxxxxxxx
> Cc: jkenisto@xxxxxxxxxxxxxxxxxx; mahesh@xxxxxxxxxxxxxxxxxx; cbouatmailru@xxxxxxxxx; ananth@xxxxxxxxxx; ccross@xxxxxxxxxxx
> Subject: [PATCH v2] pstore: Adjust buffer size for compression for smaller registered buffers
>
> When backends (ex: efivars) have smaller registered buffers, the big_oops_buf
> is quite too big for them as number of repeated occurences in the text captured
> will be less. Patch takes care of adjusting the buffer size based on the
> registered buffer size. cmpr values has been arrived after doing experiments with
> plain text for buffers of size 1k - 4k (Smaller the buffer size repeated occurence
> will be less) and with sample crash log for buffers ranging from 4k - 10k.
>
> Reported-by: Seiji Aguchi <seiji.aguchi@xxxxxxx>
> Signed-off-by: Aruna Balakrishnaiah <aruna@xxxxxxxxxxxxxxxxxx>
> ---
> Changes from v1:
> Retain the cmpr = 45 for buffers ranging of size 4k - 10k. 45 seems to work.
> I added an additional headroom of 3%. Revert it back to 45.
>
> fs/pstore/platform.c | 23 ++++++++++++++++++++++-
> 1 file changed, 22 insertions(+), 1 deletion(-)
>
> diff --git a/fs/pstore/platform.c b/fs/pstore/platform.c
> index 4ffb7ab..57b4219 100644
> --- a/fs/pstore/platform.c
> +++ b/fs/pstore/platform.c
> @@ -195,8 +195,29 @@ error:
> static void allocate_buf_for_compression(void)
> {
> size_t size;
> + size_t cmpr;
> +
> + switch (psinfo->bufsize) {
> + /* buffer range for efivars */
> + case 1000 ... 2000:
> + cmpr = 56;
> + break;
> + case 2001 ... 3000:
> + cmpr = 54;
> + break;
> + case 3001 ... 3999:
> + cmpr = 52;
> + break;
> + /* buffer range for nvram, erst */
> + case 4000 ... 10000:
> + cmpr = 45;
> + break;
> + default:
> + cmpr = 60;
> + break;
> + }
>
> - big_oops_buf_sz = (psinfo->bufsize * 100) / 45;
> + big_oops_buf_sz = (psinfo->bufsize * 100) / cmpr;
> big_oops_buf = kmalloc(big_oops_buf_sz, GFP_KERNEL);
> if (big_oops_buf) {
> size = max(zlib_deflate_workspacesize(WINDOW_BITS, MEM_LEVEL),

N‹§²æìr¸›yúèšØb²X¬¶ÇvØ^–)Þ{.nÇ+‰·¥Š{±‘êçzX§¶›¡Ü}©ž²ÆzÚ&j:+v‰¨¾«‘êçzZ+€Ê+zf£¢·hšˆ§~†­†Ûiÿûàz¹®w¥¢¸?™¨è­Ú&¢)ßf”ù^jÇy§m…á@A«a¶Úÿ 0¶ìh®å’i