From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756325AbbLANQJ (ORCPT ); Tue, 1 Dec 2015 08:16:09 -0500 Received: from mail-am1on0087.outbound.protection.outlook.com ([157.56.112.87]:8761 "EHLO emea01-am1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752541AbbLANGa (ORCPT ); Tue, 1 Dec 2015 08:06:30 -0500 Authentication-Results: spf=fail (sender IP is 212.179.42.66) smtp.mailfrom=ezchip.com; vger.kernel.org; dkim=none (message not signed) header.d=none;vger.kernel.org; dmarc=none action=none header.from=ezchip.com; From: Noam Camus To: CC: , , Noam Camus Subject: [PATCH v3 06/18] ARC: rwlock: disable interrupts in !LLSC variant Date: Tue, 1 Dec 2015 15:02:53 +0200 Message-ID: <1448974985-11487-7-git-send-email-noamc@ezchip.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1448974985-11487-1-git-send-email-noamc@ezchip.com> References: <1448974985-11487-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-21974.007 X-TM-AS-Result: No-1.316400-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;AM1FFO11FD010;1:4J/O4b0NLRp6b2Mogr+GUYwKQ35P1bIhyTbprjAKGJgqvGcVnt8kFel9DvnJcNgdRPQz0BAQA45KoSpmOItUhWHGXJMe6RcMptISgMEnKT8AWphqeCgfowixo1a8tcwhkN7fomkk8DOz4YoN7svgfPl/l15QWu4/Hkk9Z4nKsS7H8A/HFysMKJthuTmI9rFlzTVhHBqlKYn7WVch5B4FMSm5DqF3oAi0Faht9BR+xN440HeP/4CfyC0NWLZJMYaggrzOi58yQsfjAUS0XO87l6a5rZOds9UO/QlKeG5YzJS5OZz0bzFXprLJTYwHIuwVK3ZzXC+2BVR/LLBNfZZpItY7OMdx0NLrP8HoCBfFSvlccF7UQ0QaqTwg47GwQnXSB9ITIX+Oyxv7eP/NYGKj4Q5qA++O59P9pwLAf34W/Ec= X-Forefront-Antispam-Report: CIP:212.179.42.66;CTRY:IL;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(2980300002)(1109001)(1110001)(339900001)(189002)(199003)(377424004)(5008740100001)(107886002)(2351001)(110136002)(50986999)(48376002)(1096002)(106466001)(77096005)(189998001)(105606002)(86362001)(19580395003)(33646002)(50226001)(229853001)(5001970100001)(19580405001)(50466002)(6806005)(586003)(92566002)(104016004)(87936001)(4001430100002)(85426001)(76176999)(2950100001)(1220700001)(47776003)(36756003)(49486002)(11100500001)(5003940100001);DIR:OUT;SFP:1101;SCL:1;SRVR:AMSPR02MB182;H:ezex10.ezchip.com;FPR:;SPF:Fail;PTR:ezmail.ezchip.com;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;AMSPR02MB182;2:j1P3Mv8Sr+T/Aty2eOisFOBLz7xFCYPc+taxNvza2jzn5rlUZnpCLcQ7rvbmHRUp8+RTvL2fDA2RvuwJKCuyzJyanUfEwXN2mN/e0uqkqhfgDu9DVePd7z0UgDIplo585dkrb/Pneacd1/59j8duxw==;3:HKpZdad0t4zuVGFAYZEvQTjM389bosZi/8vrGVtqWz3GdukMp2Xxp1Banj6gs8Qng3WyQ0l1gGZK3tHUxC3s5KbFPcHZX1Rdi0xXUSrdbjalMpOdDhs/ffW+LsL26kNkJkh5w6dVnZ/5aCsH6WrDE3t8q1/a5SDVKfoYLp78gFUL5IU9vXmYt/sSlcq2rOB4wtIUcGoLO6WP54dLjaZJFX5jA/X4K+vliA0t0FywXB4=;25:WwbMmJkjZxt1ah7t7LUeMLKTnCKjb2bQpL8vUCdDxmBl26YGiW9Z9KUxnE7gL9x0q+/t16tv0QCsI/ImFld2IH9IKjruuwWXMszjTEZ6Xj4SPcWhSMJ598nYdVEk0OjTtfsWKt+ATQ1q1DiVOv6ofCgLWX6YhMtuKH2gZGFevsl+93+368WhE8AUZT9voBlUV4djTXHk1+tdInd1BQ+fSsmOn36OxJwKPvMiHRucPTZmnbhFA3LmA9P3433NrhiH9A62cwHkDCFbKh9ntc3yuw==;20:0nZ0uSotMRbLlrDC01V52iuhqHKIUSCUq8M0eOqJR58TxjOqzGEes05P/JTnSuYF0mGNQIPj+9QmEFMGrnr/8k7RhoCAQHye+Kh5GOeNX5Q2LVb6Yv27BD/hMrMEV8ydAefGYw6ySDOGWms6Sk+HpJQBwo5Aw2vh31G9xjg50vg= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:AMSPR02MB182; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(121898900299872); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(8121501046)(520078)(5005006)(3002001)(10201501046);SRVR:AMSPR02MB182;BCL:0;PCL:0;RULEID:;SRVR:AMSPR02MB182; X-Microsoft-Exchange-Diagnostics: 1;AMSPR02MB182;4:gl2cgqBp5b/GR3hlf4HbQq6B0+uU9cI1pOGKpljmua7c2MDX3HOMT37Dam+kPrzc36E3UgKCvuKEBJw+WLpVNg6o5GugBwsmbq5Drnu1SDuYJ2B4RsytN1a6Xeu44rhkYIhoglQxXWRLbi3bJXv+VJUnslC890Px2bNrKHwySsPb6Tl1GcId49W1ZSvrQbt6Cispgy0Qa8EcTqPq1m1t97RObxReW3N6G2p8TUpQLIc20c4HsFzkzOnnB1ZDzy0VocR9dQ6Cg73AmZ4fymcMAWefk3sDTHJK3DWAR3JUrZ9l+BFjjZqra+8B0R/E2XWqwB16pnV7HTbg4z+KRQKlG4XtAFndaB0lS8aA/7VD+FCSkG6lMZO1gchVmm2B9DscxBRGd6d84FFBij9JeFusOG66pHc2XyxrKYiEoGUDmZA5t1OvXdWtAxNe2uh7LvQ+ X-Forefront-PRVS: 07778E4001 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;AMSPR02MB182;23:WLbzuYnyr/me08uvEhvndjNgDQdJ+K0m+Wq2fWG8lj?= =?us-ascii?Q?f/0DLi8c6NzpDUrIgwpc3welV+TPEjdqRNEMN9usos63LxYptAbT+j9mpU45?= =?us-ascii?Q?7wo7K+lvZa/N1D86GuRPpzvgX5W129bkZPtRHoQzRl+YR35qcWMytx6VyP4S?= =?us-ascii?Q?OE06+KT17ACTj3Hvrl/VwkZaqIQ9NGvLL+lrZYSvaeGpMaRdjyitrXPfoc65?= =?us-ascii?Q?QBVkx7EiouDZAuU2Kn1xtN659s819ZETy6BMPkLT9ic4aK4PE4XI9UZpR+Zd?= =?us-ascii?Q?dKfrdnbJIxixOTVxv0RjwProYXfgqNEM3Ek0n7bMwvNf1+Bm/TWF7pXR76gn?= =?us-ascii?Q?olWtBsB5WcfOrySslepT1Dh2qBeRqSIJuDnY1+m0kMV5GMiDQgir+No+Rw0F?= =?us-ascii?Q?0ApMpuqAY4uqb8+cN4SpjEjfcSLJQ4V+zBy8hJbo8xHpvVAx1FkXKOT8JQMB?= =?us-ascii?Q?Jv6ntcY3phqeCqiabGI1F3v2Q7MDQM8Mv6VGz+OQkAdenggaV8bU4UA72Doj?= =?us-ascii?Q?15twxHfM2fo10/ZjuEBAAxWQ4n2zEHJ7O1tWmhNs9LyvD2ZJ260Gca9nUesx?= =?us-ascii?Q?HBKMwSiGx/gFFwsbl0YPjOOXnGYNyA9cxwkffqx5cVxYkRhTqPP/MZs6+R91?= =?us-ascii?Q?FM/uae28E7QDT8y7LtcNox+RorHr68/v9MLXuKcYJCe/evaZvVm8VhRKJYb7?= =?us-ascii?Q?mqnYJdZWhb+R1hXJUn1H19S108gZKA5Jz18z6HSaaqn79c4ScwUJpmhx8UdN?= =?us-ascii?Q?dt0VdL3tRxABUh9J+yKOWnksMCfNtycIxvXZt19gS7y+gkAm2mofWJRGHks6?= =?us-ascii?Q?9S9ZyYdC47RKlVYODubQfTcWQaDsze1XpmXPFZPjkMw/131fgb3Dq0iVWyrZ?= =?us-ascii?Q?+uu30IIgZpw75CswgAeeHTaSUxY5cVntKmZz5RHFoaE/6y2a/i8XZWpiO2VJ?= =?us-ascii?Q?EySsyf4ssW/1oLg6aAkTLmLc/mGd32+6v53OeWaFnxGdCksAxi2aXslavXFW?= =?us-ascii?Q?wa3Md7y924cVLVVaGq3mdKu6eeuoYHpdb+XlZSUrCsCP4sheqcy7KxBIUVPi?= =?us-ascii?Q?ig3DzejcNJl8ZkT3Cn90AVlq8xTukiO8gkIwvcFv7IhJeh05YHnWjqWwVT69?= =?us-ascii?Q?3MBvEXkfM=3D?= X-Microsoft-Exchange-Diagnostics: 1;AMSPR02MB182;5:wizsLkL9OpCen+ywNHSkW6wEqJvEsZs890N+kjhlEUoYxztx+sy2t5HRTnbQ5KO740v8Rykvl9vY4Wmh76D9ycYFhFBTtoyfCXPAwv6BXFWkD1/kL33yHZNYkl2LzPaJ02BSgfEHudLGoYG8YzceQQ==;24:B3gEIhm5UghR2Q8P/d5KbXhqhnMKqNV8IL6cbq7yie8KPFJz9GukcN3Hm2SPVipWkL3taSl+oWcg69OD97vkxpAeX7fhX5kr7ay4UovXa2I= SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: ezchip.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Dec 2015 13:06:27.2964 (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: AMSPR02MB182 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Noam Camus If we hold rwlock and interrupt occures we may end up spinning on it for ever during softirq. Note that this lock is an internal lock and since the lock is free to be used from any context, the lock needs to be IRQ-safe. 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 Acked-by: 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 From mboxrd@z Thu Jan 1 00:00:00 1970 From: noamc@ezchip.com (Noam Camus) Date: Tue, 1 Dec 2015 15:02:53 +0200 Subject: [PATCH v3 06/18] ARC: rwlock: disable interrupts in !LLSC variant In-Reply-To: <1448974985-11487-1-git-send-email-noamc@ezchip.com> References: <1448974985-11487-1-git-send-email-noamc@ezchip.com> List-ID: Message-ID: <1448974985-11487-7-git-send-email-noamc@ezchip.com> To: linux-snps-arc@lists.infradead.org From: Noam Camus If we hold rwlock and interrupt occures we may end up spinning on it for ever during softirq. Note that this lock is an internal lock and since the lock is free to be used from any context, the lock needs to be IRQ-safe. 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 Acked-by: 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