2013-09-11 12:07:15

by Aruna Balakrishnaiah

[permalink] [raw]
Subject: [PATCH 1/3] 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 <[email protected]>
Signed-off-by: Aruna Balakrishnaiah <[email protected]>
---
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..4efaa75 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 = 48;
+ 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),


2013-09-11 12:07:33

by Aruna Balakrishnaiah

[permalink] [raw]
Subject: [PATCH 2/3] pstore: Use zlib_inflateInit2 instead of zlib_inflateInit

Since zlib_deflateInit2() is used for specifying window bit during compression,
zlib_inflateInit2() is appropriate for decompression.

Reported-by: Seiji Aguchi <[email protected]>
Signed-off-by: Aruna Balakrishnaiah <[email protected]>
---
fs/pstore/platform.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/fs/pstore/platform.c b/fs/pstore/platform.c
index 4efaa75..18924c7 100644
--- a/fs/pstore/platform.c
+++ b/fs/pstore/platform.c
@@ -168,7 +168,7 @@ static int pstore_decompress(void *in, void *out, size_t inlen, size_t outlen)
int err, ret;

ret = -EIO;
- err = zlib_inflateInit(&stream);
+ err = zlib_inflateInit2(&stream, WINDOW_BITS);
if (err != Z_OK)
goto error;

2013-09-11 12:07:55

by Aruna Balakrishnaiah

[permalink] [raw]
Subject: [PATCH 3/3] pstore: Remove the messages related to compression failure

Remove the messages indicating compression failure as it will
add to the space during panic path.

Reported-by: Seiji Aguchi <[email protected]>
Signed-off-by: Aruna Balakrishnaiah <[email protected]>
---
fs/pstore/platform.c | 4 ----
1 file changed, 4 deletions(-)

diff --git a/fs/pstore/platform.c b/fs/pstore/platform.c
index 18924c7..4ad8c93 100644
--- a/fs/pstore/platform.c
+++ b/fs/pstore/platform.c
@@ -316,10 +316,6 @@ static void pstore_dump(struct kmsg_dumper *dumper,
compressed = true;
total_len = zipped_len;
} else {
- pr_err("pstore: compression failed for Part %d"
- " returned %d\n", part, zipped_len);
- pr_err("pstore: Capture uncompressed"
- " oops/panic report of Part %d\n", part);
compressed = false;
total_len = copy_kmsg_to_buffer(hsize, len);
}

2013-09-11 18:35:28

by Luck, Tony

[permalink] [raw]
Subject: RE: [PATCH 1/3] pstore: Adjust buffer size for compression for smaller registered buffers

- big_oops_buf_sz = (psinfo->bufsize * 100) / 45;
+ big_oops_buf_sz = (psinfo->bufsize * 100) / cmpr;

Tested on an ERST backed system. Seems to be working (we save a little less information
per ERST record than before this change (uncompressed size goes down from ~17500 to
~16400 bytes) - but this patch switched the denominator from 45 to 48 (for ERST) - so that
seems plausible.

Seiji: let me know how the efivars tests go.

-Tony
????{.n?+???????+%?????ݶ??w??{.n?+????{??G?????{ay?ʇڙ?,j??f???h?????????z_??(?階?ݢj"???m??????G????????????&???~???iO???z??v?^?m???? ????????I?

2013-09-11 18:58:20

by Seiji Aguchi

[permalink] [raw]
Subject: RE: [PATCH 1/3] pstore: Adjust buffer size for compression for smaller registered buffers

>+ /* buffer range for efivars */
>+ case 1000 ... 2000:
>+ cmpr = 56;
>+ break;

> Seiji: let me know how the efivars tests go.

efivars works fine.
Uncompressed size about 1800 bytes. It matches the value of cmpr, 56.

Please feel free to add my "Tested-by" to all three patches.

Tested-by: Seiji Aguchi <[email protected]>

????{.n?+???????+%?????ݶ??w??{.n?+????{??G?????{ay?ʇڙ?,j??f???h?????????z_??(?階?ݢj"???m??????G????????????&???~???iO???z??v?^?m???? ????????I?