Re: [RFC PATCH 10/11] mcount tracer show task comm and pid

2008-01-09 Thread Ingo Molnar

* Mathieu Desnoyers <[EMAIL PROTECTED]> wrote:

> static inline int vmalloc_fault(unsigned long address)
> {
> unsigned long pgd_paddr;
> pmd_t *pmd_k;
> pte_t *pte_k;
> /*
>  * Synchronize this task's top level page-table
>  * with the 'reference' page table.
>  *
> >* Do _not_ use "current" here. We might be inside
>  * an interrupt in the middle of a task switch..
>  */
> pgd_paddr = read_cr3();
> pmd_k = vmalloc_sync_one(__va(pgd_paddr), address);
> if (!pmd_k)
> return -1;
> pte_k = pte_offset_kernel(pmd_k, address);
> if (!pte_present(*pte_k))
> return -1;
> return 0;
> }
> 
> At context switch on x86, loading the registers is done first, and 
> only after the is the current pointer set. However, for vmalloc 
> faults, it's the value in the cr3 register that is important, which 
> may not correspond to the cr3 value saved in "current".
> 
> So, I think using the "pid" and "comm" fields of current, even in NMI 
> context, is not a problem, just as you said. For early boot, the 
> current task will be init_task, which has pid = 0 and comm = 
> "swapper", still ok.

yeah - during the context-switch the value of 'current' might be 'stale' 
in a number of ways, but it's always atomically and coherently either 
pointing to the previous task or the next task. So from a tracing POV 
it's perfectly safe to use it (and we've been doing that for ages with 
the mcount stuff).

(The notrace mcount exclusions arent really to avoid any tracing 
badness, they are mostly to make the trace less spammy and more 
readable.)

Ingo
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC PATCH 10/11] mcount tracer show task comm and pid

