On Thu, Feb 18, 2021 at 12:30:03PM -0800, Kees Cook wrote:
> Eek; thanks for the catch!

thanks for applying the fix;

BTW, with the compression broken, I was not getting any dmesg
stored in ERST at all, not even uncompressed. After instrumenting
the code with a lot of debug printks I found that writing
erst_erange.size worth of data into the ERST fails and the
maximum writeable size is 98 bytes smaler:

Details: 

        - erst_erange.size = 65536
        - this results in  erst_info.bufsize = 65336
        - pstore_compress() returned -EINVAL (because of the
          just-fixed typo), zipped_len = -EINVAL.
        - pstore_dump calls copy_kmsg_to_buffer to only copy bufsize
          bytes from big_oops_buf to psinfo->buf;
          record.size = bufsize = 65336

        psinfo->write(&record) then fails with -EINVAL;
        by more tracing inside the ERST code I found the -EINVAL was
        produced by __erst_write_to_storage()
        after apei_exec_ctx_get_output() returned
        val=ERST_STATUS_FAILED=3 and this got translated into -EINVAL by
        erst_errno().

        Once the compression was fixed everything started working because
        the records are much smaller after the compression (~30kB).

        My next thought was to find the largest possible record that
        could be written successfully.
        I modified the ERST init code to decrease erst_info.bufsize by a
        value specified on the cmdline. The maximum writable record was
        65238 bytes long (i.e. erst_erange.size - sizeof(struct
        cper_pstore_record) - 98). With this hack I got
        65238 bytes of uncompressed dmesg stored to ERST.

Any idea what might be causing this?
As far as I can tell, there are no other records in the ERST
(checked through the erst-dbg interface).
Tested on a HPE ProLiant DL120 Gen10 server.

Thanks!


-- 
Jiri Bohac <jbo...@suse.cz>
SUSE Labs, Prague, Czechia

Reply via email to