From: Matt Helsley <matthltc@us.ibm.com>
To: Andrew Morton <akpm@osdl.org>
Cc: Linux-Kernel <linux-kernel@vger.kernel.org>,
Jes Sorensen <jes@sgi.com>,
LSE-Tech <lse-tech@lists.sourceforge.net>,
Chandra S Seetharaman <sekharan@us.ibm.com>,
Alan Stern <stern@rowland.harvard.edu>,
John T Kohl <jtk@us.ibm.com>, Balbir Singh <balbir@in.ibm.com>,
Shailabh Nagar <nagar@watson.ibm.com>,
Philippe Elie <phil.el@wanadoo.fr>,
oprofile-list@lists.sourceforge.net
Subject: [PATCH 08/11] Task watchers: Register profile as a task watcher
Date: Tue, 13 Jun 2006 16:54:57 -0700 [thread overview]
Message-ID: <1150242897.21787.148.camel@stark> (raw)
In-Reply-To: 20060613235122.130021000@localhost.localdomain
Modify oprofile to use the task watcher chain to watch for task exit.
oprofile uses task exit as a point to synch buffers.
This patch does not modify oprofile to use the task free path of task watchers.
oprofile has its own task_free atomic notifier chain. Since its an atomic chain
we can't replace it with task watcher. Also, it's called much later when the
actual task struct is really about to be freed.
Signed-off-by: Matt Helsley <matthltc@us.ibm.com>
Cc: Philippe Elie <phil.el@wanadoo.fr>
Cc: oprofile-list@lists.sf.net
--
drivers/oprofile/buffer_sync.c | 11 ++++++-----
include/linux/profile.h | 3 +--
kernel/exit.c | 1 -
kernel/profile.c | 14 --------------
4 files changed, 7 insertions(+), 22 deletions(-)
Index: linux-2.6.17-rc6-mm2/kernel/exit.c
===================================================================
--- linux-2.6.17-rc6-mm2.orig/kernel/exit.c
+++ linux-2.6.17-rc6-mm2/kernel/exit.c
@@ -847,11 +847,10 @@ fastcall NORET_TYPE void do_exit(long co
struct task_struct *tsk = current;
struct taskstats *tidstats, *tgidstats;
int group_dead;
int notify_result;
- profile_task_exit(tsk);
tsk->exit_code = code;
notify_result = notify_watchers(WATCH_TASK_EXIT, tsk);
WARN_ON(atomic_read(&tsk->fs_excl));
Index: linux-2.6.17-rc6-mm2/drivers/oprofile/buffer_sync.c
===================================================================
--- linux-2.6.17-rc6-mm2.orig/drivers/oprofile/buffer_sync.c
+++ linux-2.6.17-rc6-mm2/drivers/oprofile/buffer_sync.c
@@ -63,12 +63,13 @@ static int task_free_notify(struct notif
static int task_exit_notify(struct notifier_block * self, unsigned long val, void * data)
{
/* To avoid latency problems, we only process the current CPU,
* hoping that most samples for the task are on this CPU
*/
- sync_buffer(raw_smp_processor_id());
- return 0;
+ if (get_watch_event(val) == WATCH_TASK_EXIT)
+ sync_buffer(raw_smp_processor_id());
+ return NOTIFY_DONE;
}
/* The task is about to try a do_munmap(). We peek at what it's going to
* do, and if it's an executable region, process the samples first, so
@@ -150,11 +151,11 @@ int sync_start(void)
start_cpu_work();
err = task_handoff_register(&task_free_nb);
if (err)
goto out1;
- err = profile_event_register(PROFILE_TASK_EXIT, &task_exit_nb);
+ err = register_task_watcher(&task_exit_nb);
if (err)
goto out2;
err = profile_event_register(PROFILE_MUNMAP, &munmap_nb);
if (err)
goto out3;
@@ -165,11 +166,11 @@ int sync_start(void)
out:
return err;
out4:
profile_event_unregister(PROFILE_MUNMAP, &munmap_nb);
out3:
- profile_event_unregister(PROFILE_TASK_EXIT, &task_exit_nb);
+ unregister_task_watcher(&task_exit_nb);
out2:
task_handoff_unregister(&task_free_nb);
out1:
end_sync();
goto out;
@@ -178,11 +179,11 @@ out1:
void sync_stop(void)
{
unregister_module_notifier(&module_load_nb);
profile_event_unregister(PROFILE_MUNMAP, &munmap_nb);
- profile_event_unregister(PROFILE_TASK_EXIT, &task_exit_nb);
+ unregister_task_watcher(&task_exit_nb);
task_handoff_unregister(&task_free_nb);
end_sync();
}
Index: linux-2.6.17-rc6-mm2/kernel/profile.c
===================================================================
--- linux-2.6.17-rc6-mm2.orig/kernel/profile.c
+++ linux-2.6.17-rc6-mm2/kernel/profile.c
@@ -85,19 +85,13 @@ void __init profile_init(void)
/* Profile event notifications */
#ifdef CONFIG_PROFILING
-static BLOCKING_NOTIFIER_HEAD(task_exit_notifier);
static ATOMIC_NOTIFIER_HEAD(task_free_notifier);
static BLOCKING_NOTIFIER_HEAD(munmap_notifier);
-void profile_task_exit(struct task_struct * task)
-{
- blocking_notifier_call_chain(&task_exit_notifier, 0, task);
-}
-
int profile_handoff_task(struct task_struct * task)
{
int ret;
ret = atomic_notifier_call_chain(&task_free_notifier, 0, task);
return (ret == NOTIFY_OK) ? 1 : 0;
@@ -121,14 +115,10 @@ int task_handoff_unregister(struct notif
int profile_event_register(enum profile_type type, struct notifier_block * n)
{
int err = -EINVAL;
switch (type) {
- case PROFILE_TASK_EXIT:
- err = blocking_notifier_chain_register(
- &task_exit_notifier, n);
- break;
case PROFILE_MUNMAP:
err = blocking_notifier_chain_register(
&munmap_notifier, n);
break;
}
@@ -140,14 +130,10 @@ int profile_event_register(enum profile_
int profile_event_unregister(enum profile_type type, struct notifier_block * n)
{
int err = -EINVAL;
switch (type) {
- case PROFILE_TASK_EXIT:
- err = blocking_notifier_chain_unregister(
- &task_exit_notifier, n);
- break;
case PROFILE_MUNMAP:
err = blocking_notifier_chain_unregister(
&munmap_notifier, n);
break;
}
Index: linux-2.6.17-rc6-mm2/include/linux/profile.h
===================================================================
--- linux-2.6.17-rc6-mm2.orig/include/linux/profile.h
+++ linux-2.6.17-rc6-mm2/include/linux/profile.h
@@ -24,12 +24,11 @@ void create_prof_cpu_mask(struct proc_di
#else
#define create_prof_cpu_mask(x) do { (void)(x); } while (0)
#endif
enum profile_type {
- PROFILE_TASK_EXIT,
- PROFILE_MUNMAP
+ PROFILE_MUNMAP = 1
};
#ifdef CONFIG_PROFILING
struct task_struct;
--
next prev parent reply other threads:[~2006-06-14 0:03 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20060613235122.130021000@localhost.localdomain>
2006-06-13 23:53 ` [PATCH 01/11] Task watchers: Task Watchers Matt Helsley
2006-06-14 0:19 ` Chase Venters
2006-06-14 0:55 ` Matt Helsley
2006-06-13 23:54 ` [PATCH 02/11] Task watchers: Register process events task watcher Matt Helsley
2006-06-14 0:39 ` Chase Venters
2006-06-14 0:52 ` Matt Helsley
2006-06-13 23:54 ` [PATCH 03/11] Task watchers: Refactor process events Matt Helsley
2006-06-14 0:43 ` Chase Venters
2006-06-14 1:11 ` Matt Helsley
2006-06-14 8:09 ` Chase Venters
2006-06-13 23:54 ` [PATCH 04/11] Task watchers: Make process events configurable as a module Matt Helsley
2006-06-14 0:54 ` Chase Venters
2006-06-14 1:18 ` [Lse-tech] " Matt Helsley
2006-06-13 23:54 ` [PATCH 05/11] Task watchers: Allow task watchers to block Matt Helsley
2006-06-13 23:54 ` [PATCH 06/11] Task watchers: Register audit task watcher Matt Helsley
2006-06-14 14:46 ` Alexander Viro
2006-06-14 23:28 ` Matt Helsley
2006-06-13 23:54 ` [PATCH 07/11] Task watchers: Register per-task delay accounting " Matt Helsley
2006-06-14 3:31 ` Shailabh Nagar
2006-06-14 22:52 ` Matt Helsley
2006-06-13 23:54 ` Matt Helsley [this message]
2006-06-14 0:59 ` [PATCH 08/11] Task watchers: Register profile as a " Chase Venters
2006-06-14 1:16 ` [Lse-tech] " Matt Helsley
2006-06-13 23:55 ` [PATCH 09/11] Task watchers: Add support for per-task watchers Matt Helsley
2006-06-20 5:28 ` Peter Williams
2006-06-20 22:56 ` [Lse-tech] " Matt Helsley
2006-06-20 23:15 ` Andrew Morton
2006-06-20 23:23 ` Peter Williams
2006-06-21 1:20 ` Matt Helsley
2006-06-21 1:46 ` Andrew Morton
2006-06-21 1:55 ` Peter Williams
2006-06-21 13:01 ` Peter Williams
2006-06-21 13:23 ` Peter Williams
2006-06-21 2:28 ` Matt Helsley
2006-06-20 23:21 ` Peter Williams
2006-06-13 23:55 ` [PATCH 10/11] Task watchers: Register semundo task watcher Matt Helsley
2006-06-13 23:55 ` [PATCH 11/11] Task watchers: Register per-task semundo watcher Matt Helsley
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=1150242897.21787.148.camel@stark \
--to=matthltc@us.ibm.com \
--cc=akpm@osdl.org \
--cc=balbir@in.ibm.com \
--cc=jes@sgi.com \
--cc=jtk@us.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=lse-tech@lists.sourceforge.net \
--cc=nagar@watson.ibm.com \
--cc=oprofile-list@lists.sourceforge.net \
--cc=phil.el@wanadoo.fr \
--cc=sekharan@us.ibm.com \
--cc=stern@rowland.harvard.edu \
/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