-----Original Message-----
From: crash-utility-bounces(a)redhat.com
[mailto:crash-utility-bounces@redhat.com] On Behalf Of Dave Anderson
Sent: Thursday, January 17, 2019 11:17 PM
To: Discussion list for crash utility usage, maintenance and development
<crash-utility(a)redhat.com>
Subject: Re: [Crash-utility] [PATCH] Add -T option to configure task table via
a file
----- Original Message -----
>
>
> > -----Original Message-----
> > ----- Original Message -----
> > > I faced an incomplete vmcore previous week which was generated because
> > > system running in kdump kernel was somehow rebooted in the middle of
> > > copying vmcore.
> > >
> > > Unfortunately, in the incomplete vmcore, most of the tasks failed to
> > > be detected via PID hash table because the objects relevant to PID
> > > hash including ptes needed to refer to the objects were lost.
> > >
> > > Although I successfully found many of objects of task_struct from
> > > another data structure such as via a circular list of task_struct::tasks
> > > and via run queue, crash sub-commands never work with the following
> > > message if a given object is not contained in the task table:
> > >
> > > crash> bt 0xffffffff00000000
> > > bt: invalid task or pid value: 0xffffffff00000000
> > >
> > > To address this issue, I made a patch to add a command-line option
> > > to pass a list of addresses of task_struct objects to make crash
> > > try to detect them in task table.
> > >
> > > I made this in very short time and there may be better interface
> > > than command-line option.
> > >
> > > Tested on top of crash-7.2.5.
> >
> > Yeah, what bothers me about this patch is that even though it worked for
> > your
> > particular half-baked vmcore, it may never be of any help to anybody else
> > in the future.
> >
> > It's similar in nature to patches that have posted that address a
> > particular
> > unique kernel bug that was seen in one vmcore, but it would be highly
> > unlikely
> > that the circumstances would ever be seen again.
>
> I'm posting this patch because I think this could be useful for everyone...
>
> It was unfortunate that incomplete vmcore was generated and sent to us but
> there's case where engineers have to investigate issues based on the
> incomplete vmcore.
>
> I also think there would other cases where restoring task_struct could fail
> due to pure software issues, for example, memory corruption bugs, and think
> it natural that crash doesn't behave as expected when kernel data structures
> are abnormal state.
>
> I think options such as --minimal and --no_kmem_cache are to deal with
> such cases and this feature is similar in this sense.
Yes, but --minimal is for extreme situations, and doesn't really apply in this
case
given the small subset of available commands. --no_kmem_cache is more for
situations where for whatever reason the slab subsystem initialization fails
but it's not necessary to kill the whole session.
There is "crash --active", which gathers just the active tasks on each cpu
without using the normal task-gathering function. Were you aware of that
option?
I didn't know the option. But in this time I needed to gather inactive tasks
so the option would have been insufficient.
>
> By the way, I feel like I saw vmcores where some error messages
> were output during "(gathering task table data)" in the past and
> I guess some tasks were missing there but this was the first case I actually
> needed to try to restore them.
>
> >
> > But in this case, it's even more unlikely given that it's dealing with
> > an incomplete vmcore. You were lucky that you were able to even
> > bring up a crash session at all -- and then were able to generate
> > a task list after that.
>
> It was incomplete but was complete about 98%. The detection from PID
> hash was affected by loss of the remaining 2%.
>
> >
> > Following the task_struct.tasks list doesn't gather all of the
> > tasks in a task group, so it doesn't create a fully populated task
> > list, correct?
>
> Yes, I needed to repeat iterating successfully detected task_struct
> objects in order until all the target tasks were covered, and as your
> guess, there's no guarantee that I found all the task_struct objects,
> so I said 'many of'.
Ok, I suppose it's useful but not necessary to gather all tasks. As I mentioned
before, --active will gather the tasks running at the time of the crash, which
are typically the most important.
But I understand your point, where there may be other non-active tasks whose
backtrace or whatever may be useful.
Yes, actually, I found in this time an inactive task that entered sleep
due to some kernel bug, and the inactive task was initially not gathered.
>
> >
> > Plus it doesn't make sense to add it unless it's documented *how* to
> > create the task list to begin with.
>
> How about writing use case in help message or/and manual page?
>
> -T file
> Make crash detect task_struct objects listed in file as in
> task table. This is useful when your interesting tasks are
> missing in task table. You may find your interesting
> task_struct objects from various kernel data structures:
>
> From task_struct::tasks:
>
> crash> list task_struct.tasks -s task_struct.pid,comm -h
> ffff88003daa8000
> ffff88003daa8000
> pid = 1
> comm = "systemd\000\060\000\000\000\000\000\000"
> ffff88003daa8fd0
> pid = 2
> comm = "kthreadd\000\000\000\000\000\000\000"
> ffff88003daa9fa0
> pid = 3
> comm = "ksoftirqd/0\000\000\000\000"
> ...<snip>...
>
> From runqueue:
>
> crash> runq
> CPU 0 RUNQUEUE: ffff88003fc16cc0
> CURRENT: PID: 2188 TASK: ffff8800360f8000 COMMAND:
"foobar.sh"
> RT PRIO_ARRAY: ffff88003fc16e50
> [no tasks queued]
> CFS RB_ROOT: ffff88003fc16d68
> [no tasks queued]
>
> CPU 1 RUNQUEUE: ffff88003fd16cc0
> CURRENT: PID: 1 TASK: ffff88003daa8000 COMMAND: "systemd"
> RT PRIO_ARRAY: ffff88003fd16e50
> [no tasks queued]
> CFS RB_ROOT: ffff88003fd16d68
> [120] PID: 19054 TASK: ffff88000b684f10 COMMAND:
"kworker/1:0"
> [120] PID: 3863 TASK: ffff88003bd02f70 COMMAND: "emacs"
>
> This might be lengthy under option section.
Right, it could be more verbose under the help page section, but less so in
the
man page and in "crash --help".
I see.
>
> >
> > I don't know, let me think about this...
>
> I don't think the current design is best.
>
> For example, it might be better to be able to update task table at runtime
> by some crash sub-command. Looking at source code, it appears that
> task table is updated at command execution when needed, so it's not
> so difficult?
>
> void
> exec_command(void)
> {
> ...<snip>...
> if ((ct = get_command_table_entry(args[0]))) {
> if (ct->flags & REFRESH_TASK_TABLE) {
> if (XEN_HYPER_MODE()) {
> #ifdef XEN_HYPERVISOR_ARCH
>
xen_hyper_refresh_domain_context_space();
> xen_hyper_refresh_vcpu_context_space();
> #else
> error(FATAL,
XEN_HYPERVISOR_NOT_SUPPORTED);
> #endif
> } else if (!(pc->flags & MINIMAL_MODE)) {
> tt->refresh_task_table()
> sort_context_array();
> sort_tgid_array();
> }
> }
Right, although each of the several task table gathering plugin functions
only run one time if it's a dumpfile. But that could be adjusted for a
run-time command option that wants to add one or more tasks to the table.
Perhaps refresh_active_task_table() could be modified to allow the addition
of extra tasks, either by command line option, or allowing the function to be
re-run during runtime as directed by a "task -a task-address" or "task -A
file"
option.
Thanks for the idea.
I'll try to make a patch based on the idea.
By the way, I guess that would be next week or later in the current schedule.
Thanks.
HATAYAMA, Dais