----- 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?
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.
>
> 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 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,
Dave