Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1750893AbbGAHQq (ORCPT ); Wed, 1 Jul 2015 03:16:46 -0400 Received: from m13-148.163.com ([220.181.13.148]:41087 "EHLO m13-148.163.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751126AbbGAHQh (ORCPT ); Wed, 1 Jul 2015 03:16:37 -0400 X-Originating-IP: [163.177.153.126] Date: Wed, 1 Jul 2015 15:16:06 +0800 (CST) From: cfme_admin To: "peterz@infradead.org" , "mingo@redhat.com" , =?UTF-8?B?5oiR?= Cc: "linux-kernel@vger.kernel.org" Subject: Re:[PATCH] sched: fix BUG in preempt_notifier X-Priority: 3 X-Mailer: Coremail Webmail Server Version SP_ntes V3.5 build 20150119(59087.7062) Copyright (c) 2002-2015 www.mailtech.cn 163com In-Reply-To: <1435732410-18060-1-git-send-email-cfme_admin@163.com> References: <1435732410-18060-1-git-send-email-cfme_admin@163.com> Content-Type: text/plain; charset=UTF-8 MIME-Version: 1.0 Message-ID: <1206dcd9.10422.14e48790026.Coremail.cfme_admin@163.com> X-CM-TRANSID: lMGowAC3P3W2k5NVSx1fAA--.7709W X-CM-SenderInfo: 5fipvspdgpx0i6rwjhhfrp/xtbBzxwqd1D+nM8-4QADsu X-Coremail-Antispam: 1U5529EdanIXcx71UUUUU7vcSsGvfC2KfnxnUU== Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from base64 to 8bit by mail.home.local id t617Gnjv015764 Content-Length: 3076 Lines: 91 more information about the bug is below: https://bugzilla.kernel.org/show_bug.cgi?id=100701 the preempt_notifier_unregister function is run in_atomic context, but static_key_slow_dec function may cause sleep. At 2015-07-01 14:33:30, "Lidong Chen" wrote: >Signed-off-by: Lidong Chen >--- > kernel/sched/core.c | 25 ++++--------------------- > 1 file changed, 4 insertions(+), 21 deletions(-) > >diff --git a/kernel/sched/core.c b/kernel/sched/core.c >index b803e1b..4a5a964 100644 >--- a/kernel/sched/core.c >+++ b/kernel/sched/core.c >@@ -2318,15 +2318,12 @@ void wake_up_new_task(struct task_struct *p) > > #ifdef CONFIG_PREEMPT_NOTIFIERS > >-static struct static_key preempt_notifier_key = STATIC_KEY_INIT_FALSE; >- > /** > * preempt_notifier_register - tell me when current is being preempted & rescheduled > * @notifier: notifier struct to register > */ > void preempt_notifier_register(struct preempt_notifier *notifier) > { >- static_key_slow_inc(&preempt_notifier_key); > hlist_add_head(¬ifier->link, ¤t->preempt_notifiers); > } > EXPORT_SYMBOL_GPL(preempt_notifier_register); >@@ -2340,11 +2337,10 @@ EXPORT_SYMBOL_GPL(preempt_notifier_register); > void preempt_notifier_unregister(struct preempt_notifier *notifier) > { > hlist_del(¬ifier->link); >- static_key_slow_dec(&preempt_notifier_key); > } > EXPORT_SYMBOL_GPL(preempt_notifier_unregister); > >-static void __fire_sched_in_preempt_notifiers(struct task_struct *curr) >+static void fire_sched_in_preempt_notifiers(struct task_struct *curr) > { > struct preempt_notifier *notifier; > >@@ -2352,14 +2348,9 @@ static void __fire_sched_in_preempt_notifiers(struct task_struct *curr) > notifier->ops->sched_in(notifier, raw_smp_processor_id()); > } > >-static __always_inline void fire_sched_in_preempt_notifiers(struct task_struct *curr) >-{ >- if (static_key_false(&preempt_notifier_key)) >- __fire_sched_in_preempt_notifiers(curr); >-} > > static void >-__fire_sched_out_preempt_notifiers(struct task_struct *curr, >+fire_sched_out_preempt_notifiers(struct task_struct *curr, > struct task_struct *next) > { > struct preempt_notifier *notifier; >@@ -2368,21 +2359,13 @@ __fire_sched_out_preempt_notifiers(struct task_struct *curr, > notifier->ops->sched_out(notifier, next); > } > >-static __always_inline void >-fire_sched_out_preempt_notifiers(struct task_struct *curr, >- struct task_struct *next) >-{ >- if (static_key_false(&preempt_notifier_key)) >- __fire_sched_out_preempt_notifiers(curr, next); >-} >- > #else /* !CONFIG_PREEMPT_NOTIFIERS */ > >-static inline void fire_sched_in_preempt_notifiers(struct task_struct *curr) >+static void fire_sched_in_preempt_notifiers(struct task_struct *curr) > { > } > >-static inline void >+static void > fire_sched_out_preempt_notifiers(struct task_struct *curr, > struct task_struct *next) > { >-- >2.1.0 > ????{.n?+???????+%?????ݶ??w??{.n?+????{??G?????{ay?ʇڙ?,j??f???h?????????z_??(?階?ݢj"???m??????G????????????&???~???iO???z??v?^?m???? ????????I?