[Devel] [PATCH rh7 1/2] kmsg: Virtualize timestamps in /dev/ksmg output

Alexander Atanasov alexander.atanasov at virtuozzo.com
Fri Feb 3 17:17:46 MSK 2023


On 2.02.23 22:17, Konstantin Khorenko wrote:
> Internally log messages contain the timestamps relative to the Host boot
> time, while Container could start much later than the Host boots and the
> timestamps should be shifted accordingly.
> 
> Otherwise "dmesg -H" reports data from the future.
> 
> https://jira.sw.ru/browse/PSBM-145263
> 
> Signed-off-by: Konstantin Khorenko <khorenko at virtuozzo.com>
> ---
>   kernel/printk.c | 8 ++++++++
>   1 file changed, 8 insertions(+)
> 
> diff --git a/kernel/printk.c b/kernel/printk.c
> index 5380594d231f..27221d15590a 100644
> --- a/kernel/printk.c
> +++ b/kernel/printk.c
> @@ -555,6 +555,7 @@ static ssize_t devkmsg_writev(struct kiocb *iocb, const struct iovec *iv,
>   static ssize_t devkmsg_read(struct file *file, char __user *buf,
>   			    size_t count, loff_t *ppos)
>   {
> +	struct ve_struct *ve;
>   	struct log_state *log = ve_log_state();
>   	struct devkmsg_user *user = file->private_data;
>   	struct log *msg;
> @@ -597,6 +598,13 @@ static ssize_t devkmsg_read(struct file *file, char __user *buf,
>   
>   	msg = log_from_idx(log, user->idx);
>   	ts_usec = msg->ts_nsec;
> +
> +	/* shift the timestamp on the Container uptime value */
> +	ve = get_exec_env();
> +	if (!ve_is_super(ve)) {
> +		ts_usec -= ve->real_start_timespec.tv_sec * NSEC_PER_SEC;
> +		ts_usec -= ve->real_start_timespec.tv_nsec;
> +	}
>   	do_div(ts_usec, 1000);
>   
>   	/*


We digged into the possibility of ts to overflow so it is less than 
real_start_timespec which stays constant but what we found is
that we have 580+ years to fix it.

Acked-by: Alexander Atanasov <alexander.atanasov at virtuozzo.com>

-- 
Regards,
Alexander Atanasov



More information about the Devel mailing list