From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753845AbbJaNSd (ORCPT ); Sat, 31 Oct 2015 09:18:33 -0400 Received: from mail-db3on0069.outbound.protection.outlook.com ([157.55.234.69]:34659 "EHLO emea01-db3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753809AbbJaNSb (ORCPT ); Sat, 31 Oct 2015 09:18:31 -0400 Authentication-Results: spf=fail (sender IP is 212.179.42.66) smtp.mailfrom=ezchip.com; infradead.org; dkim=none (message not signed) header.d=none;infradead.org; dmarc=none action=none header.from=ezchip.com; From: Noam Camus To: CC: , , , , Noam Camus , Peter Zijlstra Subject: [PATCH v1 05/20] ARC: rwlock: disable interrupts in !LLSC variant Date: Sat, 31 Oct 2015 15:15:12 +0200 Message-ID: <1446297327-16298-6-git-send-email-noamc@ezchip.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1446297327-16298-1-git-send-email-noamc@ezchip.com> References: <1446297327-16298-1-git-send-email-noamc@ezchip.com> MIME-Version: 1.0 Content-Type: text/plain X-TM-AS-Product-Ver: SMEX-11.0.0.1191-8.000.1202-21912.007 X-TM-AS-Result: No-0.101000-8.000000-31 X-TM-AS-User-Approved-Sender: No X-TM-AS-User-Blocked-Sender: No X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1;DB3FFO11FD033;1:LXErRb7IreG57zmWegIYurN0EQZux2NfJD2c8jNEKXFXbncRwGKA/p61HkNre8X9B4XeIZivdZBhGFxyL4Eo2GT/C66y1PU6QnTURSn7NXDtkAAka4LaI1oXGi2gFQvR4sk+plmuHWFF2HCPQcumWOq9uuhidVkdQLDXhThHg2QNPk3BJb7IIJYIdXuyZ7zpDhKVDpmeOHMTvZ34oWhMzS67hy3etHtdbRIlzKvP8CSfXV4/1yJGi+cnY6YQcipeA6UVDYUjR6N7jPDcmusgTcI3N99MOzIZgKv/gzsdPPvNmTk46F9mSfpOxwc14b68cFmMwiGFdblZjVIhJOiXGM90NUQzSNm/yafgoqWjcjNRfc4WMsnLO5br2rqAxNncbvgNveEGzTt6plerqBsVcA== X-Forefront-Antispam-Report: CIP:212.179.42.66;CTRY:IL;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(2980300002)(1109001)(1110001)(339900001)(199003)(189002)(377424004)(33646002)(19580405001)(11100500001)(2950100001)(85426001)(50986999)(5003940100001)(76176999)(49486002)(19580395003)(104016004)(87936001)(47776003)(6806005)(189998001)(48376002)(5007970100001)(229853001)(105606002)(5008740100001)(110136002)(2351001)(106466001)(77096005)(5001970100001)(86362001)(36756003)(50226001)(50466002)(92566002);DIR:OUT;SFP:1101;SCL:1;SRVR:VI1PR02MB1149;H:ezex10.ezchip.com;FPR:;SPF:Fail;PTR:ezmail.ezchip.com;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;VI1PR02MB1149;2:8Bre6eZmX70fCfOh8V3d0FepRNMWz52igKegkn7ImhBEvB07JW1sSnJFvSeZR0gSZfSxkMAL816xyi3JKuMOEUDJqu71GZvzrcxH571k0Xo15O/zE8PtPMkk8UcxDmVkXyIaIaydK0fNFl4VTcuq8RfPcp74VIJrtL0vZjuE0dc=;3:2LzQ6c7p5broqBmDCVwbFdgFj3UkNoSHCigcsYYpb+9TdG8sbsZ47NVDh/CUbhDac9TexbTAnDcHejt4Sa9xh0Txsr7bKo/DbrNx8D3VfPFdClqB9xVChZZUm6RL9Spsrei+hCotXVChCcCxni8W1QTyweROTMFmDO4GwxPkOLd6ZrJi+vN44AxbcFHnsS/FPUEIdnha94Ie+xJeddjsZweXOuX6S+Bdv8Mej0/a/lI=;25:UGegzyrvmuBGCSGZ/hHYieZcDJoOZy68eygEY7eeoAWKNW5Wm6rrn52HnYg9H/+oowuAUSPgUDSk2mt7HQk01O0Ii8GPjbpCBVUW4I1phafdxp4RSom2VYQu6H+jcBmDjkOVVJhvO33WC4cjIgxJzFCn+xML/yznTx50rsmOOPRZ+ffGbXOZRrexvhj0+g46UfY971MEnVT3DakDx41iE3WRwZr6fiEEs5rX5lRyy+FZTseQeyoCvzvjHrptSQdX62+eU4aZuH+f21XwhYJ7YQ==;20:kVj7iVHMhVi/MRwNKeaHzRzDizIRrNv9/s/LhSEFRPm+/pz5qeTZXaIbSlenfPlObzgiX2UT+N58Q+b+LtjtdZ2HEwyr5iJ4SHFCw45k7EnrMmMqnu1lsEUknEOpyQCuMbc2qXJlNCh1pX+XGWygI5+nemayTxUtnbQuUkgbaHc= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:VI1PR02MB1149; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(121898900299872); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(5005006)(520078)(8121501046)(10201501046)(3002001);SRVR:VI1PR02MB1149;BCL:0;PCL:0;RULEID:;SRVR:VI1PR02MB1149; X-Microsoft-Exchange-Diagnostics: 1;VI1PR02MB1149;4:sNcZwiikW31JYCZspX1Z7P4k3KOLbqtUTkCJ+mOZIUigQG0bVJglaz02cwN9r/wBG6RO/hdNvKcTeTz2/k16+nZzzMUaxCXnYEh6LIMdGwWMWdJ977DWZFWq4tocIBLqTMBpHbkm4wzMEUOIfgWC106Q1xxymzvjLrJhf2bxw44gQzPywlUSA73l8J8rcsFnZmLarohBuuUTzUHxz2ETXhoKAQxSrQ4SrQBdUl8e/pz1vjOmeq9FOaNfJN8nC8qYg5A97xMKiwBhxAHXXherNbhBEFedj/VB+zu9GE7JgF8YnqadASausi/X8hIO5oTAw4IjNBw5VE/uYEkU5l4i7LfkMqNKEkJMpaRPk4Q7U83gVzo6n0Qge+WBdGsG/fMO X-Forefront-PRVS: 07467C4D33 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;VI1PR02MB1149;23:/b+Etr74oS4FLBBf7VnjV4NbVeg6/AfvvaoUkC4Mg?= =?us-ascii?Q?9O01twxBfYhLMZ0k2dZbqb0l70Wbbj0NUzuE7Va39hx0gYiZeXLiv8BeKuei?= =?us-ascii?Q?717LpoWp/0DpgphCDrryhSYAbg7HGX1ZrNoq+1aVVqlC4/GdcinLKTDleTPf?= =?us-ascii?Q?V6X5WAJrPtSPOEA2sTbb828IZxQr0aIY3W3Z1NAlHQIgYvTYYtVhnsFZR2W0?= =?us-ascii?Q?f7TfUBii/5+XS3bZFWWRlUXwDKeK/rgl4w9Lf6TMFK69CQh6Lr5cQeFhAIpe?= =?us-ascii?Q?euF29MiJTi5rhCprXfPZZRy7zKk/nYSTc0z2kFWiN2aRgrcLyynKNEvwMXLm?= =?us-ascii?Q?mrH3SZfrjintEsewifwVKnkwVqZyANS/GiD6iTP8oesycOXZ7FQDolauMoUj?= =?us-ascii?Q?oK5WC77EhGNBEQFf79E1W9jU7akU3f9F8N1a2L0wQe1YDil5e8yqBeCPd5V+?= =?us-ascii?Q?df44bBy4lsuU/JVCVhtMUwTKhpzoCClBiD36pIEuyXfMT5lie/+ygD0dpUgi?= =?us-ascii?Q?aoQnmy1YQJaxds0viU8hv/6uwqZckfrfFUqhOnZ/NztaxDScvNiZMDjoE6Wi?= =?us-ascii?Q?U+6nj8VSkZIX8kRJD48TO2UhbZUOfBvaQf8uktX/X6ve+eI0520kea8eUUVz?= =?us-ascii?Q?bMeI1Bh4ClGfI6+lr8TDh4ExZ23bQbSdxLhDhextHlELAQGGss3ruA1wAp33?= =?us-ascii?Q?qQPLR4sDmOFLZo5Plv25niMUtiXgz8/ARA8Fhua5koOXJOcGW4oOjGvNb7RC?= =?us-ascii?Q?SUByHn54zqRIxwUddqqTUSqjNPyS/m36Beubah1FVyzetFKwLdAQzJRxawIl?= =?us-ascii?Q?Tcuj/c9zjopHZJFVBMi5VUaShZGO+Yf9mzqwa4KRSiqhjaZHN+VpV+ap6LyH?= =?us-ascii?Q?Pv1ZbFXIsXlsvl+fTETh9x/hIWCDaGLJgpQRIpirdFcP/Kw5slbftXM19v10?= =?us-ascii?Q?wSpsm8wfGvlUtcS1Dhjr3yFksdFatvnfphFX/VpeOqqzLA0b5pkfXJxRtfhs?= =?us-ascii?Q?XxiMcbD0XrVD2NMvHcH9vxF2bfzJl7qpNJdFA4bgsEXSQ=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;VI1PR02MB1149;5:41dnf3NLHBySMBFauRkJSlvzwayZ4Z6sVq51jCxUSzO065fFKWT6KOyGS2TRgIAqqyJiBZhdHwFoLtE+vcljFAdyKF4ANk2mFjSGRTRrG7pEOrLxBt2T9atrQJVWW54pJt7iD2usYhXGYTdEFuiYCQ==;24:4jKj3QoF5SX12r6ndgJMWO6/Yzf6RJASYDociK49K05SyFev6J3UqNVu4afMrjAvyv61r9fVvdft3PJbwS47bciG8PztxQMKWdQGDW4KAkU=;20:3yjMh7tAtr+MA8B3gFfNLhyNHDdpy2/5iwi/5yUuoiNdkmwryUhljlTDNBzN1qYo9IGIz5J00rCpoIpBUZfy1Q== SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: ezchip.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Oct 2015 13:18:27.2698 (UTC) X-MS-Exchange-CrossTenant-Id: 0fc16e0a-3cd3-4092-8b2f-0a42cff122c3 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=0fc16e0a-3cd3-4092-8b2f-0a42cff122c3;Ip=[212.179.42.66];Helo=[ezex10.ezchip.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR02MB1149 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Noam Camus If we hold rw->lock_mutex and interrupt occures we may end up spinning on it for ever during softirq. Below you may see an example for interrupt we get while nl_table_lock is holding its rw->lock_mutex and we spinned on it for ever. The concept for the fix was taken from SPARC. [2015-05-12 19:16:12] Stack Trace: [2015-05-12 19:16:12] arc_unwind_core+0xb8/0x11c [2015-05-12 19:16:12] dump_stack+0x68/0xac [2015-05-12 19:16:12] _raw_read_lock+0xa8/0xac [2015-05-12 19:16:12] netlink_broadcast_filtered+0x56/0x35c [2015-05-12 19:16:12] nlmsg_notify+0x42/0xa4 [2015-05-12 19:16:13] neigh_update+0x1fe/0x44c [2015-05-12 19:16:13] neigh_event_ns+0x40/0xa4 [2015-05-12 19:16:13] arp_process+0x46e/0x5a8 [2015-05-12 19:16:13] __netif_receive_skb_core+0x358/0x500 [2015-05-12 19:16:13] process_backlog+0x92/0x154 [2015-05-12 19:16:13] net_rx_action+0xb8/0x188 [2015-05-12 19:16:13] __do_softirq+0xda/0x1d8 [2015-05-12 19:16:14] irq_exit+0x8a/0x8c [2015-05-12 19:16:14] arch_do_IRQ+0x6c/0xa8 [2015-05-12 19:16:14] handle_interrupt_level1+0xe4/0xf0 Signed-off-by: Noam Camus Cc: Peter Zijlstra --- arch/arc/include/asm/spinlock.h | 14 ++++++++++++++ 1 files changed, 14 insertions(+), 0 deletions(-) diff --git a/arch/arc/include/asm/spinlock.h b/arch/arc/include/asm/spinlock.h index db8c59d..800e7c4 100644 --- a/arch/arc/include/asm/spinlock.h +++ b/arch/arc/include/asm/spinlock.h @@ -610,7 +610,9 @@ static inline void arch_spin_unlock(arch_spinlock_t *lock) static inline int arch_read_trylock(arch_rwlock_t *rw) { int ret = 0; + unsigned long flags; + local_irq_save(flags); arch_spin_lock(&(rw->lock_mutex)); /* @@ -623,6 +625,7 @@ static inline int arch_read_trylock(arch_rwlock_t *rw) } arch_spin_unlock(&(rw->lock_mutex)); + local_irq_restore(flags); smp_mb(); return ret; @@ -632,7 +635,9 @@ static inline int arch_read_trylock(arch_rwlock_t *rw) static inline int arch_write_trylock(arch_rwlock_t *rw) { int ret = 0; + unsigned long flags; + local_irq_save(flags); arch_spin_lock(&(rw->lock_mutex)); /* @@ -646,6 +651,7 @@ static inline int arch_write_trylock(arch_rwlock_t *rw) ret = 1; } arch_spin_unlock(&(rw->lock_mutex)); + local_irq_restore(flags); return ret; } @@ -664,16 +670,24 @@ static inline void arch_write_lock(arch_rwlock_t *rw) static inline void arch_read_unlock(arch_rwlock_t *rw) { + unsigned long flags; + + local_irq_save(flags); arch_spin_lock(&(rw->lock_mutex)); rw->counter++; arch_spin_unlock(&(rw->lock_mutex)); + local_irq_restore(flags); } static inline void arch_write_unlock(arch_rwlock_t *rw) { + unsigned long flags; + + local_irq_save(flags); arch_spin_lock(&(rw->lock_mutex)); rw->counter = __ARCH_RW_LOCK_UNLOCKED__; arch_spin_unlock(&(rw->lock_mutex)); + local_irq_restore(flags); } #endif -- 1.7.1