From nobody Wed Dec 24 20:12:28 2025 X-Original-To: dev-commits-src-all@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 4dc32P4ll4z6LWHY for ; Wed, 24 Dec 2025 20:12:29 +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 "R13" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4dc32P36yfz4J3p for ; Wed, 24 Dec 2025 20:12:29 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1766607149; 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=+92421eGWATnOfx1qnziLVUCsh7KXsmlP2W/PlBaLjc=; b=ub4enCJKLbNk2WrMh5b+OSYOI4uydMIAnmCB7S/XCDEmkp0geO7vM+UZe9G3QfEwQqPuOm kdp0qRNkj27HIeMJhO/Vr7Jf/YsP8zSP+gq+o3BXwhrWq+XE39j64Cn6Off4IkVRpCaEoY eioLblT5La3wX41KobR57x4Uqi5fEoeqOF5+Z/QJowp4uwkK6W5SOxEGX6Q1jmUtJqXawC 9CBirZaiZL7mMCm1izZ9WVjCCC1mFTFfO8WzcFetz4F11XR3/pEMzXr4UQ9u9LMewIEjph QxcqihahHNp34LxwUcbi24aw7VKsGQBHb4i80+9uUtUEiJ1OaNbgXdfSG/CdIw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1766607149; 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=+92421eGWATnOfx1qnziLVUCsh7KXsmlP2W/PlBaLjc=; b=Nt9HQUfMK5dOc1fHhFuT+o9j/DN3Dd+BbH5mDN69QDRnaWTwAfGKfLn2re985vWkuU5g+P 03hMjH178hZfKEI1iLAGRtUkNnahJgqs3eJwnC1mAYn1ZdQP2RlExArlcx3V1GecVniIR5 6WoDucoeg9gKLXg6LwZBYYkwSrWvePaUQquc71lL/EvOVNE5EqMLZAwarUh2A9egrZeptG FkiwTcKgzF5Io2tExG+i/TncZmt0FfnhhxiYl38oq+EomKOrvsdobGgFibrC6cgmBJuVT5 oEAZnU1FQcn9sxpT+Svh+hxF9k4Y8HyvsUQaAO2Simxe5/n/jp1Squ8MB2osuA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1766607149; a=rsa-sha256; cv=none; b=lt3Dhf1rG5Gt+Eo8cuFHdvhfQWddBMIcMjEH3d80OZsU3UiQWApH8ITfxjtqSxPGn8yRsJ O8J6/g0CJRXkjH4C9loZ/Y7IxZEM7vrGUiz0M7b/7XwhgTcq71hEXu2VJTotCyPJH/dMUi 6pQNDoVhAFXr4bjgfodpzLJI4t+kKBloPKEmLgBCAiJKB2Cbw+fkRrnjPU+WWMI4FlfYWY 8JAL+rkNxkizWtSxIczGhhWWyPOOm0VN2wM0ylmRedljjouHipcr4B0qzba/gE1WF81xYk Dte0EAFIB8EmMenw0FqOUz4JN+obT6KG/6oYrNCZPK3PRFb3Q5hyJcB1hgurMg== 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 4dc32N6ktbzxP5 for ; Wed, 24 Dec 2025 20:12:28 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 3b58c by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Wed, 24 Dec 2025 20:12:28 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Vladimir Kondratyev Subject: git: 304c24df44d3 - stable/15 - LinuxKPI: Implement vmap_pfn List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@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/stable/15 X-Git-Reftype: branch X-Git-Commit: 304c24df44d3ff70a26d1a8fd6653c5c4e765165 Auto-Submitted: auto-generated Date: Wed, 24 Dec 2025 20:12:28 +0000 Message-Id: <694c492c.3b58c.76f857e3@gitrepo.freebsd.org> The branch stable/15 has been updated by wulf: URL: https://cgit.FreeBSD.org/src/commit/?id=304c24df44d3ff70a26d1a8fd6653c5c4e765165 commit 304c24df44d3ff70a26d1a8fd6653c5c4e765165 Author: Vladimir Kondratyev AuthorDate: 2025-12-17 21:31:11 +0000 Commit: Vladimir Kondratyev CommitDate: 2025-12-24 20:06:08 +0000 LinuxKPI: Implement vmap_pfn Required by i915kms to support recent discrete graphics cards. MFC after: 1 week Reviewed by: kib Differential Revision: https://reviews.freebsd.org/D54225 (cherry picked from commit df49fd8efa1a885089488458df0e7e88c9649c90) --- sys/compat/linuxkpi/common/include/linux/vmalloc.h | 3 + sys/compat/linuxkpi/common/src/linux_page.c | 65 ++++++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/sys/compat/linuxkpi/common/include/linux/vmalloc.h b/sys/compat/linuxkpi/common/include/linux/vmalloc.h index 00650a2df9b6..a7f77f090755 100644 --- a/sys/compat/linuxkpi/common/include/linux/vmalloc.h +++ b/sys/compat/linuxkpi/common/include/linux/vmalloc.h @@ -35,8 +35,11 @@ #define VM_MAP 0x0000 #define PAGE_KERNEL 0x0000 +#define vmap_pfn(...) linuxkpi_vmap_pfn(__VA_ARGS__) + void *vmap(struct page **pages, unsigned int count, unsigned long flags, int prot); +void *linuxkpi_vmap_pfn(unsigned long *pfns, unsigned int count, int prot); void vunmap(void *addr); #endif /* _LINUXKPI_LINUX_VMALLOC_H_ */ diff --git a/sys/compat/linuxkpi/common/src/linux_page.c b/sys/compat/linuxkpi/common/src/linux_page.c index 57ca1401b912..82f3a2a4639f 100644 --- a/sys/compat/linuxkpi/common/src/linux_page.c +++ b/sys/compat/linuxkpi/common/src/linux_page.c @@ -341,6 +341,16 @@ static struct mtx vmmaplock; int is_vmalloc_addr(const void *addr) { + struct vmmap *vmmap; + + mtx_lock(&vmmaplock); + LIST_FOREACH(vmmap, &vmmaphead[VM_HASH(addr)], vm_next) + if (addr == vmmap->vm_addr) + break; + mtx_unlock(&vmmaplock); + if (vmmap != NULL) + return (1); + return (vtoslab((vm_offset_t)addr & ~UMA_SLAB_MASK) != NULL); } @@ -418,6 +428,61 @@ vmap(struct page **pages, unsigned int count, unsigned long flags, int prot) return ((void *)off); } +#define VMAP_MAX_CHUNK_SIZE (65536U / sizeof(struct vm_page)) /* KMEM_ZMAX */ + +void * +linuxkpi_vmap_pfn(unsigned long *pfns, unsigned int count, int prot) +{ + vm_page_t m, *ma, fma; + vm_offset_t off, coff; + vm_paddr_t pa; + vm_memattr_t attr; + size_t size; + unsigned int i, c, chunk; + + size = ptoa(count); + off = kva_alloc(size); + if (off == 0) + return (NULL); + vmmap_add((void *)off, size); + + chunk = MIN(count, VMAP_MAX_CHUNK_SIZE); + attr = pgprot2cachemode(prot); + ma = malloc(chunk * sizeof(vm_page_t), M_TEMP, M_WAITOK | M_ZERO); + fma = NULL; + c = 0; + coff = off; + for (i = 0; i < count; i++) { + pa = IDX_TO_OFF(pfns[i]); + m = PHYS_TO_VM_PAGE(pa); + if (m == NULL) { + if (fma == NULL) + fma = malloc(chunk * sizeof(struct vm_page), + M_TEMP, M_WAITOK | M_ZERO); + m = fma + c; + vm_page_initfake(m, pa, attr); + } else { + pmap_page_set_memattr(m, attr); + } + ma[c] = m; + c++; + if (c == chunk || i == count - 1) { + pmap_qenter(coff, ma, c); + if (i == count - 1) + break; + coff += ptoa(c); + c = 0; + memset(ma, 0, chunk * sizeof(vm_page_t)); + if (fma != NULL) + memset(fma, 0, chunk * sizeof(struct vm_page)); + } + } + free(fma, M_TEMP); + free(ma, M_TEMP); + + return ((void *)off); +} + void vunmap(void *addr) {