From nobody Wed Dec 17 21:31:43 2025 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4dWn79162Lz6LS85 for ; Wed, 17 Dec 2025 21:31:49 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R12" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4dWn7853MBz3D9P for ; Wed, 17 Dec 2025 21:31:48 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1766007108; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=SW7gDObBlTXaUrCoLpi8pQ/1Xm0KlWUknCF3E/VI6fY=; b=PeTvidR2MWtv7E/GCAPxLh6HeElwjmQADFzCMBuv4WMwYyHWa3gS3QNuODQliaeNoyzzBz r3wmM6tf+BBb0XczDv2hg+GxKMFM4fuyLHJQ2Z4exSOA+X7OQmt8NxtjbjAdx1YbgUUMvO c8mb+rRf0BHZTyrYV514SEY+27JD3fO3bLLoC5bI0OLSOKXQBKSq7JCUvic1PGOXnOxUXs NJlvKNkC8I3ZVzo5rrBO7zKRwlyyiiRvgpSZExTQI09QqhQOjXNkg4AcuqhWTebyWNFSph sS1D3DkJV2C9T+UIGNex8mEOKd85aOT2BiD2ty05ia3sLE890AhOFbuXhO11AA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1766007108; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=SW7gDObBlTXaUrCoLpi8pQ/1Xm0KlWUknCF3E/VI6fY=; b=aExbVjA6dQKShv5RsZynB1AZ8i7dbRZ+CfRUTlu/dOOjIyVQHX3j4gp2yw273v7k77rfqy Q/MTVIawLZjCDah+Ues5cohTlGtYjrRs7CtCPAyEwmzin9Eq2Y/CgkoL/JqmzL546xTwmY mFY5ral+/X8oOrfNu9BncL1+lfvzb3unr4gCJG3D8QUHgYRQtswAyNeNZZdDy7uyYap7IJ x1FYULxnPzVfLgTtAWQPQDGcLksTx54SHXJhnraSbQNEu3jI/ELGjLmYpBS04XOSR91e2f Pwe17Mhio7E5KZi+pae7a3k7aV8F8SmF6CbU4GUsa2M2z8ciNjq2QvzAUngh/A== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1766007108; a=rsa-sha256; cv=none; b=R8cK61D9SVxiJ31tPOYlGrbPuksJJdUd7A9EUswCK5+3VscTh67KRF09JttQhyDf5TzakW T2d8Gc12cpAXkV3NPd0DmtvaTZvXls+T5dxvgJAlP0XARMOWY/XMCLYSLJy+fN5yLMLRSs diPAp+DZvJppCXhlmhH2GAicxHngdT2zmc6wN4//qGrsHLZG26QkqGfk4V9mcTXtw7GqC3 /G+AIkPjqmrv/LdklzqXDAdatmw0hc3A66RENdTEjofPZicb40GffRmIITdoQNmDh13DWE wTw6zX4adf1KMFZMiRFDm3QxUngFNGKhnk8WPmTo3v/NQrA1QXtEfnuzCvZM1w== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4dWn783WhCz18Gd for ; Wed, 17 Dec 2025 21:31:48 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 4481d by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Wed, 17 Dec 2025 21:31:43 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Vladimir Kondratyev Subject: git: 20ce906157df - main - LinuxKPI: Move vmap-related code from linux_compat.c to linux_page.c List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: wulf X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 20ce906157dfc9ae6ee834f56f2bba154f37d653 Auto-Submitted: auto-generated Date: Wed, 17 Dec 2025 21:31:43 +0000 Message-Id: <6943213f.4481d.68f8e804@gitrepo.freebsd.org> The branch main has been updated by wulf: URL: https://cgit.FreeBSD.org/src/commit/?id=20ce906157dfc9ae6ee834f56f2bba154f37d653 commit 20ce906157dfc9ae6ee834f56f2bba154f37d653 Author: Vladimir Kondratyev AuthorDate: 2025-12-17 21:31:11 +0000 Commit: Vladimir Kondratyev CommitDate: 2025-12-17 21:31:11 +0000 LinuxKPI: Move vmap-related code from linux_compat.c to linux_page.c Coming vmap_pfn() implementation requires is_vmalloc_addr() to be in the same file with other vmap-related code. Move code out from the overcrowded file. No functional changes intended. MFC after: 1 week Reviewed by: bz Differential Revision: https://reviews.freebsd.org/D54223 --- sys/compat/linuxkpi/common/src/linux_compat.c | 111 ----------------------- sys/compat/linuxkpi/common/src/linux_page.c | 125 ++++++++++++++++++++++++++ 2 files changed, 125 insertions(+), 111 deletions(-) diff --git a/sys/compat/linuxkpi/common/src/linux_compat.c b/sys/compat/linuxkpi/common/src/linux_compat.c index ff0f477ea8cc..35430daf311d 100644 --- a/sys/compat/linuxkpi/common/src/linux_compat.c +++ b/sys/compat/linuxkpi/common/src/linux_compat.c @@ -1812,113 +1812,6 @@ const struct fileops linuxfileops = { .fo_flags = DFLAG_PASSABLE, }; -/* - * Hash of vmmap addresses. This is infrequently accessed and does not - * need to be particularly large. This is done because we must store the - * caller's idea of the map size to properly unmap. - */ -struct vmmap { - LIST_ENTRY(vmmap) vm_next; - void *vm_addr; - unsigned long vm_size; -}; - -struct vmmaphd { - struct vmmap *lh_first; -}; -#define VMMAP_HASH_SIZE 64 -#define VMMAP_HASH_MASK (VMMAP_HASH_SIZE - 1) -#define VM_HASH(addr) ((uintptr_t)(addr) >> PAGE_SHIFT) & VMMAP_HASH_MASK -static struct vmmaphd vmmaphead[VMMAP_HASH_SIZE]; -static struct mtx vmmaplock; - -static void -vmmap_add(void *addr, unsigned long size) -{ - struct vmmap *vmmap; - - vmmap = kmalloc(sizeof(*vmmap), GFP_KERNEL); - mtx_lock(&vmmaplock); - vmmap->vm_size = size; - vmmap->vm_addr = addr; - LIST_INSERT_HEAD(&vmmaphead[VM_HASH(addr)], vmmap, vm_next); - mtx_unlock(&vmmaplock); -} - -static struct vmmap * -vmmap_remove(void *addr) -{ - struct vmmap *vmmap; - - mtx_lock(&vmmaplock); - LIST_FOREACH(vmmap, &vmmaphead[VM_HASH(addr)], vm_next) - if (vmmap->vm_addr == addr) - break; - if (vmmap) - LIST_REMOVE(vmmap, vm_next); - mtx_unlock(&vmmaplock); - - return (vmmap); -} - -#if defined(__i386__) || defined(__amd64__) || defined(__powerpc__) || defined(__aarch64__) || defined(__riscv) -void * -_ioremap_attr(vm_paddr_t phys_addr, unsigned long size, int attr) -{ - void *addr; - - addr = pmap_mapdev_attr(phys_addr, size, attr); - if (addr == NULL) - return (NULL); - vmmap_add(addr, size); - - return (addr); -} -#endif - -void -iounmap(void *addr) -{ - struct vmmap *vmmap; - - vmmap = vmmap_remove(addr); - if (vmmap == NULL) - return; -#if defined(__i386__) || defined(__amd64__) || defined(__powerpc__) || defined(__aarch64__) || defined(__riscv) - pmap_unmapdev(addr, vmmap->vm_size); -#endif - kfree(vmmap); -} - -void * -vmap(struct page **pages, unsigned int count, unsigned long flags, int prot) -{ - vm_offset_t off; - size_t size; - - size = count * PAGE_SIZE; - off = kva_alloc(size); - if (off == 0) - return (NULL); - vmmap_add((void *)off, size); - pmap_qenter(off, pages, count); - - return ((void *)off); -} - -void -vunmap(void *addr) -{ - struct vmmap *vmmap; - - vmmap = vmmap_remove(addr); - if (vmmap == NULL) - return; - pmap_qremove((vm_offset_t)addr, vmmap->vm_size / PAGE_SIZE); - kva_free((vm_offset_t)addr, vmmap->vm_size); - kfree(vmmap); -} - static char * devm_kvasprintf(struct device *dev, gfp_t gfp, const char *fmt, va_list ap) { @@ -2887,9 +2780,6 @@ linux_compat_init(void *arg) INIT_LIST_HEAD(&pci_drivers); INIT_LIST_HEAD(&pci_devices); spin_lock_init(&pci_lock); - mtx_init(&vmmaplock, "IO Map lock", NULL, MTX_DEF); - for (i = 0; i < VMMAP_HASH_SIZE; i++) - LIST_INIT(&vmmaphead[i]); init_waitqueue_head(&linux_bit_waitq); init_waitqueue_head(&linux_var_waitq); @@ -3000,7 +2890,6 @@ linux_compat_uninit(void *arg) free(__cpu_data, M_KMALLOC); #endif - mtx_destroy(&vmmaplock); spin_lock_destroy(&pci_lock); rw_destroy(&linux_vma_lock); } diff --git a/sys/compat/linuxkpi/common/src/linux_page.c b/sys/compat/linuxkpi/common/src/linux_page.c index c0d9d71ba1ce..57ca1401b912 100644 --- a/sys/compat/linuxkpi/common/src/linux_page.c +++ b/sys/compat/linuxkpi/common/src/linux_page.c @@ -318,12 +318,119 @@ lkpi_get_user_pages(unsigned long start, unsigned long nr_pages, !!(gup_flags & FOLL_WRITE), pages)); } +/* + * Hash of vmmap addresses. This is infrequently accessed and does not + * need to be particularly large. This is done because we must store the + * caller's idea of the map size to properly unmap. + */ +struct vmmap { + LIST_ENTRY(vmmap) vm_next; + void *vm_addr; + unsigned long vm_size; +}; + +struct vmmaphd { + struct vmmap *lh_first; +}; +#define VMMAP_HASH_SIZE 64 +#define VMMAP_HASH_MASK (VMMAP_HASH_SIZE - 1) +#define VM_HASH(addr) ((uintptr_t)(addr) >> PAGE_SHIFT) & VMMAP_HASH_MASK +static struct vmmaphd vmmaphead[VMMAP_HASH_SIZE]; +static struct mtx vmmaplock; + int is_vmalloc_addr(const void *addr) { return (vtoslab((vm_offset_t)addr & ~UMA_SLAB_MASK) != NULL); } +static void +vmmap_add(void *addr, unsigned long size) +{ + struct vmmap *vmmap; + + vmmap = kmalloc(sizeof(*vmmap), GFP_KERNEL); + mtx_lock(&vmmaplock); + vmmap->vm_size = size; + vmmap->vm_addr = addr; + LIST_INSERT_HEAD(&vmmaphead[VM_HASH(addr)], vmmap, vm_next); + mtx_unlock(&vmmaplock); +} + +static struct vmmap * +vmmap_remove(void *addr) +{ + struct vmmap *vmmap; + + mtx_lock(&vmmaplock); + LIST_FOREACH(vmmap, &vmmaphead[VM_HASH(addr)], vm_next) + if (vmmap->vm_addr == addr) + break; + if (vmmap) + LIST_REMOVE(vmmap, vm_next); + mtx_unlock(&vmmaplock); + + return (vmmap); +} + +#if defined(__i386__) || defined(__amd64__) || defined(__powerpc__) || defined(__aarch64__) || defined(__riscv) +void * +_ioremap_attr(vm_paddr_t phys_addr, unsigned long size, int attr) +{ + void *addr; + + addr = pmap_mapdev_attr(phys_addr, size, attr); + if (addr == NULL) + return (NULL); + vmmap_add(addr, size); + + return (addr); +} +#endif + +void +iounmap(void *addr) +{ + struct vmmap *vmmap; + + vmmap = vmmap_remove(addr); + if (vmmap == NULL) + return; +#if defined(__i386__) || defined(__amd64__) || defined(__powerpc__) || defined(__aarch64__) || defined(__riscv) + pmap_unmapdev(addr, vmmap->vm_size); +#endif + kfree(vmmap); +} + +void * +vmap(struct page **pages, unsigned int count, unsigned long flags, int prot) +{ + vm_offset_t off; + size_t size; + + size = count * PAGE_SIZE; + off = kva_alloc(size); + if (off == 0) + return (NULL); + vmmap_add((void *)off, size); + pmap_qenter(off, pages, count); + + return ((void *)off); +} + +void +vunmap(void *addr) +{ + struct vmmap *vmmap; + + vmmap = vmmap_remove(addr); + if (vmmap == NULL) + return; + pmap_qremove((vm_offset_t)addr, vmmap->vm_size / PAGE_SIZE); + kva_free((vm_offset_t)addr, vmmap->vm_size); + kfree(vmmap); +} + vm_fault_t lkpi_vmf_insert_pfn_prot_locked(struct vm_area_struct *vma, unsigned long addr, unsigned long pfn, pgprot_t prot) @@ -575,3 +682,21 @@ linuxkpi__page_frag_cache_drain(struct page *page, size_t count __unused) linux_free_pages(page, 0); } + +static void +lkpi_page_init(void *arg) +{ + int i; + + mtx_init(&vmmaplock, "IO Map lock", NULL, MTX_DEF); + for (i = 0; i < VMMAP_HASH_SIZE; i++) + LIST_INIT(&vmmaphead[i]); +} +SYSINIT(lkpi_page, SI_SUB_DRIVERS, SI_ORDER_SECOND, lkpi_page_init, NULL); + +static void +lkpi_page_uninit(void *arg) +{ + mtx_destroy(&vmmaplock); +} +SYSUNINIT(lkpi_page, SI_SUB_DRIVERS, SI_ORDER_SECOND, lkpi_page_uninit, NULL);