2008-01-06 Thread Mathieu Desnoyers
* Ingo Molnar ([EMAIL PROTECTED]) wrote:
> 
> * Mathieu Desnoyers <[EMAIL PROTECTED]> wrote:
> 
> > > @@ -34,6 +34,7 @@ mctracer_add_trace_entry(struct mctracer
> > >  {
> > >   unsigned long idx, idx_next;
> > >   struct mctracer_entry *entry;
> > > + struct task_struct *tsk = current;
> > 
> > Aren't there situations, like in the middle of a context switch, where 
> > current is not valid ? Is also poses a problem for early boot, and NMI 
> > tracing.
> 
> no such problems on x86.
> 
>   Ingo

I based my comments on the following code snippet, but I think I start
to understand what makes it "so special"

arch/x86/mm/fault_32.c :

static inline int vmalloc_fault(unsigned long address)
{
unsigned long pgd_paddr;
pmd_t *pmd_k;
pte_t *pte_k;
/*
 * Synchronize this task's top level page-table
 * with the 'reference' page table.
 *
>* Do _not_ use "current" here. We might be inside
 * an interrupt in the middle of a task switch..
 */
pgd_paddr = read_cr3();
pmd_k = vmalloc_sync_one(__va(pgd_paddr), address);
if (!pmd_k)
return -1;
pte_k = pte_offset_kernel(pmd_k, address);
if (!pte_present(*pte_k))
return -1;
return 0;
}

At context switch on x86, loading the registers is done first, and only
after the is the current pointer set. However, for vmalloc faults, it's
the value in the cr3 register that is important, which may not
correspond to the cr3 value saved in "current".

So, I think using the "pid" and "comm" fields of current, even in NMI
context, is not a problem, just as you said. For early boot, the current
task will be init_task, which has pid = 0 and comm = "swapper", still
ok.

Thanks for pointing it out.

Mathieu

-- 
Mathieu Desnoyers
Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F  BA06 3F25 A8FE 3BAE 9A68
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC PATCH 10/11] mcount tracer show task comm and pid

2008-01-06 Thread Ingo Molnar

* Mathieu Desnoyers <[EMAIL PROTECTED]> wrote:

> > @@ -34,6 +34,7 @@ mctracer_add_trace_entry(struct mctracer
> >  {
> > unsigned long idx, idx_next;
> > struct mctracer_entry *entry;
> > +   struct task_struct *tsk = current;
> 
> Aren't there situations, like in the middle of a context switch, where 
> current is not valid ? Is also poses a problem for early boot, and NMI 
> tracing.

no such problems on x86.

Ingo
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC PATCH 10/11] mcount tracer show task comm and pid

2008-01-03 Thread Mathieu Desnoyers
* Steven Rostedt ([EMAIL PROTECTED]) wrote:
> This adds the task comm and pid to the trace output. This gives the
> output like:
> 
> CPU 0: sshd:2605 [] remove_wait_queue+0xc/0x4a <-- 
> [] free_poll_entry+0x1e/0x2a
> CPU 2: bash:2610 [] tty_check_change+0x9/0xb6 <-- 
> [] tty_ioctl+0x59f/0xcdd
> CPU 0: sshd:2605 [] _spin_lock_irqsave+0xe/0x81 <-- 
> [] remove_wait_queue+0x17/0x4a
> CPU 2: bash:2610 [] find_vpid+0x9/0x24 <-- 
> [] tty_ioctl+0x62f/0xcdd
> CPU 0: sshd:2605 [] _spin_unlock_irqrestore+0x9/0x3a <-- 
> [] remove_wait_queue+0x45/0x4a
> CPU 0: sshd:2605 [] fput+0x9/0x1b <-- [] 
> free_poll_entry+0x26/0x2a
> 
> 
> Signed-off-by: Steven Rostedt <[EMAIL PROTECTED]>
> ---
>  lib/mcount/tracer.c |6 +-
>  lib/mcount/tracer.h |3 +++
>  2 files changed, 8 insertions(+), 1 deletion(-)
> 
> Index: linux-compile.git/lib/mcount/tracer.c
> ===
> --- linux-compile.git.orig/lib/mcount/tracer.c2008-01-02 
> 23:17:21.0 -0500
> +++ linux-compile.git/lib/mcount/tracer.c 2008-01-02 23:17:44.0 
> -0500
> @@ -34,6 +34,7 @@ mctracer_add_trace_entry(struct mctracer
>  {
>   unsigned long idx, idx_next;
>   struct mctracer_entry *entry;
> + struct task_struct *tsk = current;

Aren't there situations, like in the middle of a context switch, where
current is not valid ? Is also poses a problem for early boot, and NMI
tracing.

>  
>   idx = tr->trace_idx[cpu];
>   idx_next = idx + 1;
> @@ -52,6 +53,8 @@ mctracer_add_trace_entry(struct mctracer
>   entry->idx   = atomic_inc_return(&tr->cnt);
>   entry->ip= ip;
>   entry->parent_ip = parent_ip;
> + entry->pid   = tsk->pid;
> + memcpy(entry->comm, tsk->comm, TASK_COMM_LEN);
>  }
>  
>  static inline notrace void trace_function(const unsigned long ip,
> @@ -223,7 +226,8 @@ static int s_show(struct seq_file *m, vo
>   return -1;
>   }
>  
> - seq_printf(m, "  CPU %d:  ", iter->cpu);
> + seq_printf(m, "CPU %d: ", iter->cpu);
> + seq_printf(m, "%s:%d ", iter->ent->comm, iter->ent->pid);
>   seq_print_ip_sym(m, iter->ent->ip);
>   if (iter->ent->parent_ip) {
>   seq_printf(m, " <-- ");
> Index: linux-compile.git/lib/mcount/tracer.h
> ===
> --- linux-compile.git.orig/lib/mcount/tracer.h2008-01-02 
> 23:16:15.0 -0500
> +++ linux-compile.git/lib/mcount/tracer.h 2008-01-02 23:17:44.0 
> -0500
> @@ -2,11 +2,14 @@
>  #define _LINUX_MCOUNT_TRACER_H
>  
>  #include 
> +#include 
>  
>  struct mctracer_entry {
>   unsigned long idx;
>   unsigned long ip;
>   unsigned long parent_ip;
> + char comm[TASK_COMM_LEN];
> + pid_t pid;
>  };
>  
>  struct mctracer_trace {
> 
> -- 

-- 
Mathieu Desnoyers
Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F  BA06 3F25 A8FE 3BAE 9A68
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/