From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933138AbcJTHXv (ORCPT ); Thu, 20 Oct 2016 03:23:51 -0400 Received: from mailout3.w1.samsung.com ([210.118.77.13]:21928 "EHLO mailout3.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751350AbcJTHXi (ORCPT ); Thu, 20 Oct 2016 03:23:38 -0400 X-AuditID: cbfec7f2-f79556d000002c42-b5-580870f78d88 From: Marek Szyprowski To: linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, iommu@lists.linux-foundation.org, linux-samsung-soc@vger.kernel.org Cc: Marek Szyprowski , Joerg Roedel , Inki Dae , Kukjin Kim , Krzysztof Kozlowski , Bartlomiej Zolnierkiewicz , "Rafael J. Wysocki" , Mark Brown , "Luis R. Rodriguez" , Greg Kroah-Hartman , Tomeu Vizoso , Lukas Wunner , Kevin Hilman , Tobias Jakobi , Tomasz Figa Subject: [PATCH v5 5/7] iommu/exynos: Rework and fix internal locking Date: Thu, 20 Oct 2016 09:22:51 +0200 Message-id: <1476948173-21093-6-git-send-email-m.szyprowski@samsung.com> X-Mailer: git-send-email 1.9.1 In-reply-to: <1476948173-21093-1-git-send-email-m.szyprowski@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAAzVSa0hTYRju3Tln57icnTaxDyuJRf3oYlkSH3ZHpdOPyD+R9KdGHpw0neyo aGC4rKnr4trUVl6SUoN5K5MxV2ZN2TJN84b2Y15SSwxJUokwrNyxf8/zvs/zvC8vL0MoHlGh TFJKGq9PUWtVUhnp8Pzq2fszlYnf3+lQ4ue2RgoXT0xJce6TRim2jJlJXNl2GBeUPqNx4eQ3 Ak+/mJTg3t5/dMBVJsULdzoA23pfS/DM1824vsNH4xHzNODurn4KG2vnKWx3/QZ8t75fekLJ Tb2tkHBOXxVwLQ99NNdkL5BybeV1NGcdeQrciofmmofySO5usx24haYwzpbnoOLWX5AdSeC1 SRm8ft+xSzJNnUed2h6S6f1TTuSAVWmCAAaxkWi2pJYScQj6ONooNYGMUbDVgByjLkokC4CM nWbyv2Nx7L1EbNQAav3SQIskR4L6G0r8KikbgUxzJn9WMGsAtJhf5bcQ7GcSGQ2PwQQMo2Rj kaF426qBZHcgg8VGrpblLIesHdHitDDU6bH69wtgT6OXdXeI1RjELtHI3FNKreoRuxU1vSFE fQwarFpa21SJZr3NtIi3oAHrrbV6IaDrN3eL2AaoZ04u4sOo3dvnn0WwQcjiuE+I8XKUb1SI Eg7Vdz8AEZ9E48tda+cqA+Rs9dBm2FIJ6+wQzKcLyYm8cDBcUCcL6SmJ4Zd1yU3w7226Vrw/ nLD0LsoNLAOqQLmmh45XUOoMISvZDYghVMFyj5aJV8gT1FlXeb3uoj5dywtu2MyQqk3yV5WD 5xVsojqNv8Lzqbz+f1fCBITmwIe+dsPQGffNPnjlKsXOEwe+/zzniNqzMa46t6yoRbMhr9oY fbRovlDQQVFQq26i/trseKalwJ22Evp7dCm7WuvLj2tYjqg4ZEPHb5zV22X3Bj3ZNU637jbl C/xkccVu5xcqcvrPtpUPx8GNGd/Oe8pTMDVcIDDHlyPfxuhUpKBRR+wi9IL6L3NntFgyAwAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrPIsWRmVeSWpSXmKPExsVy+t/xK7qXCjgiDLbdMbPYOGM9q8XUh0/Y LJoXr2ezmHR/AovFgv3WFp2zN7Bb9D9+zWzxdPNjJovz54Hcy7vmsFl87j3CaDHj/D4mixfP pS3WHrnLbnFjwlNGizOnL7FatK3+wGqxatcfRou+tZfYHIQ9nhycx+Sx4+4SRo+ds+6ye2xa 1cnmsX/uGnaPyTeWM3r8O8buseVqO4tH35ZVjB6fN8l5zGjfxhrAHeVmk5GamJJapJCal5yf kpmXbqsUGuKma6GkkJeYm2qrFKHrGxKkpFCWmFMK5BkZoAEH5wD3YCV9uwS3jDXHEgsOi1Uc /z+XuYFxsnAXIyeHhICJxJf7p5ggbDGJC/fWs3UxcnEICSxhlFjQco8Fwmliknj7fCc7SBWb gKFE19susCoRgUZGiW1bJ7KDOMwCz1gkFvzYBpTh4BAWcJVonKoA0sAioCrROGkGC0iYV8BD YvIRZ4htchInj01mBbE5BTwldq/pZQaxhYBK3m9cxziBkXcBI8MqRpHU0uLc9NxiI73ixNzi 0rx0veT83E2MwMjbduznlh2MXe+CDzEKcDAq8fBmnGOPEGJNLCuuzD3EKMHBrCTCeyyHI0KI NyWxsiq1KD++qDQntfgQoynQTROZpUST84FJIa8k3tDE0NzS0MjYwsLcyEhJnHfqhyvhQgLp iSWp2ampBalFMH1MHJxSDYzT/ksVHdkRq2C2Loc9Pv/SxHuXG05kCm1Jq/y68WhRRM3MGzGu F4IeVbe97P+5pHO20YMfrJPWrHIuLeqWz46L6rWbJfM5u//p4uQ9GUmJl8TPyL5wsTfave1x rMhaV4ml69hznLbOPT5/+5b6GZ+eXXr3/oius9MFnZbjDG9Fdh8tDF1jumq5EktxRqKhFnNR cSIAg8svB9ICAAA= X-MTR: 20000000000000000@CPGS X-CMS-MailID: 20161020072334eucas1p2a159a25a2875611eff208381ebdb2e84 X-Msg-Generator: CA X-Sender-IP: 182.198.249.180 X-Local-Sender: =?UTF-8?B?TWFyZWsgU3p5cHJvd3NraRtTUlBPTC1LZXJuZWwgKFRQKRs=?= =?UTF-8?B?7IK87ISx7KCE7J6QG1NlbmlvciBTb2Z0d2FyZSBFbmdpbmVlcg==?= X-Global-Sender: =?UTF-8?B?TWFyZWsgU3p5cHJvd3NraRtTUlBPTC1LZXJuZWwgKFRQKRtT?= =?UTF-8?B?YW1zdW5nIEVsZWN0cm9uaWNzG1NlbmlvciBTb2Z0d2FyZSBFbmdpbmVlcg==?= X-Sender-Code: =?UTF-8?B?QzEwG0VIURtDMTBDRDAyQ0QwMjczOTI=?= CMS-TYPE: 201P X-HopCount: 7 X-CMS-RootMailID: 20161020072334eucas1p2a159a25a2875611eff208381ebdb2e84 X-RootMTR: 20161020072334eucas1p2a159a25a2875611eff208381ebdb2e84 References: <1476948173-21093-1-git-send-email-m.szyprowski@samsung.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch reworks locking in the exynos_iommu_attach/detach_device functions to ensure that all entries of the sysmmu_drvdata and exynos_iommu_owner structure are updated under the respective spinlocks, while runtime pm functions are called without any spinlocks held. Signed-off-by: Marek Szyprowski --- drivers/iommu/exynos-iommu.c | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/drivers/iommu/exynos-iommu.c b/drivers/iommu/exynos-iommu.c index 28e570b53672..a959443e6f33 100644 --- a/drivers/iommu/exynos-iommu.c +++ b/drivers/iommu/exynos-iommu.c @@ -731,10 +731,12 @@ static void exynos_iommu_domain_free(struct iommu_domain *iommu_domain) spin_lock_irqsave(&domain->lock, flags); list_for_each_entry_safe(data, next, &domain->clients, domain_node) { + spin_lock(&data->lock); __sysmmu_disable(data); data->pgtable = 0; data->domain = NULL; list_del_init(&data->domain_node); + spin_unlock(&data->lock); } spin_unlock_irqrestore(&domain->lock, flags); @@ -772,17 +774,22 @@ static void exynos_iommu_detach_device(struct iommu_domain *iommu_domain, if (!has_sysmmu(dev) || owner->domain != iommu_domain) return; + list_for_each_entry(data, &owner->controllers, owner_node) { + __sysmmu_disable(data); + pm_runtime_put(data->sysmmu); + } + spin_lock_irqsave(&domain->lock, flags); list_for_each_entry_safe(data, next, &domain->clients, domain_node) { - __sysmmu_disable(data); + spin_lock(&data->lock); data->pgtable = 0; data->domain = NULL; list_del_init(&data->domain_node); - pm_runtime_put(data->sysmmu); + spin_unlock(&data->lock); } + owner->domain = NULL; spin_unlock_irqrestore(&domain->lock, flags); - owner->domain = NULL; dev_dbg(dev, "%s: Detached IOMMU with pgtable %pa\n", __func__, &pagetable); @@ -803,18 +810,22 @@ static int exynos_iommu_attach_device(struct iommu_domain *iommu_domain, if (owner->domain) exynos_iommu_detach_device(owner->domain, dev); + spin_lock_irqsave(&domain->lock, flags); list_for_each_entry(data, &owner->controllers, owner_node) { + spin_lock(&data->lock); data->pgtable = pagetable; data->domain = domain; + list_add_tail(&data->domain_node, &domain->clients); + spin_unlock(&data->lock); + } + owner->domain = iommu_domain; + spin_unlock_irqrestore(&domain->lock, flags); + + list_for_each_entry(data, &owner->controllers, owner_node) { pm_runtime_get_sync(data->sysmmu); __sysmmu_enable(data); - - spin_lock_irqsave(&domain->lock, flags); - list_add_tail(&data->domain_node, &domain->clients); - spin_unlock_irqrestore(&domain->lock, flags); } - owner->domain = iommu_domain; dev_dbg(dev, "%s: Attached IOMMU with pgtable %pa\n", __func__, &pagetable); -- 1.9.1