[Crash-utility] [PATCH] s390x: Fix s390dbf time stamps for kernels 4.11 and 4.14

Dave Anderson anderson at redhat.com
Tue Aug 8 18:45:40 UTC 2017


Hi Michael,

And this one is also queued for crash-7.2.0:

  https://github.com/crash-utility/crash/commit/aad69086a9a6b743e82715fa3e68540abb944e87

Thanks,
  Dave


----- Original Message -----
> Hi Dave,
> 
> With kernel commit ea417aa8a38bc7db ("s390/debug: make debug event time
> stamps relative to the boot TOD clock") for s390dbf time is stored
> relative to the kernel boot time.
> 
> In order to still show absolute time since 1970 we have to detect
> those kernels and re-add the boot time before printing the records.
> 
> We can use the tod_to_timeval() symbol to check for those kernels
> because the patch has removed the symbol.
> 
> With commit 6e2ef5e4f6cc5734 ("s390/time: add support for the TOD clock
> epoch extension") the symbol for storing the boot time has changed from
> "sched_clock_base_cc" to "tod_clock_base".
> This commit is currently on the s390 features branch and will be integrated
> in linux 4.14:
> 
> https://git.kernel.org/pub/scm/linux/kernel/git/s390/linux.git/commit/?h=features&id=6e2ef5e4f6cc57344762932d70d38ba4ec65fa8b
> 
> Cc: Martin Schwidefsky <schwidefsky at de.ibm.com>
> Signed-off-by: Michael Holzheu <holzheu at linux.vnet.ibm.com>
> Reviewed-by: Mikhail Zaslonko <zaslonko at linux.vnet.ibm.com>
> ---
>  s390dbf.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++-----
>  1 file changed, 46 insertions(+), 5 deletions(-)
> 
> diff --git a/s390dbf.c b/s390dbf.c
> index d3581c2..f21cd3a 100644
> --- a/s390dbf.c
> +++ b/s390dbf.c
> @@ -57,6 +57,9 @@
>  #define KL_PTRSZ 4
>  #endif
>  
> +/* Start TOD time of kernel in usecs for relative time stamps */
> +static uint64_t tod_clock_base_us;
> +
>  typedef unsigned long uaddr_t;
>  typedef unsigned long kaddr_t;
>  
> @@ -162,13 +165,23 @@ static inline int set_cmd_flags(command_t *cmd, int
> flags, char *extraops)
>  	return 0;
>  }
>  
> +/* Time of day clock value for 1970/01/01 */
> +#define TOD_UNIX_EPOCH (0x8126d60e46000000LL - (0x3c26700LL * 1000000 *
> 4096))
> +/* Time of day clock value for 1970/01/01 in usecs */
> +#define TOD_UNIX_EPOCH_US (TOD_UNIX_EPOCH >> 12)
> +
>  static inline void kl_s390tod_to_timeval(uint64_t todval, struct timeval
>  *xtime)
>  {
> -	todval -= 0x8126d60e46000000LL - (0x3c26700LL * 1000000 * 4096);
> -
> -	todval >>= 12;
> -	xtime->tv_sec  = todval / 1000000;
> -	xtime->tv_usec = todval % 1000000;
> +	uint64_t todval_us;
> +
> +	/* Convert TOD to usec (51th bit of TOD is us) */
> +	todval_us = todval >> 12;
> +	/* Add base if we have relative time stamps */
> +	todval_us += tod_clock_base_us;
> +	/* Subtract EPOCH that we get time in usec since 1970 */
> +	todval_us -= TOD_UNIX_EPOCH_US;
> +	xtime->tv_sec  = todval_us / 1000000;
> +	xtime->tv_usec = todval_us % 1000000;
>  }
>  
>  static inline int kl_struct_len(char* struct_name)
> @@ -846,10 +859,38 @@ find_debug_area(const char *area_name)
>  	return NULL;
>  }
>  
> +static void tod_clock_base_init(void)
> +{
> +	if (kernel_symbol_exists("tod_clock_base")) {
> +		/*
> +		 * Kernels >= 4.14 that contain 6e2ef5e4f6cc5734 ("s390/time:
> +		 * add support for the TOD clock epoch extension")
> +		 */
> +		get_symbol_data("tod_clock_base", sizeof(tod_clock_base_us),
> +				&tod_clock_base_us);
> +		/* Bit for usecs is at position 59 - therefore shift 4 */
> +		tod_clock_base_us >>= 4;
> +	} else if (kernel_symbol_exists("sched_clock_base_cc") &&
> +		   !kernel_symbol_exists("tod_to_timeval")) {
> +		/*
> +		 * Kernels >= 4.11 that contain ea417aa8a38bc7db ("s390/debug:
> +		 * make debug event time stamps relative to the boot TOD clock")
> +		 */
> +		get_symbol_data("sched_clock_base_cc",
> +				sizeof(tod_clock_base_us), &tod_clock_base_us);
> +		/* Bit for usecs is at position 51 - therefore shift 12 */
> +		tod_clock_base_us >>= 12;
> +	} else {
> +		/* All older kernels use absolute time stamps */
> +		tod_clock_base_us = 0;
> +	}
> +}
> +
>  static void
>  dbf_init(void)
>  {
>  	if (!initialized) {
> +		tod_clock_base_init();
>  		if(dbf_version >= DBF_VERSION_V2)
>  			add_lcrash_debug_view(&pages_view);
>  		add_lcrash_debug_view(&ascii_view);
> --
> 2.11.2
> 
> 




More information about the Crash-utility mailing list