Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752358AbdIVQvR (ORCPT ); Fri, 22 Sep 2017 12:51:17 -0400 Received: from mail-bl2nam02on0061.outbound.protection.outlook.com ([104.47.38.61]:21118 "EHLO NAM02-BL2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751898AbdIVQvP (ORCPT ); Fri, 22 Sep 2017 12:51:15 -0400 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Tomasz.Nowicki@cavium.com; Subject: Re: [PATCH v5 3/6] iommu/iova: Extend rbtree node caching To: Tomasz Nowicki , Robin Murphy , joro@8bytes.org Cc: dwoods@mellanox.com, linux-kernel@vger.kernel.org, iommu@lists.linux-foundation.org References: <2c352944fb1d20ad4ef6778475006af81a270945.1506007392.git.robin.murphy@arm.com> <692b36cc-9bb0-51f9-a6f9-7d891f6ff78b@semihalf.com> From: tn Date: Fri, 22 Sep 2017 18:50:55 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.3.0 MIME-Version: 1.0 In-Reply-To: <692b36cc-9bb0-51f9-a6f9-7d891f6ff78b@semihalf.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-GB Content-Transfer-Encoding: 8bit X-Originating-IP: [12.108.191.226] X-ClientProxiedBy: VI1PR0102CA0017.eurprd01.prod.exchangelabs.com (2603:10a6:802::30) To SN4PR0701MB3661.namprd07.prod.outlook.com (2603:10b6:803:4d::15) Message-ID: X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 6eac5e25-8de2-42ba-65ca-08d501da21ec 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:SN4PR0701MB3661; X-Microsoft-Exchange-Diagnostics: 1;SN4PR0701MB3661;3:Qg2FBQ7hsKdOoMHbk+HX5Zhxf6MCNpAaSXhNk+WAeV9DnD0fq4KxBn/8pmXijSymSTnGnpqU9JOh1S99dWLA7SlJNzkgcFqDGz4nJIjCn2d8b8A3OTLYy+8ZUtwKHfCG1w6oE0q/9wwXdqng8Rm+yrEFaQSprLJaGOqTj4PWA34WZ1XiRKCxz3QnGLfzlkZ0ObIurNjTUZAWjgQ0zF4r3oacz0OnbIWicIwVbz6dz141Fs1L/OIwJxJfN0eYZBLL;25:LLulB7W8BqGm3Chy40TER6HE/mR0gfYolFgAa+9hnp1einq3msgrMcopBAw5jwE+yHQ19utfuGMbgfYDBVkENI9pAPFx/QAVrSvy3l0t7tPYilD1gTik1LvA0fbhEjExRYknYnQNlfJwqXcqU52EzmImaygSi0aVbpl3Aj5/l5m0rZvthKD28BEqwTC0WW9hbCa2Pa5CVD89fKQ0u9MuWWsJe+o0OUqUj/ed+bLM6+qyMdOVu1+ImNPBNrKlTgWP4yX4C2qN6MymXO/B55A2V9hixwb3XmOuu3FBm6n7ZmZw4XiUf4JnIXxZ/shJnV3mUQBYb6VDCLEhUVINQDHAew==;31:0dYbk9l5l/+2g3DSXFrEglnncSl9RmDOVKKiWfcF83Jc9jjJNR7II65mjg5/3EwxlXNffMnUjdVqTNlVQgh6rhL+pqEYAXdhU/YvYA+LGoLVvTaLeIh0Ek/URyUswOhGlaBGSOKxckUTQr84TFZyZ+LbskWHAv+BEPQPazbRWg/y1U1miFr0Uw3VE3pmvUsFDL0f5/0jMfxxST1640MMUWlhmWuJbrPcha2/J8hZv/o= X-MS-TrafficTypeDiagnostic: SN4PR0701MB3661: X-Microsoft-Exchange-Diagnostics: 1;SN4PR0701MB3661;20:PKzkw9nWRqe2MM2hJSpALieRxE4IiYMH+1bLFvnP7/CfPT/8Sp+IHpREYTRYGnmsD/G8NDD74YDct0/Wy0DupFunEOILHbmpjPEV+HFlCe/xAmzGgCOmpWHwsQoVH1znKslSYsfR1kqB898YrS5K3Ca8HAPjVfc8L75UJJ+4AUdSev0ELlFu9uO18O2Zzvnc5hko6IoWtACshAol55Vr3BjF8nfyjtcPrbwMDcsJu0ybCtW2S3o5+7ZQmt1vL0XYipOLEY+Y1MYkJY6+j2syA7FHXcNrGDGiDai2wQH2W3WAHHpFerViZ5BWkIeMMzfgoBcFGPJ1QS63pMJu01IcTX9TczfQbJYncgM2vwRHTVhVCZnH+39D12d5VIl3f5iOQokX/CYK9LXMMhyvKqSgSc5/vrQgERgEL4XBCBGLRSbQZ0TyL9js2yJaUaZmi8swQxzFMa7J+eHjR8Xw0k3LYWq2r4H5Ca+AG0Q92LzTNi1cfnBB/VtTuvgvjWaPnJrXZNKenc+DC48T9Udy9v1H91Rh4uNx6tY2lalhTzzdczM++jdSe+1O+sxjQwNDwIq6/onfW11Rah+SUJacPbvJpZQMpVmKnp6nudtDBmf5SGU= X-Exchange-Antispam-Report-Test: UriScan:(180628864354917)(50582790962513); 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)(93006095)(10201501046)(100000703101)(100105400095)(6041248)(20161123558100)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123560025)(20161123555025)(20161123562025)(20161123564025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:SN4PR0701MB3661;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:SN4PR0701MB3661; X-Microsoft-Exchange-Diagnostics: 1;SN4PR0701MB3661;4:C5GaEiTymkv92yczbqK+xTurT6mjZyfb28pPmZs0oPP7bzcnTB9zFcZXkW6VNZAgjxg1kWRrkLrBKFO7APAZ1z+rCdgc+JQhT9yQ9UrZcO8ytUOP0GaeQhwJcX/qzKVnuln+q/AjWf9TMSXWlulHMA5nUAG+vHSfpFqlOgIC4VcSc08RfZNEvdnzv8SFElOJeHKS8gUlZGaiReVVk04QqtlNOIkNQCEXrK133Ks48EllghMpjLTncGVhjq1JfNPh/FYa0tvDSBTOny0WMe4SPEilEBhLVuEJkTW3Rl8qr52kaAeReyxI7r26LwuE78qCaKRjKVXCX0vRyyo3/C3nQA== X-Forefront-PRVS: 0438F90F17 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(6049001)(6009001)(376002)(346002)(189002)(24454002)(199003)(76176999)(50986999)(106356001)(3846002)(2906002)(65826007)(105586002)(6116002)(117156002)(2950100002)(23676002)(74316002)(5660300001)(2870700001)(25786009)(42882006)(4326008)(86152003)(58126008)(66066001)(110136005)(47776003)(16526017)(6246003)(9686003)(54356999)(72206003)(83506001)(316002)(65806001)(53936002)(16576012)(65956001)(229853002)(6666003)(6486002)(97736004)(478600001)(33656002)(77096006)(81156014)(8676002)(50466002)(7736002)(101416001)(81166006)(64126003)(305945005)(8936002)(68736007)(53546010)(189998001)(65966003)(43062003);DIR:OUT;SFP:1101;SCL:1;SRVR:SN4PR0701MB3661;H:[192.168.2.100];FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtTTjRQUjA3MDFNQjM2NjE7MjM6ZGE4Uk9hMDQvd2hsa09rRlRhWVJoLzZW?= =?utf-8?B?VUhCdUYwZTRPZk44WXlqSWlQb3VmVWJPbkIrYnRkY2lPRmMzZTVJSFUvMVdJ?= =?utf-8?B?bmFyMXh2anUrK2FUUWpudjFmWGpESnNPaDVTZ2QxQXcwMEhnc0lvNDZHSnpL?= =?utf-8?B?cHU1SExwREs5L001czhKai9xR1FRVElnZTkwaUlwcmw0cTBRU3M0bXh6V2FN?= =?utf-8?B?TFBUWFBIbE1lR0YvU1FsQWU5Q2JRY1hjbXlvWFJFU0V4eG9NdXdYa2FsV2k2?= =?utf-8?B?QXlBMm5ST2thd1NLUjdlRVRDWXJ4b0MzTzlIL2treXdIbWczZXVUREZhakRZ?= =?utf-8?B?dlpHd2J0QWYwVnlTNVduQjFvTnBJZHN5VjZZaS9MYkxsYjN6emdlZmk0MUtE?= =?utf-8?B?Smt5bFdDRlZWeUNTdGxUNkdocUozZHNOL0pLdkU1c0haKzVyNWFTdkZLSVhK?= =?utf-8?B?Qy9QUnBPSWthZHFVV3N6WkRlOU16Rlh4bkpvQjJFNlhYWmJRT2cyQlJZWVBS?= =?utf-8?B?dTFYMHVqL1doY1QwK1gzdWhMazV1T3F5ZGk3eEg2VTUrVTFpUkJ1OGd3ZGw4?= =?utf-8?B?cXdtZDhpRCtPcmlIcktoWUlyNUlmeCtlWXg4WVJmNGVENmk2QmJ5UEs2RWkz?= =?utf-8?B?ZzljSTJ5ZnFuejZBeFRFVG50RjV6SWtRNWhwNlpNWVVoakcxeFBRYVZzb0Mx?= =?utf-8?B?NXQ3YmQ3Vyt6UWpjYmJYdEw5RG1qemtoQ1g5YlliSlFCODk2bVo5S1NvcVQw?= =?utf-8?B?S2NOcWIvOG1lcmhRSFRYYnFGa1V3R1Z0Y2JzNzdVRzR2Z0dLcmxUQlZqd3pr?= =?utf-8?B?N002dmRKWVo5eUNRVlhMc09yNDUzS2Q3anRSL29IbytsN2I3Q05QRlYzWW5L?= =?utf-8?B?aWoyeklzazc5Y2ovK3FsQjhjRW9MdVdJQUJhWUJRcDNkWFQrOCtnWksrRUxp?= =?utf-8?B?UFcxMXhJd21JbEdidnBGS2p4OFpIWkxDVW1wZ3ZzaXRwYzh5TUJEOVhaSTFn?= =?utf-8?B?dVZMUjJwZi9MME00VGhORkdBR1hJTmdxYnFTcDhiSzJBeFRYdHk3WXZiVkcz?= =?utf-8?B?Z3RidGZDYS9hcDRsdDZobDVDSDFoSjVTc1NDRlpiV0xpZVZWMmxieDl1NXFR?= =?utf-8?B?NTRFaGRvTitySXhmTVZRcks5eFg5N0IyeDJGZzdVb0krUCtYSzVreDM3b0d4?= =?utf-8?B?REdCaXROa3B5SVFBME1aVkcreVRYZmhQUlhwWHhUMC9BS0tVb2Z3UkI0OVla?= =?utf-8?B?Yk9JdklCYmJqZW45NUNjQmE4RU52ZGw5SFhObmFzTUlFbDBPYU5PUnJKT0pW?= =?utf-8?B?R2FPTU5XR0NjbUFTWVQvdjdFMjUyTlAvMUhWVGx4WmlhNmVVOWl3Q1h1ODU4?= =?utf-8?B?VVBxWVNWczdEUitVTFl1WXQyQUNBTlYyNVF6cm82TUxBRWF2VThqclhHQ0Rz?= =?utf-8?B?WEpvdW0rOVhGL1NkNEZPYll4TGpXbFdsSEJIQjV4QjY3THRoWmVXUmt6bWMr?= =?utf-8?B?N3ZXVVFucWJkczNKcHRsMjFXZU9sbmdQTHhGVHA1UmhLWGRteVdjY2pNOUxV?= =?utf-8?B?U2ZyYTJiVFVJZ2JmR2FjUHdJZ3BNYmZuZkw2ZHhMenBsclA4VGFtRjlBNjVr?= =?utf-8?B?TUhyeUhaSm1xTFJ0V0JBQVhic3M5QjRMQ2UrckFTYks2Vy9JOXREN203SS9w?= =?utf-8?B?Wi8rc1RzZm1zOXRja1FPam16aW9HREFNUk9qblpEZmFhTi9XRFNYZ0lBTW9O?= =?utf-8?B?Vm1aa0Zab1hPZ1oyam54eWxib2hWdVJiOW1OUEVxdGIvQW1pbFJqUEZ2Qlc3?= =?utf-8?B?bVFIWEphK252TnV5ckl5NndhM2NsQ1c3dmNUK0prWjE5cUpmVkRjN1lFQ3pQ?= =?utf-8?Q?5LAiyaAWadMSNngnLlL48bVjXMCVNeyboz?= X-Microsoft-Exchange-Diagnostics: 1;SN4PR0701MB3661;6:gVuA7t1VvuJp20EmI5uEqK1Z5USF8QDVQkeODwaiSoK0CWg0RprHZr7e+Ybw5mPywNI5Xi+N5es7jqdAFJ4wciKN1/nOhsWafT5KxIuXtNldNrefPKpb8Onf9ZlIXuxKmu6JSYb74syfEBoP/kJ1LV/YYcoCVH0eaweEL0R2/CxaqrevmonClFy+1NPILnPmjcY3yyR6Sjxh0J1wdZ3j/VWY/CS0A+fqBGbgaQznMHBz4joYSgylzKTUqgAH93RihHWFYyy/Iy6RrvjKrJHJ0Nm16vCDer19ENo+gObm/Jbv1TB4Sby6uToeyOaguMgRjoyMvCF3RjafmEnWziXOCg==;5:1KEprwq2h2IajB3KmAWREwMCPl0OKh384uL/gXjyo0lecSWoyU55lZXAsHsv3mbTBbsIWaT/IUvxaZA9g7X86KhQ9g/X/Q69a56CuL3W7mWuppss4bemk7LiOS6Hd6XQpkMXv4mvitlVXo+Wdufk1w==;24:gAsBXIhyvBRNJxAkUXSNgIw9xJsL0nv7bMTYbGLud15+ckUG0U5uODnEJl3gT2AikVKnMvvZ8qpLO8KE+Gewt/MjR6PTKe1kBuBSjNcZs3E=;7:HmeTq37Eqv0h/iVY7pyFx0c0m0RRUxudJUElil+PvPrjIoIgI5OoGNzSskej94aquCnsn9v8/1yIY3AWsd6zvWzNbakcFvnXawI8Pdt4h7nCRTbl5K/k484l/LihfwkCF7EQnYqYhDSWHZ5UhNoY3lGSDAeTWi6UC2pVm7pFzniW/ItAtUTsJqPWF3b8JrLHRtEGNmFyCWGkGWQsMhIKM8qe98ozYtY20Ioh940ULBk= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: caviumnetworks.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Sep 2017 16:51:08.6587 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 711e4ccf-2e9b-4bcf-a551-4094005b6194 X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN4PR0701MB3661 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4149 Lines: 105 On 22.09.2017 18:21, Tomasz Nowicki wrote: > Hi Robin, > > On 21.09.2017 17:52, Robin Murphy wrote: >> The cached node mechanism provides a significant performance benefit for >> allocations using a 32-bit DMA mask, but in the case of non-PCI devices >> or where the 32-bit space is full, the loss of this benefit can be >> significant - on large systems there can be many thousands of entries in >> the tree, such that walking all the way down to find free space every >> time becomes increasingly awful. >> >> Maintain a similar cached node for the whole IOVA space as a superset of >> the 32-bit space so that performance can remain much more consistent. >> >> Inspired by work by Zhen Lei . >> >> Tested-by: Ard Biesheuvel >> Tested-by: Zhen Lei >> Tested-by: Nate Watterson >> Signed-off-by: Robin Murphy >> --- >> >> v5: Fixed __cached_rbnode_delete_update() logic to update both nodes >>      when necessary >> >>   drivers/iommu/iova.c | 60 >> ++++++++++++++++++++++++---------------------------- >>   include/linux/iova.h |  3 ++- >>   2 files changed, 30 insertions(+), 33 deletions(-) >> >> diff --git a/drivers/iommu/iova.c b/drivers/iommu/iova.c >> index 20be9a8b3188..c6f5a22f8d20 100644 >> --- a/drivers/iommu/iova.c >> +++ b/drivers/iommu/iova.c >> @@ -48,6 +48,7 @@ init_iova_domain(struct iova_domain *iovad, unsigned >> long granule, >>       spin_lock_init(&iovad->iova_rbtree_lock); >>       iovad->rbroot = RB_ROOT; >> +    iovad->cached_node = NULL; >>       iovad->cached32_node = NULL; >>       iovad->granule = granule; >>       iovad->start_pfn = start_pfn; >> @@ -110,48 +111,44 @@ EXPORT_SYMBOL_GPL(init_iova_flush_queue); >>   static struct rb_node * >>   __get_cached_rbnode(struct iova_domain *iovad, unsigned long >> *limit_pfn) >>   { >> -    if ((*limit_pfn > iovad->dma_32bit_pfn) || >> -        (iovad->cached32_node == NULL)) >> +    struct rb_node *cached_node = NULL; >> +    struct iova *curr_iova; >> + >> +    if (*limit_pfn <= iovad->dma_32bit_pfn) >> +        cached_node = iovad->cached32_node; >> +    if (!cached_node) >> +        cached_node = iovad->cached_node; >> +    if (!cached_node) >>           return rb_last(&iovad->rbroot); >> -    else { >> -        struct rb_node *prev_node = rb_prev(iovad->cached32_node); >> -        struct iova *curr_iova = >> -            rb_entry(iovad->cached32_node, struct iova, node); >> -        *limit_pfn = curr_iova->pfn_lo; >> -        return prev_node; >> -    } >> + >> +    curr_iova = rb_entry(cached_node, struct iova, node); >> +    *limit_pfn = min(*limit_pfn, curr_iova->pfn_lo); > > I guess this it the fix for stale pointer in iovad->cached32_node from > previous series but I think this is something more. > > With this min() here we have real control over the limit_pfn we would > like to allocate at most. In other works, without your series two > subsequent calls can give us: > iova (ffff) = alloc_iova_fast(iovad, 1, DMA_BIT_MASK(32) >> shift); > > iova (fffe)= alloc_iova_fast(iovad, 1, DMA_BIT_MASK(16) >> shift); > > We do not see this since nobody uses limit_pfn below DMA_BIT_MASK(32) > now. That might be done intentionally so I ask for your opinion. > > Also, with your patch and two the same alloc_iova_fast() calls in > iteration may get 32-bit space full much faster. Please correct me if I > messed things up. After few more thoughts, I think this is unrealistic case. In any case, please consider below fix: static void -__cached_rbnode_insert_update(struct iova_domain *iovad, - unsigned long limit_pfn, struct iova *new) +__cached_rbnode_insert_update(struct iova_domain *iovad, struct iova *new) { - if (limit_pfn != iovad->dma_32bit_pfn) - return; - iovad->cached32_node = &new->node; + if (new->pfn_hi == iovad->dma_32bit_pfn) + iovad->cached32_node = &new->node; + else + iovad->cached_node = &new->node; } Thanks, Tomasz