public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] sched: allow preempt notifiers to self-unregister.
@ 2011-12-16 16:15 Pierre Habouzit
  2011-12-16 17:09 ` Peter Zijlstra
  2011-12-18  9:10 ` Avi Kivity
  0 siblings, 2 replies; 7+ messages in thread
From: Pierre Habouzit @ 2011-12-16 16:15 UTC (permalink / raw)
  To: linux-kernel; +Cc: Pierre Habouzit, Avi Kivity, Ingo Molnar, Peter Zijlstra

This is very annoying when unlike kvm (the sole in-tree user I know of)
the process is a plain user process the kernel doesn't really handle and
that it wants to unregister the callbacks just at its death.

The code that one would like to write is:

    static my_module_sched_out(struct preempt_notifier *notifier)
    {
        struct my_module_type *mmi =
            container_of(notifier, struct my_module_type, notifier);

        if (unlikely(current->state & TASK_DEAD)) {
            preempt_notifier_unregister(notifier);
            kfree(mmi);
            return;
        }

        /* do our real work */
    }

Sadly this isn't allowed because the htlist walk isn't "safe" against
removals.

Signed-off-by: Pierre Habouzit <pierre.habouzit@intersec.com>
Cc: Avi Kivity <avi@qumranet.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Peter Zijlstra <peterz@infradead.org>
---
 kernel/sched.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

  As a background, this need is because I have some kind of module code
  that uses this facility to evaluate how many of a group of threads are
  concurrently running (to regulate a pool of threads).

  Hence I install those callbacks for the thread registering themselves
  and want to keep them until the thread dies. Sadly I have no way to
  unregister those callbacks right now, but for horrible hacks (involving
  private delayed queues processed regularly walked to kfree() the
  structures referencing pids that are dead, urgh).

diff --git a/kernel/sched.c b/kernel/sched.c
index d6b149c..2653169 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -3106,7 +3106,7 @@ static void fire_sched_in_preempt_notifiers(struct task_struct *curr)
 	struct preempt_notifier *notifier;
 	struct hlist_node *node;
 
-	hlist_for_each_entry(notifier, node, &curr->preempt_notifiers, link)
+	hlist_for_each_entry_safe(notifier, node, &curr->preempt_notifiers, link)
 		notifier->ops->sched_in(notifier, raw_smp_processor_id());
 }
 
@@ -3117,7 +3117,7 @@ fire_sched_out_preempt_notifiers(struct task_struct *curr,
 	struct preempt_notifier *notifier;
 	struct hlist_node *node;
 
-	hlist_for_each_entry(notifier, node, &curr->preempt_notifiers, link)
+	hlist_for_each_entry_safe(notifier, node, &curr->preempt_notifiers, link)
 		notifier->ops->sched_out(notifier, next);
 }
 
-- 
1.7.8.rc3.348.gb51a37


^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2011-12-19 10:26 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-12-16 16:15 [PATCH] sched: allow preempt notifiers to self-unregister Pierre Habouzit
2011-12-16 17:09 ` Peter Zijlstra
2011-12-16 17:25   ` Pierre Habouzit
2011-12-16 17:33     ` Peter Zijlstra
2011-12-16 17:42       ` Pierre Habouzit
2011-12-18  9:10 ` Avi Kivity
2011-12-19 10:26   ` Pierre Habouzit

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox