ARM: 7688/1: add support for context tracking subsystem
authorKevin Hilman <khilman@deeprootsystems.com>
Thu, 28 Mar 2013 21:54:40 +0000 (22:54 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Wed, 3 Apr 2013 16:00:01 +0000 (17:00 +0100)
commit 91d1aa43 (context_tracking: New context tracking susbsystem)
generalized parts of the RCU userspace extended quiescent state into
the context tracking subsystem.  Context tracking is then used
to implement adaptive tickless (a.k.a extended nohz)

To support the new context tracking subsystem on ARM, the user/kernel
boundary transtions need to be instrumented.

For exceptions and IRQs in usermode, the existing usr_entry macro is
used to instrument the user->kernel transition.  For the return to
usermode path, the ret_to_user* path is instrumented.  Using the
usr_entry macro, this covers interrupts in userspace, data abort and
prefetch abort exceptions in userspace as well as undefined exceptions
in userspace (which is where FP emulation and VFP are handled.)

For syscalls, the slow return path is covered by instrumenting the
ret_to_user path.  In addition, the syscall entry point is
instrumented which covers the user->kernel transition for both fast
and slow syscalls, and an additional instrumentation point is added
for the fast syscall return path (ret_fast_syscall).

Cc: Mats Liljegren <mats.liljegren@enea.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: Kevin Hilman <khilman@linaro.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/Kconfig
arch/arm/include/asm/thread_info.h
arch/arm/kernel/entry-armv.S
arch/arm/kernel/entry-common.S
arch/arm/kernel/entry-header.S

index 5b714695b01bb9db0455ad2f5c959a714aa00064..7dc4cabc34d79854dfc70205f131ec8c9b37ec08 100644 (file)
@@ -59,6 +59,7 @@ config ARM
        select CLONE_BACKWARDS
        select OLD_SIGSUSPEND3
        select OLD_SIGACTION
+       select HAVE_CONTEXT_TRACKING
        help
          The ARM series is a line of low-power-consumption RISC chip designs
          licensed by ARM Ltd and targeted at embedded applications and
index cddda1f41f0f5fcfefe6d438937f5afcff2e9cf8..1995d1a840609f3df26114e2ca3eed388a0d5f8e 100644 (file)
@@ -152,6 +152,7 @@ extern int vfp_restore_user_hwstate(struct user_vfp __user *,
 #define TIF_SYSCALL_AUDIT      9
 #define TIF_SYSCALL_TRACEPOINT 10
 #define TIF_SECCOMP            11      /* seccomp syscall filtering active */
+#define TIF_NOHZ               12      /* in adaptive nohz mode */
 #define TIF_USING_IWMMXT       17
 #define TIF_MEMDIE             18      /* is terminating due to OOM killer */
 #define TIF_RESTORE_SIGMASK    20
index 0f82098c9bfe3618115dcc4e8b2d74d95c7ddcf6..2b1de1b2f132cf651295dd2df5b031f8ba943196 100644 (file)
@@ -396,6 +396,7 @@ ENDPROC(__pabt_svc)
 #ifdef CONFIG_IRQSOFF_TRACER
        bl      trace_hardirqs_off
 #endif
+       ct_user_exit save = 0
        .endm
 
        .macro  kuser_cmpxchg_check
index 3248cde504ed9e3995d2f14357e9e1875b3f8129..469e82b3f75797c9d04bf969a84396d4e3c5f827 100644 (file)
@@ -41,6 +41,7 @@ ret_fast_syscall:
 
        /* perform architecture specific actions before user return */
        arch_ret_to_user r1, lr
+       ct_user_enter
 
        restore_user_regs fast = 1, offset = S_OFF
  UNWIND(.fnend         )
@@ -76,6 +77,7 @@ no_work_pending:
 #endif
        /* perform architecture specific actions before user return */
        arch_ret_to_user r1, lr
+       ct_user_enter save = 0
 
        restore_user_regs fast = 0, offset = 0
 ENDPROC(ret_to_user_from_irq)
@@ -394,6 +396,7 @@ ENTRY(vector_swi)
        mcr     p15, 0, ip, c1, c0              @ update control register
 #endif
        enable_irq
+       ct_user_exit
 
        get_thread_info tsk
        adr     tbl, sys_call_table             @ load syscall table pointer
index 9a8531eadd3da437ccadd6f5b60eac6a16808607..782a9495628694e17ccdda0c3b1a44f846b38ff2 100644 (file)
        .endm
 #endif /* !CONFIG_THUMB2_KERNEL */
 
+/*
+ * Context tracking subsystem.  Used to instrument transitions
+ * between user and kernel mode.
+ */
+       .macro ct_user_exit, save = 1
+#ifdef CONFIG_CONTEXT_TRACKING
+       .if     \save
+       stmdb   sp!, {r0-r3, ip, lr}
+       bl      user_exit
+       ldmia   sp!, {r0-r3, ip, lr}
+       .else
+       bl      user_exit
+       .endif
+#endif
+       .endm
+
+       .macro ct_user_enter, save = 1
+#ifdef CONFIG_CONTEXT_TRACKING
+       .if     \save
+       stmdb   sp!, {r0-r3, ip, lr}
+       bl      user_enter
+       ldmia   sp!, {r0-r3, ip, lr}
+       .else
+       bl      user_enter
+       .endif
+#endif
+       .endm
+
 /*
  * These are the registers used in the syscall handler, and allow us to
  * have in theory up to 7 arguments to a function - r0 to r6.