From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.0 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,UNWANTED_LANGUAGE_BODY,URIBL_BLOCKED, USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 46619C3A5A1 for ; Fri, 23 Aug 2019 02:47:08 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id B241321897 for ; Fri, 23 Aug 2019 02:47:07 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="ICb5O5NS" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B241321897 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=huawei.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=QUwxB/BKOrgPvw0fnVhwhKk51oCfD1dSp4RJs6gUi54=; b=ICb5O5NStIm1uR T88X1XDxXaQ8cmpy7CURhfr0UV/AKr/0Go+vrJ+lpDxGTL92PqYRtltIu4H9im/MgWIN2g2kJTM+g skkUdL/mcLwHHuS/IZbGlmZVYnzc+bz+fc86Hdh5QweycrnzkDKaPg49gpL5Rq/p+m5hbnT6HFIa+ 05H08BFIQE1j9rnTHYTeSMVlvRxWamyJ8N4I80DmLH7LYXZv+ySysvXs6LPkE2G+Ns0zH9wg2Omha QlWgNeRg6rOwSDkbnLv/Z/Rzn4gj5u2C7GddtyOPexn+8OswTw1SkLgRgTxFMSbEVhEFDsszNG0sE 737PEBTg1zGGLHnGjnXQ==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92 #3 (Red Hat Linux)) id 1i0zbX-0006Ea-7w; Fri, 23 Aug 2019 02:47:07 +0000 Received: from szxga06-in.huawei.com ([45.249.212.32] helo=huawei.com) by bombadil.infradead.org with esmtps (Exim 4.92 #3 (Red Hat Linux)) id 1i0zbU-0006B3-15 for linux-arm-kernel@lists.infradead.org; Fri, 23 Aug 2019 02:47:05 +0000 Received: from DGGEMS401-HUB.china.huawei.com (unknown [172.30.72.59]) by Forcepoint Email with ESMTP id 1DF7C88E4DAE3FF3267F; Fri, 23 Aug 2019 10:46:55 +0800 (CST) Received: from HGHY4L002753561.china.huawei.com (10.133.215.186) by DGGEMS401-HUB.china.huawei.com (10.3.19.201) with Microsoft SMTP Server id 14.3.439.0; Fri, 23 Aug 2019 10:46:48 +0800 From: Zhen Lei To: Jean-Philippe Brucker , John Garry , Robin Murphy , Will Deacon , Joerg Roedel , iommu , linux-arm-kernel Subject: [PATCH v3 2/2] iommu/arm-smmu-v3: change the lock type of arm_smmu_domain.devices_lock Date: Fri, 23 Aug 2019 10:45:51 +0800 Message-ID: <20190823024551.24448-3-thunder.leizhen@huawei.com> X-Mailer: git-send-email 2.21.0.windows.1 In-Reply-To: <20190823024551.24448-1-thunder.leizhen@huawei.com> References: <20190823024551.24448-1-thunder.leizhen@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.133.215.186] X-CFilter-Loop: Reflected X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190822_194704_275271_4B4EDF01 X-CRM114-Status: GOOD ( 11.15 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Zhen Lei Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org A master add into or remove from smmu_domain->devices only happened in arm_smmu_attach_dev()/arm_smmu_detach_dev(), the frequency of these operations is very low. But we traverse smmu_domain->devices list in arm_smmu_atc_inv_domain() are frequent. So change the protection from spinlock to rwlock can improve concurrency, especially for the smmu domain without ATS masters. By the way, the cmdq has its own lock, so this change is safe. Here is the performance data tested on my board: Before: Jobs: 24 (f=24): [0.1% done] [9798M/0K /s] [2392K/0 iops] [09h:59m:13s] Jobs: 24 (f=24): [0.1% done] [9782M/0K /s] [2388K/0 iops] [09h:59m:12s] Jobs: 24 (f=24): [0.2% done] [9825M/0K /s] [2399K/0 iops] [09h:59m:11s] Jobs: 24 (f=24): [0.2% done] [9836M/0K /s] [2401K/0 iops] [09h:59m:10s] After: Jobs: 24 (f=24): [0.1% done] [10996M/0K /s] [2685K/0 iops] [09h:59m:13s] Jobs: 24 (f=24): [0.1% done] [10817M/0K /s] [2641K/0 iops] [09h:59m:12s] Jobs: 24 (f=24): [0.2% done] [11083M/0K /s] [2706K/0 iops] [09h:59m:11s] Jobs: 24 (f=24): [0.2% done] [10603M/0K /s] [2589K/0 iops] [09h:59m:10s] Signed-off-by: Zhen Lei Suggested-by: Will Deacon --- drivers/iommu/arm-smmu-v3.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/drivers/iommu/arm-smmu-v3.c b/drivers/iommu/arm-smmu-v3.c index e0dcc5d27291f8b..eded2e7a5a0c444 100644 --- a/drivers/iommu/arm-smmu-v3.c +++ b/drivers/iommu/arm-smmu-v3.c @@ -641,7 +641,7 @@ struct arm_smmu_domain { struct iommu_domain domain; struct list_head devices; - spinlock_t devices_lock; + rwlock_t devices_lock; }; struct arm_smmu_option_prop { @@ -1536,10 +1536,10 @@ static int arm_smmu_atc_inv_domain(struct arm_smmu_domain *smmu_domain, arm_smmu_atc_inv_to_cmd(ssid, iova, size, &cmd); - spin_lock_irqsave(&smmu_domain->devices_lock, flags); + read_lock_irqsave(&smmu_domain->devices_lock, flags); list_for_each_entry(master, &smmu_domain->devices, domain_head) ret |= arm_smmu_atc_inv_master(master, &cmd); - spin_unlock_irqrestore(&smmu_domain->devices_lock, flags); + read_unlock_irqrestore(&smmu_domain->devices_lock, flags); return ret ? -ETIMEDOUT : 0; } @@ -1648,7 +1648,7 @@ static struct iommu_domain *arm_smmu_domain_alloc(unsigned type) mutex_init(&smmu_domain->init_mutex); INIT_LIST_HEAD(&smmu_domain->devices); - spin_lock_init(&smmu_domain->devices_lock); + rwlock_init(&smmu_domain->devices_lock); return &smmu_domain->domain; } @@ -1911,9 +1911,9 @@ static void arm_smmu_detach_dev(struct arm_smmu_master *master) if (!smmu_domain) return; - spin_lock_irqsave(&smmu_domain->devices_lock, flags); + write_lock_irqsave(&smmu_domain->devices_lock, flags); list_del(&master->domain_head); - spin_unlock_irqrestore(&smmu_domain->devices_lock, flags); + write_unlock_irqrestore(&smmu_domain->devices_lock, flags); master->domain = NULL; arm_smmu_install_ste_for_dev(master); @@ -1966,9 +1966,9 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) arm_smmu_install_ste_for_dev(master); - spin_lock_irqsave(&smmu_domain->devices_lock, flags); + write_lock_irqsave(&smmu_domain->devices_lock, flags); list_add(&master->domain_head, &smmu_domain->devices); - spin_unlock_irqrestore(&smmu_domain->devices_lock, flags); + write_unlock_irqrestore(&smmu_domain->devices_lock, flags); out_unlock: mutex_unlock(&smmu_domain->init_mutex); return ret; -- 1.8.3 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel