在 2021年04月13日 07:34, HAGIO KAZUHITO(萩尾 一仁) 写道:
Hi Lianbo,
-----Original Message-----
> 在 2021年04月02日 15:02, HAGIO KAZUHITO(萩尾 一仁) 写道:
>> -----Original Message-----
>>> In the show_member_offset() function, when trying to handle function
>>> pointers, the case for "(*" is handled. However, if the function
>>> pointer returns a pointer or a pointer to a pointer, then the
>>> condition is unhandled. This results in the offset not being printed.
>>>
>>> Fix by first checking if the member is potentially a function pointer,
>>> then checking if it returns a pointer or a pointer to a pointer.
>>>
>>> Signed-off-by: John Pittman <jpittman(a)redhat.com>
>>
>> Good catch... I've confirmed that the patch works as expected with
RHEL7's
>> struct offload_callbacks:
>>
>> crash> struct -o offload_callbacks
>> struct offload_callbacks {
>> [0] struct sk_buff *(*gso_segment)(struct sk_buff *, netdev_features_t);
>> [8] struct sk_buff **(*gro_receive)(struct sk_buff **, struct sk_buff *);
This output is the one with the patch, and
>> [16] int (*gro_complete)(struct sk_buff *, int);
>> }
>> SIZE: 24
>
> This should be a good example for the case described in patch log. But I didn't
> reproduce it on rhel7 before applying this patch, it's strange.
> ...
> KERNEL: /usr/lib/debug/lib/modules/3.10.0-1160.24.1.el7.x86_64/vmlinux
> ...
> RELEASE: 3.10.0-1160.24.1.el7.x86_64
> VERSION: #1 SMP Thu Mar 25 21:21:56 UTC 2021
> MACHINE: x86_64 (2892 Mhz)
> MEMORY: 4 GB
> PID: 7815
> COMMAND: "crash"
> TASK: ffffa10210512100 [THREAD_INFO: ffffa10189b34000]
> CPU: 1
> STATE: TASK_RUNNING (ACTIVE)
>
> crash> struct -o offload_callbacks
> struct offload_callbacks {
> struct sk_buff *(*gso_segment)(struct sk_buff *, netdev_features_t);
> struct sk_buff **(*gro_receive)(struct sk_buff **, struct sk_buff *);
^^^^
There are no offsets here, you're reproducing the issue, I think?
That's right, I ignored the offset.
Thank you for the explanation in detail. Kazu and John Pittman.
Acked-by: Lianbo Jiang <lijiang(a)redhat.com>
Thanks,
Kazu
> [16] int (*gro_complete)(struct sk_buff *, int);
> }
> SIZE: 24
>
> Do you happen to know how to reproduce this issue? John Pittman.
>
> Thanks.
> Lianbo
>
>>
>> Acked-by: Kazuhito Hagio <k-hagio-ab(a)nec.com>
>>
>> Thanks,
>> Kazu
>>
>>> ---
>>> symbols.c | 11 +++++++++--
>>> 1 file changed, 9 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/symbols.c b/symbols.c
>>> index a2d5c6c..5d7da6e 100644
>>> --- a/symbols.c
>>> +++ b/symbols.c
>>> @@ -8356,8 +8356,15 @@ show_member_offset(FILE *ofp, struct datatype_member
*dm, char *inbuf)
>>> }
>>> } else if (c) {
>>> for (i = 0; i < c; i++) {
>>> - if (STRNEQ(arglist[i], "(*")) {
>>> - target = arglist[i]+2;
>>> + if (strstr(inbuf, "(*")) {
>>> + if (STRNEQ(arglist[i], "(*"))
>>> + target = arglist[i]+2;
>>> + else if (STRNEQ(arglist[i], "*(*"))
>>> + target = arglist[i]+3;
>>> + else if (STRNEQ(arglist[i], "**(*"))
>>> + target = arglist[i]+4;
>>> + else
>>> + continue;
>>> if (!(t1 = strstr(target, ")")))
>>> continue;
>>> *t1 = NULLCHAR;
>>> --
>>> 2.17.2
>>