Return-Path: <linux-rt-users-owner@vger.kernel.org> Received: from rack3slot8.osadl.org (rack3slot8.osadl.org [127.0.0.1]) by rack3slot8.osadl.org (8.13.8/8.13.8/CE-2010120801) with ESMTP id r1DGJ6Mu001310 for <ce@thllin.ceag.ch>; Wed, 13 Feb 2013 17:19:07 +0100 Received: from toro.web-alm.net (uucp@localhost) by rack3slot8.osadl.org (8.13.8/8.13.8/Submit) with bsmtp id r1DGJ6OG001308 for ce@mailgate.computer-experts.de; Wed, 13 Feb 2013 17:19:06 +0100 Received: from www.osadl.org (www.osadl.org [62.245.132.105]) by toro.web-alm.net (8.12.11.20060308/8.12.11/Web-Alm-2003112001) with ESMTP id r1DGIDL6009809 for <ce@ceag.ch>; Wed, 13 Feb 2013 17:18:13 +0100 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by www.osadl.org (8.13.8/8.13.8/OSADL-2007092901) with ESMTP id r1DGHrtC025570 for <Carsten.Emde@osadl.org>; Wed, 13 Feb 2013 17:18:07 +0100 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934344Ab3BMQRu (ORCPT <rfc822;Carsten.Emde@osadl.org>); Wed, 13 Feb 2013 11:17:50 -0500 Received: from www.linutronix.de ([62.245.132.108]:59718 "EHLO Galois.linutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934265Ab3BMQNP (ORCPT <rfc822;linux-rt-users@vger.kernel.org>); Wed, 13 Feb 2013 11:13:15 -0500 Received: from localhost ([127.0.0.1] helo=localhost.localdomain) by Galois.linutronix.de with esmtp (Exim 4.72) (envelope-from <bigeasy@linutronix.de>) id 1U5exO-0005iT-4f; Wed, 13 Feb 2013 17:13:14 +0100 From: Sebastian Andrzej Siewior <bigeasy@linutronix.de> To: Steven Rostedt <rostedt@goodmis.org> Cc: linux-kernel@vger.kernel.org, linux-rt-users@vger.kernel.org, Carsten Emde <C.Emde@osadl.org>, Thomas Gleixner <tglx@linutronix.de>, Sebastian Andrzej Siewior <bigeasy@linutronix.de> Subject: [PATCH 04/16] rcu: rcutiny: Prevent RCU stall Date: Wed, 13 Feb 2013 17:11:59 +0100 Message-Id: <1360771932-27150-5-git-send-email-bigeasy@linutronix.de> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1360771932-27150-1-git-send-email-bigeasy@linutronix.de> References: <1360771932-27150-1-git-send-email-bigeasy@linutronix.de> X-Linutronix-Spam-Score: -1.0 X-Linutronix-Spam-Level: - X-Linutronix-Spam-Status: No , -1.0 points, 5.0 required, ALL_TRUSTED=-1,SHORTCIRCUIT=-0.0001 Sender: linux-rt-users-owner@vger.kernel.org Precedence: bulk List-ID: <linux-rt-users.vger.kernel.org> X-Mailing-List: linux-rt-users@vger.kernel.org X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_LOW autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on rack3slot8.osadl.org X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on rack3slot8.osadl.org X-Virus-Status: Clean From: Thomas Gleixner <tglx@linutronix.de> rcu_read_unlock_special() checks in_serving_softirq() and leaves early when true. On RT this is obviously wrong as softirq processing context can be preempted and therefor such a task can be on the gp_tasks list. Leaving early here will leave the task on the list and therefor block RCU processing forever. This cannot happen on mainline because softirq processing context cannot be preempted and therefor this can never happen at all. In fact this check looks quite questionable in general. Neither irq context nor softirq processing context in mainline can ever be preempted in mainline so the special unlock case should not ever be invoked in such context. Now the only explanation might be a rcu_read_unlock() being interrupted and therefor leave the rcu nest count at 0 before the special unlock bit has been cleared. That looks fragile. At least it's missing a big fat comment. Paul ???? See mainline commits: ec433f0c5 and 8762705a for further enlightment. Reported-by: Kristian Lehmann <krleit00@hs-esslingen.de> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> [bigeasy@linutronix: different in-irq check] Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> --- kernel/rcutiny_plugin.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) Index: linux-3.2.38-rt57-nodebug/kernel/rcutiny_plugin.h =================================================================== @ linux-3.2.38-rt57-nodebug/kernel/rcutiny_plugin.h:556 @ static void rcu_read_unlock_special(stru rcu_preempt_cpu_qs(); /* Hardware IRQ handlers cannot block. */ - if (in_irq()) { + if (preempt_count() & (HARDIRQ_MASK | SOFTIRQ_OFFSET)) { local_irq_restore(flags); return; }