From: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
To: akpm@linux-foundation.org, Ingo Molnar <mingo@elte.hu>,
linux-kernel@vger.kernel.org
Cc: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
Subject: [patch-RFC 26/26] LTTng Kernel Trace Thread Flag API
Date: Wed, 05 Dec 2007 21:43:09 -0500 [thread overview]
Message-ID: <20071206024439.090120769@polymtl.ca> (raw)
In-Reply-To: 20071206024243.397994403@polymtl.ca
[-- Attachment #1: lttng-kernel-trace-thread-flag-api.patch --]
[-- Type: text/plain, Size: 4058 bytes --]
Add an API to set/clear the kernel wide tracing thread flags. Implemented in
kernel/sched.c. Updates thread flags *asynchronously* while holding the tasklist
lock.
Upon fork, the flag must be re-copied while the tasklist lock is held.
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
---
include/linux/sched.h | 3 ++
kernel/fork.c | 9 ++++++++
kernel/sched.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 67 insertions(+)
Index: linux-2.6-lttng/include/linux/sched.h
===================================================================
--- linux-2.6-lttng.orig/include/linux/sched.h 2007-12-05 20:50:29.000000000 -0500
+++ linux-2.6-lttng/include/linux/sched.h 2007-12-05 20:54:32.000000000 -0500
@@ -2000,6 +2000,9 @@ static inline void migration_init(void)
}
#endif
+extern void clear_kernel_trace_flag_all_tasks(void);
+extern void set_kernel_trace_flag_all_tasks(void);
+
#endif /* __KERNEL__ */
#endif
Index: linux-2.6-lttng/kernel/fork.c
===================================================================
--- linux-2.6-lttng.orig/kernel/fork.c 2007-12-05 20:54:00.000000000 -0500
+++ linux-2.6-lttng/kernel/fork.c 2007-12-05 20:54:32.000000000 -0500
@@ -1241,6 +1241,15 @@ static struct task_struct *copy_process(
!cpu_online(task_cpu(p))))
set_task_cpu(p, smp_processor_id());
+ /*
+ * The state of the parent's TIF_KTRACE flag may have changed
+ * since it was copied in dup_task_struct() so we re-copy it here.
+ */
+ if (test_thread_flag(TIF_KERNEL_TRACE))
+ set_tsk_thread_flag(p, TIF_KERNEL_TRACE);
+ else
+ clear_tsk_thread_flag(p, TIF_KERNEL_TRACE);
+
/* CLONE_PARENT re-uses the old parent */
if (clone_flags & (CLONE_PARENT|CLONE_THREAD))
p->real_parent = current->real_parent;
Index: linux-2.6-lttng/kernel/sched.c
===================================================================
--- linux-2.6-lttng.orig/kernel/sched.c 2007-12-05 20:54:00.000000000 -0500
+++ linux-2.6-lttng/kernel/sched.c 2007-12-05 20:54:32.000000000 -0500
@@ -7394,3 +7394,58 @@ struct cgroup_subsys cpuacct_subsys = {
.subsys_id = cpuacct_subsys_id,
};
#endif /* CONFIG_CGROUP_CPUACCT */
+
+static DEFINE_MUTEX(kernel_trace_mutex);
+static int kernel_trace_refcount;
+
+/**
+ * clear_kernel_trace_flag_all_tasks - clears all TIF_KERNEL_TRACE thread flags.
+ *
+ * This function iterates on all threads in the system to clear their
+ * TIF_KERNEL_TRACE flag. Setting the TIF_KERNEL_TRACE flag with the
+ * tasklist_lock held in copy_process() makes sure that once we finish clearing
+ * the thread flags, all threads have their flags cleared.
+ */
+void clear_kernel_trace_flag_all_tasks(void)
+{
+ struct task_struct *p;
+ struct task_struct *t;
+
+ mutex_lock(&kernel_trace_mutex);
+ if (--kernel_trace_refcount)
+ goto end;
+ read_lock(&tasklist_lock);
+ do_each_thread(p, t) {
+ clear_tsk_thread_flag(t, TIF_KERNEL_TRACE);
+ } while_each_thread(p, t);
+ read_unlock(&tasklist_lock);
+end:
+ mutex_unlock(&kernel_trace_mutex);
+}
+EXPORT_SYMBOL_GPL(clear_kernel_trace_flag_all_tasks);
+
+/**
+ * set_kernel_trace_flag_all_tasks - sets all TIF_KERNEL_TRACE thread flags.
+ *
+ * This function iterates on all threads in the system to set their
+ * TIF_KERNEL_TRACE flag. Setting the TIF_KERNEL_TRACE flag with the
+ * tasklist_lock held in copy_process() makes sure that once we finish setting
+ * the thread flags, all threads have their flags set.
+ */
+void set_kernel_trace_flag_all_tasks(void)
+{
+ struct task_struct *p;
+ struct task_struct *t;
+
+ mutex_lock(&kernel_trace_mutex);
+ if (kernel_trace_refcount++)
+ goto end;
+ read_lock(&tasklist_lock);
+ do_each_thread(p, t) {
+ set_tsk_thread_flag(t, TIF_KERNEL_TRACE);
+ } while_each_thread(p, t);
+ read_unlock(&tasklist_lock);
+end:
+ mutex_unlock(&kernel_trace_mutex);
+}
+EXPORT_SYMBOL_GPL(set_kernel_trace_flag_all_tasks);
--
Mathieu Desnoyers
Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68
next prev parent reply other threads:[~2007-12-06 2:46 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-12-06 2:42 [patch-RFC 00/26] LTTng Kernel Trace Thread Flag Mathieu Desnoyers
2007-12-06 2:42 ` [patch-RFC 01/26] LTTng Kernel Trace Thread Flag Alpha Mathieu Desnoyers
2007-12-06 2:42 ` [patch-RFC 02/26] LTTng Kernel Trace Thread Flag ARM Mathieu Desnoyers
2007-12-06 2:42 ` [patch-RFC 03/26] LTTng Kernel Trace Thread Flag AVR32 Mathieu Desnoyers
2007-12-06 2:42 ` [patch-RFC 04/26] LTTng Kernel Trace Thread Flag Blackfin Mathieu Desnoyers
2007-12-06 2:42 ` [patch-RFC 05/26] LTTng Kernel Trace Thread Flag Cris Mathieu Desnoyers
2007-12-06 2:42 ` [patch-RFC 06/26] LTTng Kernel Trace Thread Flag Frv Mathieu Desnoyers
2007-12-06 2:42 ` [patch-RFC 07/26] LTTng Kernel Trace Thread Flag H8300 Mathieu Desnoyers
2007-12-06 2:42 ` [patch-RFC 08/26] LTTng Linux Kernel Trace Thread Flags x86_32 Mathieu Desnoyers
2007-12-06 2:42 ` [patch-RFC 09/26] LTTng Kernel Trace Thread Flag ia64 Mathieu Desnoyers
2007-12-06 2:42 ` [patch-RFC 10/26] LTTng Kernel Trace Thread Flag m32r Mathieu Desnoyers
2007-12-06 2:42 ` [patch-RFC 11/26] LTTng Kernel Trace Thread Flag m68k Mathieu Desnoyers
2007-12-06 2:42 ` [patch-RFC 12/26] LTTng Kernel Trace Thread Flag m68knommu Mathieu Desnoyers
2007-12-06 2:42 ` [patch-RFC 13/26] LTTng Kernel Trace Thread Flag MIPS Mathieu Desnoyers
2007-12-06 2:42 ` [patch-RFC 14/26] LTTng Kernel Trace Thread Flag parisc Mathieu Desnoyers
2007-12-06 2:42 ` [patch-RFC 15/26] LTTng Kernel Trace Thread Flag powerpc Mathieu Desnoyers
2007-12-06 2:42 ` [patch-RFC 16/26] LTTng Kernel Trace Thread Flag s390 Mathieu Desnoyers
2007-12-06 2:43 ` [patch-RFC 17/26] LTTng Kernel Trace Thread Flag SH Mathieu Desnoyers
2007-12-06 2:43 ` [patch-RFC 18/26] LTTng Kernel Trace Thread Flag sh64 Mathieu Desnoyers
2007-12-06 2:43 ` [patch-RFC 19/26] LTTng Kernel Trace Thread Flag sparc Mathieu Desnoyers
2007-12-06 2:43 ` [patch-RFC 20/26] LTTng Kernel Trace Thread Flag sparc64 Mathieu Desnoyers
2007-12-06 2:43 ` [patch-RFC 21/26] LTTng Kernel Trace Thread Flag UML Mathieu Desnoyers
2007-12-06 2:43 ` [patch-RFC 22/26] LTTng Kernel Trace Thread Flag v850 Mathieu Desnoyers
2007-12-06 2:43 ` [patch-RFC 23/26] Prepare x86_64 for TIF_SYSCALL_TRACE async flag set in entry.S Mathieu Desnoyers
2007-12-06 2:43 ` [patch-RFC 24/26] LTTng Linux Kernel Trace Thread Flag x86_64 Mathieu Desnoyers
2007-12-06 2:43 ` [patch-RFC 25/26] LTTng Kernel Trace Thread Flag xtensa Mathieu Desnoyers
2007-12-06 2:43 ` Mathieu Desnoyers [this message]
2007-12-06 21:30 ` [patch-RFC 00/26] LTTng Kernel Trace Thread Flag Frank Ch. Eigler
2007-12-07 13:44 ` Mathieu Desnoyers
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20071206024439.090120769@polymtl.ca \
--to=mathieu.desnoyers@polymtl.ca \
--cc=akpm@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox