Hello all,

I have idea to include to the user the following new per-process (thread) performance statistics:

   * Involuntary Context Switches
   * Voluntary Context Switches
   * Number of system calls

What do you think about it? Patch is bellow.

Best regards,
Max Uvarov.


Description:
   Patch adds Process Performance Statistics.

arch/i386/kernel/entry.S       |    3 +++
arch/mips/kernel/entry.S       |    3 +++
arch/powerpc/kernel/entry_32.S |    3 +++
arch/x86_64/kernel/entry.S     |    3 +++
fs/proc/array.c                |   13 +++++++++++++
include/linux/sched.h          |    3 +++
kernel/fork.c                  |    3 +++
kernel/sys.c                   |    8 ++++++++
lib/Kconfig.debug              |   10 ++++++++++
9 files changed, 49 insertions(+)

Index: linux-2.6.18/fs/proc/array.c
===================================================================
--- linux-2.6.18.orig/fs/proc/array.c
+++ linux-2.6.18/fs/proc/array.c
@@ -295,6 +295,18 @@ static inline char *task_cap(struct task
                           cap_t(p->cap_effective));
}

+#ifdef THREAD_PERF_STAT
+static inline char *task_perf(struct task_struct *p, char *buffer)
+{
+    return buffer + sprintf(buffer, "Nvcsw:\t%lu\n"
+                           "Nivcsw:\t%lu\n"
+                           "Syscalls:\t%d\n",
+                           cap_t(p->nvcsw),
+                           cap_t(p->nivcsw),
+                           cap_t(p->sysc_cnt));
+}
+#endif /* THREAD_PERF_STAT */
+
#define get_blocked_on(t)      (-1)

static char *show_blocked_on(struct task_struct *task, char *buffer)
@@ -327,6 +339,7 @@ int proc_pid_status(struct task_struct *
       buffer = task_show_regs(task, buffer);
#endif
       buffer = show_blocked_on(task,buffer);
+       buffer = task_perf(task, buffer);
       return buffer - orig;
}

Index: linux-2.6.18/include/linux/sched.h
===================================================================
--- linux-2.6.18.orig/include/linux/sched.h
+++ linux-2.6.18/include/linux/sched.h
@@ -1193,6 +1193,9 @@ struct task_struct {
       ltt_facility_t ltt_facilities[LTT_FAC_PER_PROCESS];
#endif //CONFIG_LTT_USERSPACE_GENERIC

+#ifdef THREAD_PERF_STAT
+       int sysc_cnt;           /* Syscall counter */
+#endif /* THREAD_PERF_STAT */
       /*
        * task-specic data
        * XXX: for a future release, MontaVista-only
Index: linux-2.6.18/kernel/sys.c
===================================================================
--- linux-2.6.18.orig/kernel/sys.c
+++ linux-2.6.18/kernel/sys.c
@@ -2071,3 +2071,11 @@ asmlinkage long sys_prctl(int option, un
       }
       return error;
}
+#ifdef THREAD_PERF_STAT
+asmlinkage void inc_syscallcnt(void)
+{
+       current->sysc_cnt += 1;
+       return;
+}
+#endif /* THREAD_PERF_STAT */
+
Index: linux-2.6.18/kernel/fork.c
===================================================================
--- linux-2.6.18.orig/kernel/fork.c
+++ linux-2.6.18/kernel/fork.c
@@ -1079,6 +1079,9 @@ static struct task_struct *copy_process(
       p->wchar = 0;           /* I/O counter: bytes written */
       p->syscr = 0;           /* I/O counter: read syscalls */
       p->syscw = 0;           /* I/O counter: write syscalls */
+#ifdef THREAD_PERF_STAT
+ p->sysc_cnt = 0; /* Syscall counter: total numbers of syscalls */
+#endif /* THREAD_PERF_STAT */
       acct_clear_integrals(p);

       p->it_virt_expires = cputime_zero;
Index: linux-2.6.18/arch/i386/kernel/entry.S
===================================================================
--- linux-2.6.18.orig/arch/i386/kernel/entry.S
+++ linux-2.6.18/arch/i386/kernel/entry.S
@@ -394,6 +394,9 @@ syscall_exit:
cli # make sure we don't miss an interrupt
                                       # setting need_resched or sigpending
                                       # between sampling and the iret
+#ifdef THREAD_PERF_STAT
+ call inc_syscallcnt # Increment syscalls counter current->sysc_cnt
+#endif /* THREAD_PERF_STAT */
       TRACE_IRQS_OFF
       movl TI_flags(%ebp), %ecx
       testw $_TIF_ALLWORK_MASK, %cx   # current->work
Index: linux-2.6.18/arch/x86_64/kernel/entry.S
===================================================================
--- linux-2.6.18.orig/arch/x86_64/kernel/entry.S
+++ linux-2.6.18/arch/x86_64/kernel/entry.S
@@ -388,6 +388,9 @@ ENTRY(int_ret_from_sys_call)
       /* edi: mask to check */
int_with_check:
       GET_THREAD_INFO(%rcx)
+#ifdef THREAD_PERF_STAT
+ call inc_syscallcnt # Increment syscalls counter current->sysc_cnt
+#endif /* THREAD_PERF_STAT */
       movl threadinfo_flags(%rcx),%edx
       andl %edi,%edx
       jnz   int_careful
Index: linux-2.6.18/arch/powerpc/kernel/entry_32.S
===================================================================
--- linux-2.6.18.orig/arch/powerpc/kernel/entry_32.S
+++ linux-2.6.18/arch/powerpc/kernel/entry_32.S
@@ -236,6 +236,9 @@ ret_from_syscall:
#ifdef SHOW_SYSCALLS
       bl      do_show_syscall_exit
#endif
+#ifdef THREAD_PERF_STAT
+ bl inc_syscallcnt /* Increment syscalls counter current->sysc_cnt */
+#endif /* THREAD_PERF_STAT */
#ifdef CONFIG_MICROSTATE
       /* FIXME: this is too early since this might not return to
          user space just yet because of syscall_exit_work */
Index: linux-2.6.18/arch/mips/kernel/entry.S
===================================================================
--- linux-2.6.18.orig/arch/mips/kernel/entry.S
+++ linux-2.6.18/arch/mips/kernel/entry.S
@@ -75,6 +75,9 @@ FEXPORT(syscall_exit)
       raw_local_irq_disable   # make sure need_resched and
                                       # signals dont change between
                                       # sampling and return
+#ifdef THREAD_PERF_STAT
+ jal inc_syscallcnt # Increment syscalls counter current->sysc_cnt
+#endif /* THREAD_PERF_STAT */
       LONG_L  a2, TI_FLAGS($28)       # current->work
       li      t0, _TIF_ALLWORK_MASK
       and     t0, a2, t0
Index: linux-2.6.18/lib/Kconfig.debug
===================================================================
--- linux-2.6.18.orig/lib/Kconfig.debug
+++ linux-2.6.18/lib/Kconfig.debug
@@ -539,4 +539,14 @@ config RCU_TORTURE_TEST
         Say M if you want the RCU torture tests to build as a module.
         Say N if you are unsure.

+config THREAD_PERF_STAT
+       bool "Per-process (thread) performance statistics"
+       depends on (X86 || PPC || MIPS)
+       help
+ Make available to the user the following new per-process (thread) performance statistics:
+           * Involuntary Context Switches
+           * Voluntary Context Switches
+           * Number of system calls
+         This information is available via /proc/PID/status.
+
source "lib/Kconfig.kgdb"
-
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/

Reply via email to