Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752069AbdIUJAW (ORCPT ); Thu, 21 Sep 2017 05:00:22 -0400 Received: from mail-by2nam01on0061.outbound.protection.outlook.com ([104.47.34.61]:60128 "EHLO NAM01-BY2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751840AbdIUJAT (ORCPT ); Thu, 21 Sep 2017 05:00:19 -0400 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Ganapatrao.Kulkarni@cavium.com; From: Ganapatrao Kulkarni To: linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, iommu@lists.linux-foundation.org, linux-mm@kvack.org Cc: Will.Deacon@arm.com, robin.murphy@arm.com, lorenzo.pieralisi@arm.com, hanjun.guo@linaro.org, joro@8bytes.org, vbabka@suse.cz, akpm@linux-foundation.org, mhocko@suse.com, Tomasz.Nowicki@cavium.com, Robert.Richter@cavium.com, jnair@caviumnetworks.com, gklkml16@gmail.com Subject: [PATCH 3/4] iommu/arm-smmu-v3: Use NUMA memory allocations for stream tables and comamnd queues Date: Thu, 21 Sep 2017 14:29:21 +0530 Message-Id: <20170921085922.11659-4-ganapatrao.kulkarni@cavium.com> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20170921085922.11659-1-ganapatrao.kulkarni@cavium.com> References: <20170921085922.11659-1-ganapatrao.kulkarni@cavium.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [111.93.218.67] X-ClientProxiedBy: PN1PR01CA0111.INDPRD01.PROD.OUTLOOK.COM (10.174.144.27) To CO2PR07MB2566.namprd07.prod.outlook.com (10.166.201.17) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: f0d51af7-7bb2-4a0a-2aef-08d500cf2de9 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(2017030254152)(300000503095)(300135400095)(2017052603199)(201703131423075)(201703031133081)(201702281549075)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095);SRVR:CO2PR07MB2566; X-Microsoft-Exchange-Diagnostics: 1;CO2PR07MB2566;3:EjWkxVnUankAL9dFttJjmeg/77mqxw+0WzHYI6ehSQfKwD4hNKv02OTJtYx1gZo4f9kSn0JIX8X+UeMLkZWNuJ5sONp2L6E+KVZgHFnkWacN8JOIEjvhPAASbJY4drCjobi9Qbdhq3iRjP3Zs+zZeSCAkOdDQVx55lzSRkv4IR7/YzEuCWXCoyXcsGjurNEXhb5RTV2KDHD7qPM62fmsbnzvbLsV16EnysA0ePxPNiiB2GGXrtjattcURAXm1MzJ;25:53USQXOloE/HkcQ4kfDLa87vfwTXPXP86jP3JlEVlcL/0CwGZCYxkjEFY1Cc5HGF+6QDUwVMmbtnCJ3BCtx2+gIY8Wj4XHkT7K9rXosX4IyL4KnOSNqkV7dAXq69EaLceciLL0hByRcPKvBP8Qw0CxJFhDijKaTi0w8S0jpsKjOj9AmZFQW5pOV0zZ3xjDIOOEqNMXkUG8NMZ+lfhSoKabD4e0CMDOjri0YiA/xw6kCt9vmw+hePegi2pKQ34MBI66+earN+NgXoChsg1OLJfvYhjI353dIHbU+vS8QJxm1NnasxkjGemC6Iu2B02JAOESy01T+4A3yN1VMb64Z2SQ==;31:TpOvA2FLYjKDjUxIldLFKarAs+xvOnKlvq76xQYdRiNSXX5yQiSb3u6g60DExCrQD5q8S/FOVt3v57DBWIjV8zxGxYnq5jwCKJdoLVwhQ7DbjNyMZXW92sNkkM220VMNL9DyMa2qzf8/IPrxItK2qNetdAfh+v16bnZNNk9ybEFIJAQOvMsn32VcaeUqMPuWB6hyQqEohg0IMIOvBmIgWyKnAN0DY2U1e1DZ01gZU+Y= X-MS-TrafficTypeDiagnostic: CO2PR07MB2566: X-Microsoft-Exchange-Diagnostics: 1;CO2PR07MB2566;20:AaMwY5jj+axSibXSbloLPTBeCnWJhdawGO0HYqvtBNwzdLOQGxw5F7ITcDnVnmbgLJdtCM4L6vJSZRZMnTNwOS3psAStgbNuFCvHqlTlx0lbH3HkLZBAoAT8zeheBpOEq56SFrw10Kicm3uZEqSd5UqbfwOyj5H2rt4k+/RzhIHj4278/zSa7JIziGLROLjvk6Adpi9CjWcr66XVamkYHfzCT4dVZy1tw8KXcfTwRCKN0scp3Huxgnz84N2uy+7Rodikw9XqEj2JeMxmkIx7M5Qhlihe18dM68bTBgl1yN2Vvol4Q08YJL6bMd2E782R7ZrFrFv6IQ0EfQZsT/ENvc9YowCGWIign5MNxFM+nUVXK0C+gifrDffm1B9Ae7E+J3O5gfLSDR5hxCbZLPJqIVyEnkLvZT8UEVWQzdxYJv8UNAkkuN6V3SEGDfzjDAhQj8NGk+y0eqLgWj8yJd039kv+4L12p30zpl2NNsxQ7h+1fO8/yYxRra6WoPh/ZMnP;4:DEuYCx0/svxfWKMIBvZvpT2BOf30LwwBlulmokIAnfdlM2XtvLUa38VgHvvfUDQZ1Z8ixPV/sPCniorfp1Zz1QFSprUlQKaaRZjj5rlsvYgJ5S0u9W2SQSNudIfo3eyptO443Cfhm90kaF05iSL+5QZTWrL5xdBnP7wSS5o0eArhw4shTjYpGFna97frZ4gA6xZSR5n8W+rozvb+oQm5/vFMcUWBAit9z2D939uxRlDCYqatcF2Sru9Ix/cMAjHgdDDZuh3+kHuMNa5bRCOtXtX9iOmXKgalwO11Go20BUE= X-Exchange-Antispam-Report-Test: UriScan:(788757137089); X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(5005006)(8121501046)(3002001)(10201501046)(100000703101)(100105400095)(93006095)(93001095)(6041248)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123558100)(20161123555025)(20161123562025)(20161123560025)(20161123564025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:CO2PR07MB2566;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:CO2PR07MB2566; X-Forefront-PRVS: 04371797A5 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(6009001)(376002)(346002)(199003)(189002)(1076002)(3846002)(6116002)(6486002)(316002)(68736007)(6506006)(16526017)(25786009)(97736004)(305945005)(7736002)(36756003)(6666003)(16586007)(5003940100001)(4326008)(2950100002)(5009440100003)(86362001)(53936002)(76176999)(50986999)(189998001)(39060400002)(66066001)(50226002)(478600001)(8936002)(106356001)(105586002)(33646002)(7416002)(2906002)(47776003)(8676002)(101416001)(81166006)(6512007)(81156014)(5660300001)(72206003)(50466002)(230783001)(48376002)(414714003)(473944003);DIR:OUT;SFP:1101;SCL:1;SRVR:CO2PR07MB2566;H:mypc.cavium.com.com;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;CO2PR07MB2566;23:+bBhMbmEwzX1pi27sopyYOxIy1foFxnKwPLuMPCWr?= =?us-ascii?Q?WFY7akUeVLw0CdErjxaSdjoQ2zKlu+Yzcy4fkJzsk5PuzRpqbcsJyhcbUG29?= =?us-ascii?Q?pRs0MsX8tTbXpI8zhG1m37Nhlk6eYAsv2Un69nSsnAFbamHfbqc3l3/jp98Y?= =?us-ascii?Q?+OJsyMDQDfdN7bWXOlc1lDqDlQ2k13Zh3sPCZHEmJ0qKARyHReUXNqr1tCYh?= =?us-ascii?Q?+ZocDzjuie4eMgrKAEh3/ld5iN/5Aha/6TWGG6rI0riR7Q4mwt3OA/RPkQdm?= =?us-ascii?Q?d7BiLt8fgzy1VwDYqXJ4VMQQEY3Wi9RortLm8fVwoqzMxC+HBmKoRzceBawf?= =?us-ascii?Q?6iw9oPWVtnf62FPpfewxuvN04LiU0f5s3RLSifX+QUIvAzwOTQ6aVmnmDWFB?= =?us-ascii?Q?flXwWhwRu6+kTMYslwu4H3uhRcdb+sgXpIOD95DHMtsyjrm9q+wZiira6ACE?= =?us-ascii?Q?2LIiLLMpZL8Hb5LQxjFUvmDhkJ2nah1cg+8Ocg2Yg0OnPbKOwU5Qh3FG4MRV?= =?us-ascii?Q?2OWtZGEzsoOFXUd7a3eSw2kwi+WU2umqjASQ1fd/eZ39Di1AraP9VVbw0jMX?= =?us-ascii?Q?rFaOkTRpM+Wo3Ro2fq+x7ks5VOHaaQ8zlMmLn5IUyhrxd8gXrbmgkfl4V11R?= =?us-ascii?Q?Cmpxsywwl5yQCnierCc7kaWvkG6gzdMGrwmkbeQXw5J+g/porn4IU0nGJv3G?= =?us-ascii?Q?lijLw3XcDDQAJG6/eaoDeVgmp/XC5cfUMBrQObAbZ7/smNxZ3e1luYf5kWni?= =?us-ascii?Q?LTTFokxS5EPyBDY5DLoTqcpkdDXhHHSCKK7Cs8hnkmKMiehYFSIn2fgbyG38?= =?us-ascii?Q?3UKpQD5RCe+NEVayOIfUpmQggS3X9AwGnIaWW02bF7+/Ac+8J5a+L/coEYLX?= =?us-ascii?Q?1YhcciSKvJlrZ4I6IaTvahGchsLB7FBZlUUfpCbPTKv4lJU5Z4xNZetvjoqG?= =?us-ascii?Q?D2V3llz59YHOZe5f+vljNOND7yO/5GUEM80wPtc0EvpBnSZmoPwRa2CqVXvp?= =?us-ascii?Q?dEFwZfufQmaHL4TVqYMKzOGCI5tjee/t+LKF9roPMsb0YBE1fHfUYy49fVTY?= =?us-ascii?Q?8twDsytTJ2rddL7wfsfLbL3lkgvk6T9+ewP9TJYpCQsvfHLbvWwxTw7Zenwb?= =?us-ascii?Q?VQFuZT59Hw70O7r3gdM1jgT+EeUU5zF6wGk46Z0ZnSuHJQGgBoDkJcoG5Jx2?= =?us-ascii?Q?dGIBpR2vDeidM/msiy+NF3qZt8UosRkWspjb6EUi1sK9YIDoCbs3YL5Yg=3D?= =?us-ascii?Q?=3D?= X-Microsoft-Exchange-Diagnostics: 1;CO2PR07MB2566;6:NCG+d3jIOT0c3s8qEdEbHK17ZWP/M+JATeSqzMR4xmROVv2/tDiyLz8isFNYJJjIvp3zZx3cvilzFj4am5YGZZYQZPP2qTfqnz7eo7EzkW/6tKTIZ9WDtM5iGo8R1DBp2D6b/wpH2rAxlt2Aexr476qCEPMusWQ7bRlwwxFUPfQlKtKpAshgZEBqU/d4ySj4C8byMrYr+raU978X9sYCwU0bNkX8C8qpAOm5WKwpiQriuZeoHm3X8HdC/9qb3OnxajEqMOx8qQxELgtam7tyBM56u2isU3m2cGLgEtCVGdVHHGwjiMTYrpPMPhI6cU+NGztJNXlaqy9ErFlHBsHoBA==;5:2YnQzhFCIeu9hzn2zHU7h8CsVuvA5nHWBAUVhK3cMfKUBxDPYmf6DEoz/DR7bmQLdZKmjhmXNQNCrJY9KxuiftGSldFxvIjqdlUz3RcWUtsJ+zLnVjASO2hmz2/vxaG/60O2WtdpayNWXMMTNQes8Q==;24:bQz9bTm6rrmFqrz96ermeR94+5D+2PCg1mSXZPxwAGhphL7p+vQbuYuUsPzkntBu2JnfjtbVfILgWgibdOGq8keQwQd0zKxiEH9lwAkYsdc=;7:LfnSug312W9OF1vmh2lFQ+JflSd/I2x9whPvGeV2nkEhTvhL03ntbDq2S/W15sMKDVeo5Br+C7aaIT10cZteS+fAdKTwour+jwJuXifMxZjoynZEfPDkkVkekmkOoXjh9z6Vw1DhO0WI4UxeDCzsi6rvuhl9T8Bv4BhkU4xGvW+pvUXVo9flYpJpKU/xXCORHkn6PhtQBwtdLysE+G4ADtUkNwdwpbIcVkLaxnemts8= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: cavium.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Sep 2017 09:00:12.3309 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 711e4ccf-2e9b-4bcf-a551-4094005b6194 X-MS-Exchange-Transport-CrossTenantHeadersStamped: CO2PR07MB2566 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4398 Lines: 123 Introduce smmu_alloc_coherent and smmu_free_coherent functions to allocate/free dma coherent memory from NUMA node associated with SMMU. Replace all calls of dmam_alloc_coherent with smmu_alloc_coherent for SMMU stream tables and command queues. Signed-off-by: Ganapatrao Kulkarni --- drivers/iommu/arm-smmu-v3.c | 57 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 51 insertions(+), 6 deletions(-) diff --git a/drivers/iommu/arm-smmu-v3.c b/drivers/iommu/arm-smmu-v3.c index e67ba6c..bc4ba1f 100644 --- a/drivers/iommu/arm-smmu-v3.c +++ b/drivers/iommu/arm-smmu-v3.c @@ -1158,6 +1158,50 @@ static void arm_smmu_init_bypass_stes(u64 *strtab, unsigned int nent) } } +static void *smmu_alloc_coherent(struct arm_smmu_device *smmu, size_t size, + dma_addr_t *dma_handle, gfp_t gfp) +{ + struct device *dev = smmu->dev; + void *pages; + dma_addr_t dma; + int numa_node = dev_to_node(dev); + + pages = alloc_pages_exact_nid(numa_node, size, gfp | __GFP_ZERO); + if (!pages) + return NULL; + + if (!(smmu->features & ARM_SMMU_FEAT_COHERENCY)) { + dma = dma_map_single(dev, pages, size, DMA_TO_DEVICE); + if (dma_mapping_error(dev, dma)) + goto out_free; + /* + * We depend on the SMMU being able to work with any physical + * address directly, so if the DMA layer suggests otherwise by + * translating or truncating them, that bodes very badly... + */ + if (dma != virt_to_phys(pages)) + goto out_unmap; + } + + *dma_handle = (dma_addr_t)virt_to_phys(pages); + return pages; + +out_unmap: + dev_err(dev, "Cannot accommodate DMA translation for IOMMU page tables\n"); + dma_unmap_single(dev, dma, size, DMA_TO_DEVICE); +out_free: + free_pages_exact(pages, size); + return NULL; +} + +static void smmu_free_coherent(struct arm_smmu_device *smmu, size_t size, + void *pages, dma_addr_t dma_handle) +{ + if (!(smmu->features & ARM_SMMU_FEAT_COHERENCY)) + dma_unmap_single(smmu->dev, dma_handle, size, DMA_TO_DEVICE); + free_pages_exact(pages, size); +} + static int arm_smmu_init_l2_strtab(struct arm_smmu_device *smmu, u32 sid) { size_t size; @@ -1172,7 +1216,7 @@ static int arm_smmu_init_l2_strtab(struct arm_smmu_device *smmu, u32 sid) strtab = &cfg->strtab[(sid >> STRTAB_SPLIT) * STRTAB_L1_DESC_DWORDS]; desc->span = STRTAB_SPLIT + 1; - desc->l2ptr = dmam_alloc_coherent(smmu->dev, size, &desc->l2ptr_dma, + desc->l2ptr = smmu_alloc_coherent(smmu, size, &desc->l2ptr_dma, GFP_KERNEL | __GFP_ZERO); if (!desc->l2ptr) { dev_err(smmu->dev, @@ -1487,7 +1531,7 @@ static void arm_smmu_domain_free(struct iommu_domain *domain) struct arm_smmu_s1_cfg *cfg = &smmu_domain->s1_cfg; if (cfg->cdptr) { - dmam_free_coherent(smmu_domain->smmu->dev, + smmu_free_coherent(smmu, CTXDESC_CD_DWORDS << 3, cfg->cdptr, cfg->cdptr_dma); @@ -1515,7 +1559,7 @@ static int arm_smmu_domain_finalise_s1(struct arm_smmu_domain *smmu_domain, if (asid < 0) return asid; - cfg->cdptr = dmam_alloc_coherent(smmu->dev, CTXDESC_CD_DWORDS << 3, + cfg->cdptr = smmu_alloc_coherent(smmu, CTXDESC_CD_DWORDS << 3, &cfg->cdptr_dma, GFP_KERNEL | __GFP_ZERO); if (!cfg->cdptr) { @@ -1984,7 +2028,7 @@ static int arm_smmu_init_one_queue(struct arm_smmu_device *smmu, { size_t qsz = ((1 << q->max_n_shift) * dwords) << 3; - q->base = dmam_alloc_coherent(smmu->dev, qsz, &q->base_dma, GFP_KERNEL); + q->base = smmu_alloc_coherent(smmu, qsz, &q->base_dma, GFP_KERNEL); if (!q->base) { dev_err(smmu->dev, "failed to allocate queue (0x%zx bytes)\n", qsz); @@ -2069,7 +2113,7 @@ static int arm_smmu_init_strtab_2lvl(struct arm_smmu_device *smmu) size, smmu->sid_bits); l1size = cfg->num_l1_ents * (STRTAB_L1_DESC_DWORDS << 3); - strtab = dmam_alloc_coherent(smmu->dev, l1size, &cfg->strtab_dma, + strtab = smmu_alloc_coherent(smmu, l1size, &cfg->strtab_dma, GFP_KERNEL | __GFP_ZERO); if (!strtab) { dev_err(smmu->dev, @@ -2097,8 +2141,9 @@ static int arm_smmu_init_strtab_linear(struct arm_smmu_device *smmu) u32 size; struct arm_smmu_strtab_cfg *cfg = &smmu->strtab_cfg; + size = (1 << smmu->sid_bits) * (STRTAB_STE_DWORDS << 3); - strtab = dmam_alloc_coherent(smmu->dev, size, &cfg->strtab_dma, + strtab = smmu_alloc_coherent(smmu, size, &cfg->strtab_dma, GFP_KERNEL | __GFP_ZERO); if (!strtab) { dev_err(smmu->dev, -- 2.9.4