From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=100.103.45.18 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1794595181; b=xHgMq9iKE2kM9j76zCBjRA4OXd1VJeLqs7pMF6gPsgEiL+x5Hx/OKC7fQTTziR1zSnXa FohTnhfY+uAgKps5Le1xOtaOW/7ZYRNRrrxyc7Ny2FVdm2yPtTv6TlI83L/n0gmOjx3yY zRBOw4MVuRrlombrKq+3+2t7iG72/sC0Nyl2xZws6bonH8WaucTIlwYPO/JAGjQLwETFv rzwbNAozTtNKwss3HMBBjmmhnIVauQAmfOG/Ipzx47Qju3+H+NynkwfUG/qVbHxa87Qph HRWLDaXsKOY6vhb8UyYkFtL2VHXxpgxNyQftvP6Q6t2tz28guQJeAneo+78ctcULQvQ== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1794595181; h=Received:DKIM-Signature:Date:From:To:Cc:Subject:Message-ID: References:MIME-Version:Content-Type:Content-Disposition:In-Reply-To; bh=vnUq4ElnHsxRnOIjFta6Y04mbJFNlBGZVOzsVi3X2B0=; b=oXKWR+HqjWuz3UV+WhzNOuZu/rpCzAo3AGzlvdn/mkaotdJ1NdJ4qSzSMWhQNwyX8Diu 2dcUNRNdTUlaI8Zc/JFVA1782GduB3u3wcpjw689IyVjHeD5qKarfk1TE5R5a2XMmJPK7 5iNehygsvRRW+NnjWrIC742mmkK6IRfnIUPGiPSOhV9u7SLKPMinfH+Rw4CO1C/8awqqW 1+jtkLv2oBlXjAbmEDno1gjzOKDb2rQ5cRk9oA+VJXujnnajYvEFgwVGfXPxRP8iMP/+V bJH6GaLYWIBZbC7z7DSagjiMEkdRGsCneDIJtVwk9iAqn181CjvC6kAn8oyjMwDTF9w== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=XlQHgXxB; arc=none smtp.remote-ip=100.103.45.18 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 78639607188C for ; Fri, 13 Nov 2026 18:39:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=XlQHgXxB Received: by smtp.kernel.org (Postfix) with ESMTPSA id 120801F000C5; Fri, 13 Nov 2026 18:39:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1794595181; bh=vnUq4ElnHsxRnOIjFta6Y04mbJFNlBGZVOzsVi3X2B0=; h=Date:From:To:Cc:Subject:References:In-Reply-To; b=XlQHgXxByB6xl8SZ2zgJrv2a4VJwpuAx3QYWCYpSU55j5VJ3BMLi/P5uiYZSahMS/ /vM7T9DYqwzbDLY+z/BTxiyepi4vgfEs7J/lKzU2fxQKfPZf0TZQUw0j3Tmtnd18dS 7FdNz5zU4duliWfFLor6rTP3n4vGKpCn27hoEpHVMTq++WbChyE5JwdctSUeZ3LSXt yNUdmwAvENyLuWY5f6EyxFaSLqVqFFUihIBEHGENBSokpPyNj2ZQqXbuQT7u+nBoN5 wvXRWmE5JX94kSJClQjbLR4SWgfOnefI26H7hjvQbs0R9aBh61i6k8SsFtOayKT3ed 4M/AFVStJB+IA== Date: Fri, 13 Nov 2026 18:39:34 +0000 From: "Lorenzo Stoakes (ARM)" To: Arnd Bergmann Cc: linux-mm@kvack.org, Arnd Bergmann , Andrew Morton , Andreas Larsson , "Christophe Leroy (CS GROUP)" , Dave Hansen , "David Hildenbrand (Arm)" , Jason Gunthorpe , Linus Walleij , Matthew Wilcox , Malin Jonsson , Richard Weinberger , Russell King , linux-arm-kernel@lists.infradead.org, linux-fsdevel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, x86@kernel.org Subject: Re: [PATCH v2 2/6] mm: remove ARCH_NEEDS_KMAP_HIGH_GET Message-ID: References: <20261112112528.1116405-1-arnd@kernel.org> <20261112112528.1116405-3-arnd@kernel.org> X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20261112112528.1116405-3-arnd@kernel.org> On Thu, Nov 12, 2026 at 12:25:24PM +0100, Arnd Bergmann wrote: > From: Arnd Bergmann > > Arm has stopped setting ARCH_NEEDS_KMAP_HIGH_GET, so this > is handled using the same wrappers across all architectures > now, which leaves room for simplification. > > Replace lock_kmap()/unlock_kmap() with open-coded spinlocks > and drop the now empty arch_kmap_local_high_get() and > kmap_high_unmap_local() helpers. > > Signed-off-by: Arnd Bergmann Lovely :) Acked-by: Lorenzo Stoakes (ARM) > --- > mm/highmem.c | 100 ++++++--------------------------------------------- > 1 file changed, 10 insertions(+), 90 deletions(-) > > diff --git a/mm/highmem.c b/mm/highmem.c > index a33e41183951..214164f9172b 100644 > --- a/mm/highmem.c > +++ b/mm/highmem.c > @@ -143,25 +143,6 @@ static __cacheline_aligned_in_smp DEFINE_SPINLOCK(kmap_lock); > > pte_t *pkmap_page_table; > > -/* > - * Most architectures have no use for kmap_high_get(), so let's abstract > - * the disabling of IRQ out of the locking in that case to save on a > - * potential useless overhead. > - */ > -#ifdef ARCH_NEEDS_KMAP_HIGH_GET > -#define lock_kmap() spin_lock_irq(&kmap_lock) > -#define unlock_kmap() spin_unlock_irq(&kmap_lock) > -#define lock_kmap_any(flags) spin_lock_irqsave(&kmap_lock, flags) > -#define unlock_kmap_any(flags) spin_unlock_irqrestore(&kmap_lock, flags) > -#else > -#define lock_kmap() spin_lock(&kmap_lock) > -#define unlock_kmap() spin_unlock(&kmap_lock) > -#define lock_kmap_any(flags) \ > - do { spin_lock(&kmap_lock); (void)(flags); } while (0) > -#define unlock_kmap_any(flags) \ > - do { spin_unlock(&kmap_lock); (void)(flags); } while (0) > -#endif > - > struct page *__kmap_to_page(void *vaddr) > { > unsigned long base = (unsigned long) vaddr & PAGE_MASK; > @@ -238,9 +219,9 @@ static void flush_all_zero_pkmaps(void) > > void __kmap_flush_unused(void) > { > - lock_kmap(); > + spin_lock(&kmap_lock); > flush_all_zero_pkmaps(); > - unlock_kmap(); > + spin_unlock(&kmap_lock); > } > > static inline unsigned long map_new_virtual(struct page *page) > @@ -274,10 +255,10 @@ static inline unsigned long map_new_virtual(struct page *page) > > __set_current_state(TASK_UNINTERRUPTIBLE); > add_wait_queue(pkmap_map_wait, &wait); > - unlock_kmap(); > + spin_unlock(&kmap_lock); > schedule(); > remove_wait_queue(pkmap_map_wait, &wait); > - lock_kmap(); > + spin_lock(&kmap_lock); > > /* Somebody else might have mapped it while we slept */ > if (page_address(page)) > @@ -313,60 +294,32 @@ void *kmap_high(struct page *page) > * For highmem pages, we can't trust "virtual" until > * after we have the lock. > */ > - lock_kmap(); > + spin_lock(&kmap_lock); > vaddr = (unsigned long)page_address(page); > if (!vaddr) > vaddr = map_new_virtual(page); > pkmap_count[PKMAP_NR(vaddr)]++; > BUG_ON(pkmap_count[PKMAP_NR(vaddr)] < 2); > - unlock_kmap(); > + spin_unlock(&kmap_lock); > return (void *) vaddr; > } > EXPORT_SYMBOL(kmap_high); > > -#ifdef ARCH_NEEDS_KMAP_HIGH_GET > -/** > - * kmap_high_get - pin a highmem page into memory > - * @page: &struct page to pin > - * > - * Returns the page's current virtual memory address, or NULL if no mapping > - * exists. If and only if a non null address is returned then a > - * matching call to kunmap_high() is necessary. > - * > - * This can be called from any context. > - */ > -void *kmap_high_get(const struct page *page) > -{ > - unsigned long vaddr, flags; > - > - lock_kmap_any(flags); > - vaddr = (unsigned long)page_address(page); > - if (vaddr) { > - BUG_ON(pkmap_count[PKMAP_NR(vaddr)] < 1); > - pkmap_count[PKMAP_NR(vaddr)]++; > - } > - unlock_kmap_any(flags); > - return (void *) vaddr; > -} > -#endif > - > /** > * kunmap_high - unmap a highmem page into memory > * @page: &struct page to unmap > * > - * If ARCH_NEEDS_KMAP_HIGH_GET is not defined then this may be called > - * only from user context. > + * This may be called only from user context. > */ > void kunmap_high(const struct page *page) > { > unsigned long vaddr; > unsigned long nr; > - unsigned long flags; > int need_wakeup; > unsigned int color = get_pkmap_color(page); > wait_queue_head_t *pkmap_map_wait; > > - lock_kmap_any(flags); > + spin_lock(&kmap_lock); > vaddr = (unsigned long)page_address(page); > BUG_ON(!vaddr); > nr = PKMAP_NR(vaddr); > @@ -393,7 +346,7 @@ void kunmap_high(const struct page *page) > pkmap_map_wait = get_pkmap_wait_queue_head(color); > need_wakeup = waitqueue_active(pkmap_map_wait); > } > - unlock_kmap_any(flags); > + spin_unlock(&kmap_lock); > > /* do wake-up, if needed, race-free outside of the spin lock */ > if (need_wakeup) > @@ -508,30 +461,11 @@ static inline void kmap_local_idx_pop(void) > #define arch_kmap_local_unmap_idx(idx, vaddr) kmap_local_calc_idx(idx) > #endif > > -#ifndef arch_kmap_local_high_get > -static inline void *arch_kmap_local_high_get(const struct page *page) > -{ > - return NULL; > -} > -#endif > - > #ifndef arch_kmap_local_set_pte > #define arch_kmap_local_set_pte(mm, vaddr, ptep, ptev) \ > set_pte_at(mm, vaddr, ptep, ptev) > #endif > > -/* Unmap a local mapping which was obtained by kmap_high_get() */ > -static inline bool kmap_high_unmap_local(unsigned long vaddr) > -{ > -#ifdef ARCH_NEEDS_KMAP_HIGH_GET > - if (vaddr >= PKMAP_ADDR(0) && vaddr < PKMAP_ADDR(LAST_PKMAP)) { > - kunmap_high(pte_page(ptep_get(&pkmap_page_table[PKMAP_NR(vaddr)]))); > - return true; > - } > -#endif > - return false; > -} > - > static pte_t *__kmap_pte; > > static pte_t *kmap_get_pte(unsigned long vaddr, int idx) > @@ -575,8 +509,6 @@ EXPORT_SYMBOL_GPL(__kmap_local_pfn_prot); > > void *__kmap_local_page_prot(const struct page *page, pgprot_t prot) > { > - void *kmap; > - > /* > * To broaden the usage of the actual kmap_local() machinery always map > * pages when debugging is enabled and the architecture has no problems > @@ -585,11 +517,6 @@ void *__kmap_local_page_prot(const struct page *page, pgprot_t prot) > if (!IS_ENABLED(CONFIG_DEBUG_KMAP_LOCAL_FORCE_MAP) && !PageHighMem(page)) > return page_address(page); > > - /* Try kmap_high_get() if architecture has it enabled */ > - kmap = arch_kmap_local_high_get(page); > - if (kmap) > - return kmap; > - > return __kmap_local_pfn_prot(page_to_pfn(page), prot); > } > EXPORT_SYMBOL(__kmap_local_page_prot); > @@ -607,14 +534,7 @@ void kunmap_local_indexed(const void *vaddr) > WARN_ON_ONCE(1); > return; > } > - /* > - * Handle mappings which were obtained by kmap_high_get() > - * first as the virtual address of such mappings is below > - * PAGE_OFFSET. Warn for all other addresses which are in > - * the user space part of the virtual address space. > - */ > - if (!kmap_high_unmap_local(addr)) > - WARN_ON_ONCE(addr < PAGE_OFFSET); > + WARN_ON_ONCE(addr < PAGE_OFFSET); > return; > } > > -- > 2.53.0 > -- Cheers, Lorenzo