[Crash-utility] [PATCH] Fix machdep->HZ calculation for kernel versions > 2.6.0

lijiang lijiang at redhat.com
Fri Apr 23 07:38:39 UTC 2021


在 2021年04月23日 15:08, HAGIO KAZUHITO(萩尾 一仁) 写道:
>> -----Original Message-----
>>> Sure. On my ppc64le machine, crash got 96hz after applying the above patch. The reason
>>> is that kernel calculates the value of bfq_timeout as below:
>>>
>>> bfq_timeout = HZ / 8;
>>>
>>> The actual value of HZ is 100, so bfq_timeout = 100 / 8 = 12, but in crash, we calculate
>>> the value of HZ:
>>>
>>> HZ = bfq_timeout * 8 = 12 * 8 = 96
>>>
>>> It seems that this is not the result what we expected.
> 
> Oh, you are right.
> 
>>>
>>>> btw, I thought 'read_expire' was better than the 'bfq_timeout' because it
>>>> was introduced at 2.6.16 and has been unchanged, but most of kernels(vmlinux)
>>>
>>> Sounds good. But unfortunately, the 'read_expire' is a static variable in kernel, we
>>> can not get it directly by the symbol search. Maybe we should try to find a static
>>> variable(kernel) in another ways.
>>>
>>> If it is possible, I would tend to use the 'write_expire' to calculate the value of HZ
>>> in crash as below, that can avoid the above issues and get a correct result.
>>>
>>> HZ = write_expire / 5;
>>>
>>> /*
>>>  * source: block/mq-deadline.c
>>>  */
>>> static const int write_expire = 5 * HZ
>>>
>>> For example:
>>> +       if (symbol_exists("write_expire")) { ----> Here, it failed, maybe we can try to find the symbol
>> in another way.
>>> +               uint write_expire;
>>> +               get_symbol_data("write_expire", sizeof(int), &write_expire);
>>> +               if (write_expire) {
>>> +                       machdep->hz = write_expire / 5;
>>> +                       if (CRASHDEBUG(2))
>>> +                               fprintf(fp, "write_expire exists: setting hz to %d\n",
>>> +                                       machdep->hz);
>>> +               }
>>> +       }  else
>>>
>>>> that I have do not have a symbol for it.  (some optimization?)
>>>>
>>> I can get the values of 'read_expire' and 'write_expire' in the latest rhel8 or later.
>>>
>>> crash> p read_expire
>>> $1 = 50
>>> crash> p write_expire
>>> $2 = 500
>>>
>>> Thanks.
>>> Linabo
>>>
>>
>> How do you think about the following changes? It works for me.
>>
>> /*
>>  * source: net/ipv4/inetpeer.c
>>  * int inet_peer_minttl __read_mostly = 120 * HZ;  /* TTL under high load: 120 sec */
>>  */
> 
> um, unfortunately this is a sysctl parameter and can be changed.
> 
> 
> As for the 'write_expire' way, I found that it can be printed after
> "set scope dd_init_queue" or "set scope deadline_init_queue" on old kernels.
> 
> crash> p write_expire
> No symbol "write_expire" in current context.
> p: gdb request failed: p write_expire
> crash> set scope dd_init_queue
> scope: ffffffffa43e3f80 (dd_init_queue)
> crash> p write_expire
> $1 = 5000
> 
> Maybe we can make use of gdb_set_crash_scope() and gdb_pass_through() to
> get this value?
> 

The 'write_expire' is a static variable, which needs to get its value from
gdb. Seems that it is a bit complicated.

But It's worth having a try.

Thanks.
Lianbo

> Thanks,
> Kazu
> 
> 




More information about the Crash-utility mailing list