From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753576AbcHPNgg (ORCPT ); Tue, 16 Aug 2016 09:36:36 -0400 Received: from mailout4.w1.samsung.com ([210.118.77.14]:23628 "EHLO mailout4.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750803AbcHPNgc (ORCPT ); Tue, 16 Aug 2016 09:36:32 -0400 X-AuditID: cbfec7f4-f796c6d000001486-67-57b316dbde9f From: Krzysztof Kozlowski To: Michael Turquette , Stephen Boyd , Stephen Warren , Lee Jones , Eric Anholt , Florian Fainelli , Ray Jui , Scott Branden , bcm-kernel-feedback-list@broadcom.com, Krzysztof Kozlowski , Sylwester Nawrocki , Tomasz Figa , Kukjin Kim , Russell King , Mark Brown , linux-clk@vger.kernel.org, linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-samsung-soc@vger.kernel.org, linux-i2c@vger.kernel.org, alsa-devel@alsa-project.org Cc: Marek Szyprowski , Charles Keepax , Javier Martinez Canillas , a.hajda@samsung.com, Bartlomiej Zolnierkiewicz Subject: [RFC 00/17] clk: Add per-controller locks to fix deadlocks Date: Tue, 16 Aug 2016 15:34:57 +0200 Message-id: <1471354514-24224-1-git-send-email-k.kozlowski@samsung.com> X-Mailer: git-send-email 1.9.1 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFupikeLIzCtJLcpLzFFi42I5/e/4Vd3bYpvDDTb+MbW4te4cq8WVi4eY LDbOWM9qsbb3KIvF1IdP2Cz+TbnBbnGg8TKjxa93R9gt3rxdw2Tx+oWhRf/j18wWO9oWslhs enyN1eJjzz1Wi46/XxgtLu+aw2Yx8fYGdosZ5/cxWRyaupfRYu2Ru+wWF0+5WjyduZnN4vCb dlaLH2e6WSzerX7CaPHqYBuLxapdfxgdpD02fG5i82h6f4zN4/K1i8we72+0snvMun8WyO3r ZfLYOesuu8emVZ1sHpuX1Hu8nPibzWNLP1Cob8sqRo/Pm+Q8Ns4NDeCL4rJJSc3JLEst0rdL 4MpYcfQma0G/YsWf5bNYGhivS3QxcnJICJhIXJp0mBXCFpO4cG89WxcjF4eQwFJGie27HzFB OI1MEnvfXWICqWITMJbYvHwJWJWIwCo2iYV/14JVMQu8ZJQ4e/IXkMPBISzgLLHpgjlIA4uA qsSVr0dZQGxeAXeJSW/3sUCsk5M4eWwy6wRG7gWMDKsYRVNLkwuKk9JzDfWKE3OLS/PS9ZLz czcxQmLoyw7GxcesDjEKcDAq8fCeZNgULsSaWFZcmXuIUYKDWUmE97Do5nAh3pTEyqrUovz4 otKc1OJDjNIcLErivHN3vQ8REkhPLEnNTk0tSC2CyTJxcEo1MGbo8YSWzgif0Mc6T2+Sv8nB RZ8tg3puOBmYcYj3Hdn1f6GtZkn4g66I+Qaz3BLS3IIdzjrurptkebokf/kTK4mTMazX9E6v Xy/7cW7gKsG3GhZ3Ohsd+85Xumg1KNe++rNv2oJe5WXt5gcnLVTJ3/hy04zo5NtHHvwSYuOS 0K4Wf7eqU//iXiWW4oxEQy3mouJEADNZm66dAgAA Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi, RFC, please, do not apply, maybe except patch #1 which is harmless. Introduction ============ The patchset brings new entity: clock controller representing a hardware block. The clock controller comes with its own prepare lock which is used then in many places. The idea is to fix the deadlock mentioned in commit 10ff4c5239a1 ("i2c: exynos5: Fix possible ABBA deadlock by keeping I2C clock prepared") and commit 34e81ad5f0b6 ("i2c: s3c2410: fix ABBA deadlock by keeping clock prepared"). Disclaimer ========== Request for comments, so: 1. Only exynos_defconfig builds, 2. A lot of FIXME/TODO note still, 3. Checkpatch not run, lines not aligned, 4. Other (non-exynos) drivers not converted, 5. Probably not yet bisectable, 6. Locking became quite complex. The previous one lock was simple. Inefficient and dead-lock prone but simple. Because of clock hierarchy spanning through controllers, the new locking became quite complicated. I don't like it but... Details ======= In Exynos-based boards case the deadlock occurs between clock's prepare_lock and regmap-i2c's lock: CPU #0: CPU #1: lock(regmap) s2mps11-clk: clk_prepare_lock() i2c-exynos: clk_prepare_lock() - wait lock(regmap) - wait The clk_prepare_lock() on both CPUs come from different clock drivers and components: 1. I2C clock is part of SoC block and is required by i2c-s3c2410/i2c-exynos5 driver, 2. S2MPS11 clock is separate device, however driver uses I2C regmap. The deadlock was reported by lockdep (always) and was happening in 20% of boots of Odroid XU3 with multi_v7 defconfig. Workaround for deadlock was implemented by removing prepare/unprepare calls from I2C transfers. However these are just workarounds... which after applying this patch can be reverted. Additionally Marek Szyprowski's work on domains/clocks/pinctrl exposed the deadlock again in different configuration. Comments as usual are welcomed. Best regards, Krzysztof Krzysztof Kozlowski (17): clk: bcm2835: Rename clk_register to avoid name conflict clk: Add clock controller to fine-grain the prepare lock clk: s2mps11: Switch to new clock controller API clk: samsung: Allocate a clock controller in context clk: fixed-rate: Switch to new clock controller API clk: gate: Switch to new clock controller API clk: mux: Switch to new clock controller API clk: fixed-factor: Switch to new clock controller API clk: divider: Switch to new clock controller API clk: composite: Switch to new clock controller API clk: gpio: Switch to new clock controller API ASoC: samsung: Switch to new clock controller API clk: samsung: audss: samsung: Switch to new clock controller API clk: samsung: clkout: samsung: Switch to new clock controller API clk: Use per-controller locking Revert "i2c: exynos5: Fix possible ABBA deadlock by keeping I2C clock prepared" Revert "i2c: s3c2410: fix ABBA deadlock by keeping clock prepared" drivers/clk/bcm/clk-bcm2835.c | 8 +- drivers/clk/clk-composite.c | 8 +- drivers/clk/clk-divider.c | 10 +- drivers/clk/clk-fixed-factor.c | 11 +- drivers/clk/clk-fixed-rate.c | 28 +- drivers/clk/clk-fractional-divider.c | 5 +- drivers/clk/clk-gate.c | 8 +- drivers/clk/clk-gpio.c | 29 +- drivers/clk/clk-mux.c | 32 ++- drivers/clk/clk-s2mps11.c | 10 +- drivers/clk/clk.c | 456 +++++++++++++++++++++++++++----- drivers/clk/samsung/clk-exynos-audss.c | 30 ++- drivers/clk/samsung/clk-exynos-clkout.c | 11 +- drivers/clk/samsung/clk.c | 25 +- drivers/clk/samsung/clk.h | 1 + drivers/i2c/busses/i2c-exynos5.c | 24 +- drivers/i2c/busses/i2c-s3c2410.c | 23 +- include/linux/clk-provider.h | 88 ++++-- include/linux/clk.h | 1 + sound/soc/samsung/i2s.c | 13 +- 20 files changed, 612 insertions(+), 209 deletions(-) -- 1.9.1