----- Original Message -----
> Dave Anderson <[email protected]> writes:
> 
> > Hi Ogawa,
> 
> Hi,
> 
> > Please review the attached update to your patch, which adds support for
> > the irq_ctx-to-irq_stack transition.
> > -   if ((hard_sp = per_cpu_symbol_search("per_cpu__hardirq_ctx"))) {
> > +   if ((hard_sp = per_cpu_symbol_search("per_cpu__hardirq_ctx")) ||
> > +       (hard_sp = per_cpu_symbol_search("per_cpu__hardirq_stack"))) {
> >             if ((kt->flags & SMP) && (kt->flags & PER_CPU_OFF)) {
> >                     for (i = 0; i < NR_CPUS; i++) {
> > +                           ulong ptr;
> > +
> 
> [...]
> 
> Right, this will work, maybe, several stuffs. However hardirq_tasks[] is
> missing, so this will not be fully. For now, I don't have dump of other
> than v4.9 (stack format was changed), so I'm not sure which commands are
> not working (user of hardirq_tasks[]).

I haven't looked at the recent kernel to check out how the linkage is done
without the temporary thread_info at the bottom of the hard/soft irq stacks,
but looking at a live 4.9 system, it looks like the first word at the base of 
the hard and soft irq stack now contains a pointer into the stack of the
last caller?  If that's true, then stkptr_to_task() could be used to 
populate the hardirq_tasks[] and softirq_tasks[] -- but the initialization
would have to be delayed until near the end of task_init().

Dave

  
> 
> Thanks.
> 
> > +   if (MEMBER_EXISTS("irq_ctx", "tinfo")) {
> > +           for (i = 0; i < NR_CPUS; i++) {
> > +                   if (!(tt->hardirq_ctx[i]))
> > +                           continue;
> >  
> > -                if (!readmem(tt->hardirq_ctx[i], KVADDR, thread_info_buf,
> > -               SIZE(irq_ctx), "hardirq thread_union",
> > -               RETURN_ON_ERROR)) {
> > -                   error(INFO, "cannot read hardirq_ctx[%d] at %lx\n",
> > -                                   i, tt->hardirq_ctx[i]);
> > -                        continue;
> > -                }
> > +                   if (!readmem(tt->hardirq_ctx[i], KVADDR, 
> > thread_info_buf,
> > +                       SIZE(irq_ctx), "hardirq thread_union",
> > +                       RETURN_ON_ERROR)) {
> > +                           error(INFO, "cannot read hardirq_ctx[%d] at 
> > %lx\n",
> > +                                   i, tt->hardirq_ctx[i]);
> > +                           continue;
> > +                   }
> >  
> > -                tt->hardirq_tasks[i] =
> > -                   ULONG(thread_info_buf+OFFSET(thread_info_task));
> > +                   tt->hardirq_tasks[i] =
> > +                           ULONG(thread_info_buf+OFFSET(thread_info_task));
> > +           }
> >     }
> 
> --
> OGAWA Hirofumi <[email protected]>
> 

--
Crash-utility mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/crash-utility

Reply via email to