Re: selftests/livepatch fails on s390

Petr Mladek
2023-12-20T13:19:58Z

On Tue 2023-12-19 09:50:18, Joe Lawrence wrote:
> On 12/19/23 04:45, Alexander Gordeev wrote:
> > On Mon, Dec 18, 2023 at 05:44:54PM -0500, Joe Lawrence wrote:
> >
> >> @@ -280,7 +268,13 @@ function set_pre_patch_ret {
> >> function start_test {
> >> local test="$1"
> >>
> >> - save_dmesg
> >> + # Dump something unique into the dmesg log, then stash the entry
> >> + # in LAST_DMESG. The check_result() function will use it to
> >> + # find new kernel messages since the test started.
> >> + local timestamp="$(date --rfc-3339=ns)"
> >> + log "livepatch kselftest timestamp: $timestamp"
> >> + LAST_DMESG=$(dmesg | grep "livepatch kselftest timestamp: $timestamp")

I like this approach.

> > Not sure if it not paranoid mode, but still..
> > If the 'log' call is guaranteed synced? AKA would 'grep' always catch the line?

I believe that the write is synchronized. The "log" command does:

function log() {
echo "$1" > /dev/kmsg
}

The message is stored into the log buffer during the write to
/dev/kmsg(). See devkmsg_emit() in devkmsg_write(), where
devkmsg_write() is .write_iter callback in struct file_operations.

const struct file_operations kmsg_fops = {
.open = devkmsg_open,
.read = devkmsg_read,
.write_iter = devkmsg_write,
.llseek = devkmsg_llseek,
.poll = devkmsg_poll,
.release = devkmsg_release,
};

I would explect that the write() callback is called directly when
shell is writing "echo" stdout to /dev/kmsg.

I hope that all this is sychronous. Everything is in memory.
I think that write operations are asynchronous only when
the data are written to a disk or another "slow" medium.

And dmesg reads the data from the ring buffer as well. It is
actually using /dev/kmsg as well by default.

Best Regards,
Petr