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 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id B6101C001DE for ; Wed, 9 Aug 2023 21:20:50 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id E66AC6B0075; Wed, 9 Aug 2023 17:20:49 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id E165E6B0078; Wed, 9 Aug 2023 17:20:49 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id CB7226B007B; Wed, 9 Aug 2023 17:20:49 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id B98FC6B0075 for ; Wed, 9 Aug 2023 17:20:49 -0400 (EDT) Received: from smtpin23.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id 588B3160320 for ; Wed, 9 Aug 2023 21:20:49 +0000 (UTC) X-FDA: 81105835818.23.4E3CB84 Received: from ms.lwn.net (ms.lwn.net [45.79.88.28]) by imf27.hostedemail.com (Postfix) with ESMTP id 81C3B40025 for ; Wed, 9 Aug 2023 21:20:46 +0000 (UTC) Authentication-Results: imf27.hostedemail.com; dkim=pass header.d=lwn.net header.s=20201203 header.b=NXwT7fNZ; dmarc=none; spf=pass (imf27.hostedemail.com: domain of corbet@lwn.net designates 45.79.88.28 as permitted sender) smtp.mailfrom=corbet@lwn.net ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1691616046; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=D3OCzS/TjQzlx859sDe4uhCo8ItizHSPamS05kU7M/E=; b=yFVKzBRLGkKPde6vB7pDnDYoGvmMsiTV6KRTgwLX/I4Fjk765u5uwAft3vx+PE2Fwtx91F dzeiRvQIC9w2l8WAjnIasifJ2h131WD5V+QX9uEdI3gphP32OdpPE5wDibc8dWXkLzuiOT 15vCrp5IF4BE6xQqweEQOXYT0EZClLs= ARC-Authentication-Results: i=1; imf27.hostedemail.com; dkim=pass header.d=lwn.net header.s=20201203 header.b=NXwT7fNZ; dmarc=none; spf=pass (imf27.hostedemail.com: domain of corbet@lwn.net designates 45.79.88.28 as permitted sender) smtp.mailfrom=corbet@lwn.net ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1691616046; a=rsa-sha256; cv=none; b=IUiZbXYpl5L+hUTGNT0FnGtFumZqt62tHXk9u8LdlY7ppxbUrdPpS7ASQVXE1TNTCPp7xJ BEHesm7idWSk2co4vM9M8u0cyComyJ/jW4S48nHuJPZwmRoF+jK4IITG4lxQ1DgYMA9XSn Ivv42YYrlz8aSveeej557pBObzeqMa8= Received: from localhost (unknown [IPv6:2601:281:8300:73::5f6]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ms.lwn.net (Postfix) with ESMTPSA id 5DF4E218; Wed, 9 Aug 2023 21:20:44 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 ms.lwn.net 5DF4E218 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=lwn.net; s=20201203; t=1691616044; bh=D3OCzS/TjQzlx859sDe4uhCo8ItizHSPamS05kU7M/E=; h=From:To:Cc:Subject:In-Reply-To:References:Date:From; b=NXwT7fNZt30FAE6/rsWNAIxKfZAnHdE0QNzpPAfTcuuLXJv/8sSeNpRi/YYa5NjJC JPc/pZIj2m1/iKfmCA6z6g2y88sFf4ZH/bH/4XDB2qcRK5jWAwzLmabxM5iXzuAYwc gdH4oIFqQIHil75Is17wCUwIlXkrwODoldc2N5n5BFNAkaN5JRNZKvsISIklyJvP2F 4+b3s2bgvKX3Qdk1NsvqoUWqBFM5kFpduA+bStZQdIeCWxvmzzb6PeCz24WoTHyNsu hckvkWe4mo+JyUGpbBEyCK3lFgQYmdeewhQkWR1ZSjYdvGexm2T+wCrOys5KDkkoTp DAFJ4ZWqDCc4Q== From: Jonathan Corbet To: Petr Tesarik , Stefano Stabellini , Russell King , Thomas Bogendoerfer , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , "maintainer:X86 ARCHITECTURE (32-BIT AND 64-BIT)" , "H. Peter Anvin" , Greg Kroah-Hartman , "Rafael J. Wysocki" , Juergen Gross , Oleksandr Tyshchenko , Christoph Hellwig , Marek Szyprowski , Robin Murphy , Christoph Lameter , Pekka Enberg , David Rientjes , Joonsoo Kim , Andrew Morton , Vlastimil Babka , Roman Gushchin , Hyeonggon Yoo <42.hyeyoo@gmail.com>, Petr Tesarik , Andy Shevchenko , Hans de Goede , James Seo , James Clark , Kees Cook , "moderated list:XEN HYPERVISOR ARM" , "moderated list:ARM PORT" , open list , "open list:MIPS" , "open list:XEN SWIOTLB SUBSYSTEM" , "open list:SLAB ALLOCATOR" Cc: Roberto Sassu , petr@tesarici.cz Subject: Re: [PATCH v7 9/9] swiotlb: search the software IO TLB only if the device makes use of it In-Reply-To: References: Date: Wed, 09 Aug 2023 15:20:43 -0600 Message-ID: <87a5uz3ob8.fsf@meer.lwn.net> MIME-Version: 1.0 Content-Type: text/plain X-Rspamd-Queue-Id: 81C3B40025 X-Rspam-User: X-Rspamd-Server: rspam04 X-Stat-Signature: gsqmebg3jzu4bxssod1zhbg1w61qpjz7 X-HE-Tag: 1691616046-80100 X-HE-Meta: U2FsdGVkX1+KiVaQUTyX2wsFQoicNx/JwQxv1nsqu/5jCFX99esaH/pOeddilh79S+B2/rM6n+ZCpRF8hi7907U+MMTwWRbgvoMR79SNCVyh4m1KGrxUy320lgyuFxc24oTCwDL/X1PnRRXGVOzRW7QaE0JmOEWN7JaXNNO0Pg27ltvNwKScrJUWVc5szcXTdWHy2eYIDDNxrLgTVzG4BvPVIykR36zOavzEzseA7TCWcy8hyCq3yaoqkETRiLHj6bIN/JZaf9czXZdG6KQgSV1sJPq6OV+2yMWtAvVGodC60aUM+rE+TH/za46GC9GW2qpWIzZSYlI7fNZXIRQwJTc1VUheFzg+tVp/lXm5dHAGO5Esf+Rjzg0OKgeHy6o1pXfSFpaax9vVl4G11iKgHKs6wZk6+WebknHa0oRhIlV4/MSEW5rle8mshzwZqsiN5mFdPeRgnkJJm6v6vjvu8/+Q18pwP4k//BY/BUTra48Y53EpynUF2prcTDP1yIs0DH8WbDMOBb+vUAfU9broKb2Mjff6mASRyhCq7bBhTK2y58B1YtfcP6cLzMKVzGQSJ6fp8wLyDFXZRDeRhuSku8vavD29aiuyaH63DxxYLe+v5A7OcZshKCgsrsz9irYzAnXMtBGCp5PHUjNms3tHXzYEnxt1vfLVTrVekOzljqWsPbXytODpaeIKbKkkFt/jVvOLT9AqXBOPMGyvr7rYHZ69kc4DyUDaJSdBQZ3QZ2cOsc0cA0aQgnY1876ED+7JDRGh5tG1/qiZWotqODNjzdLW4R9rfxaSdpaNa037H6bcgMrHhHst2hhzxQSlZKBd6V7jIbvrh14Ag1KQsDXQOBa4QkvQwHnR0MApFAnvPnv6Ctwn1jQuGifWX1EP4BAjCizYQxCrD4xB8K5RxK66LwwGAFn2AHIJMgJmqZFduAr3Czle5CUdE1NNHYXMtEKwi/li3XoGPwami4CVkWl Jv2o0Vwt xIkKVadMgr6qIkWVuk3kJrezmeRHWm/+qXEq3SByYkWvYZ4bZGcEBy9Iiw6SsSVXk6Z8XuMVTqFvkxzfTzQaXwxq4zYVlict5f7TAmdEHmDqlXHdHHB0oQmZC4D9ttVO9D90nrvxTGqihZXE8l8t4lDl55CfaXb5p0G3dB7v8WhY6XcKgEBL3CBFMzJXzQ+fjOz4167s86o+n1zonqe8N2XpM/cEmC2HfloY2TWiCOJ58Os0B66YgfvPFRWUhfmi0xyuoGmsEVop5d04KYJQmdgxcx9smEORYDV2hAcdSbQmZJD0H8o3MG4lUqg== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Petr Tesarik writes: > From: Petr Tesarik > > Skip searching the software IO TLB if a device has never used it, making > sure these devices are not affected by the introduction of multiple IO TLB > memory pools. > > Additional memory barrier is required to ensure that the new value of the > flag is visible to other CPUs after mapping a new bounce buffer. For > efficiency, the flag check should be inlined, and then the memory barrier > must be moved to is_swiotlb_buffer(). However, it can replace the existing > barrier in swiotlb_find_pool(), because all callers use is_swiotlb_buffer() > first to verify that the buffer address belongs to the software IO TLB. > > Signed-off-by: Petr Tesarik > --- Excuse me if this is a silly question, but I'm not able to figure it out on my own... > include/linux/device.h | 2 ++ > include/linux/swiotlb.h | 7 ++++++- > kernel/dma/swiotlb.c | 14 ++++++-------- > 3 files changed, 14 insertions(+), 9 deletions(-) > > diff --git a/include/linux/device.h b/include/linux/device.h > index 5fd89c9d005c..6fc808d22bfd 100644 > --- a/include/linux/device.h > +++ b/include/linux/device.h > @@ -628,6 +628,7 @@ struct device_physical_location { > * @dma_io_tlb_mem: Software IO TLB allocator. Not for driver use. > * @dma_io_tlb_pools: List of transient swiotlb memory pools. > * @dma_io_tlb_lock: Protects changes to the list of active pools. > + * @dma_uses_io_tlb: %true if device has used the software IO TLB. > * @archdata: For arch-specific additions. > * @of_node: Associated device tree node. > * @fwnode: Associated device node supplied by platform firmware. > @@ -737,6 +738,7 @@ struct device { > #ifdef CONFIG_SWIOTLB_DYNAMIC > struct list_head dma_io_tlb_pools; > spinlock_t dma_io_tlb_lock; > + bool dma_uses_io_tlb; You add this new member here, fine... > #endif > /* arch specific additions */ > struct dev_archdata archdata; > diff --git a/include/linux/swiotlb.h b/include/linux/swiotlb.h > index 8371c92a0271..b4536626f8ff 100644 > --- a/include/linux/swiotlb.h > +++ b/include/linux/swiotlb.h > @@ -172,8 +172,13 @@ static inline bool is_swiotlb_buffer(struct device *dev, phys_addr_t paddr) > if (!mem) > return false; > > - if (IS_ENABLED(CONFIG_SWIOTLB_DYNAMIC)) > + if (IS_ENABLED(CONFIG_SWIOTLB_DYNAMIC)) { > + /* Pairs with smp_wmb() in swiotlb_find_slots() and > + * swiotlb_dyn_alloc(), which modify the RCU lists. > + */ > + smp_rmb(); > return swiotlb_find_pool(dev, paddr); > + } > return paddr >= mem->defpool.start && paddr < mem->defpool.end; > } > > diff --git a/kernel/dma/swiotlb.c b/kernel/dma/swiotlb.c > index adf80dec42d7..d7eac84f975b 100644 > --- a/kernel/dma/swiotlb.c > +++ b/kernel/dma/swiotlb.c > @@ -730,7 +730,7 @@ static void swiotlb_dyn_alloc(struct work_struct *work) > > add_mem_pool(mem, pool); > > - /* Pairs with smp_rmb() in swiotlb_find_pool(). */ > + /* Pairs with smp_rmb() in is_swiotlb_buffer(). */ > smp_wmb(); > } > > @@ -764,11 +764,6 @@ struct io_tlb_pool *swiotlb_find_pool(struct device *dev, phys_addr_t paddr) > struct io_tlb_mem *mem = dev->dma_io_tlb_mem; > struct io_tlb_pool *pool; > > - /* Pairs with smp_wmb() in swiotlb_find_slots() and > - * swiotlb_dyn_alloc(), which modify the RCU lists. > - */ > - smp_rmb(); > - > rcu_read_lock(); > list_for_each_entry_rcu(pool, &mem->pools, node) { > if (paddr >= pool->start && paddr < pool->end) > @@ -813,6 +808,7 @@ void swiotlb_dev_init(struct device *dev) > #ifdef CONFIG_SWIOTLB_DYNAMIC > INIT_LIST_HEAD(&dev->dma_io_tlb_pools); > spin_lock_init(&dev->dma_io_tlb_lock); > + dev->dma_uses_io_tlb = false; ...here you initialize it, fine... > #endif > } > > @@ -1157,9 +1153,11 @@ static int swiotlb_find_slots(struct device *dev, phys_addr_t orig_addr, > list_add_rcu(&pool->node, &dev->dma_io_tlb_pools); > spin_unlock_irqrestore(&dev->dma_io_tlb_lock, flags); > > - /* Pairs with smp_rmb() in swiotlb_find_pool(). */ > - smp_wmb(); > found: > + dev->dma_uses_io_tlb = true; > + /* Pairs with smp_rmb() in is_swiotlb_buffer() */ > + smp_wmb(); > + ...and here you set it if swiotlb is used. But, as far as I can tell, you don't actually *use* this field anywhere. What am I missing? Thanks, jon