From nobody Thu Sep 4 00:45:00 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 4cHLNX50F7z66TC4; Thu, 04 Sep 2025 00:45:00 +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 4cHLNX3L78z44vl; Thu, 04 Sep 2025 00:45:00 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1756946700; 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=Cmoxg2OxhhlL3WlTukY3aUVKx4mgouPZi0Nd1JNyVRg=; b=L/0t2RlzrXcWhYtMxiQhZOiCIfkX7N+t87esuxJpgbFznKc1IscY5hMkOJjIgLH6J3S5rH OOIQKCvV+5ou2M5Z4uCDTV2vOmKWX+BzOZ93jae1DPPArfmbDDHb3+C2RJJ7mnv19fNmBz s24VLqVPvkxtInMp583Cnvku0aijtFCpA6ZPBYsNbXRnFmVWAQRIvdbVA1a8sGtvxce2f2 8t3uNtTELgm0MT540hjMafXVPo4LJTd18bpd+5usWyz5BKrhYrGgfmh/GKHv66vrQ9EZ1N L+tv5twvfJzn7sSGUnA8T1MpMuvs3qXBSeLyiDK/TRQRtHGqqOJhkhqKDUzMlA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1756946700; 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=Cmoxg2OxhhlL3WlTukY3aUVKx4mgouPZi0Nd1JNyVRg=; b=lPdx9IMVGAZ4fPuToF2H26mfzUjyOrrt9iu8J9JwwePuXnvL1ObeF+qRZA8Bsnfe5fPSiD NrdBwtwNukIfQKtap3YghaR4GOBvVibJ87T3ARzNDqtGmgeCFLAIBlveM2IZxpfapOa2mI VLtuVp5aThuvs7DBBcu/Ty8PjB3eUor1NJTxIG7j1MIb0YMf/MaLNr/SkUtGoQVMT3SWsH eRpkohQj7zEY46oRDRgMcyz1cCufBqCOD9ZSt7HOX8tJuSPhbqGpuxA6Wq+XLnRIb32ZhD N3/C6FPpYjE51skfMGfp+w6hCRUwtcrCyaqYjKSZq8KFwGcWksFREAm3krOWew== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1756946700; a=rsa-sha256; cv=none; b=l90mrjnFDnOttOpAQ6m3kzF93l63fF+h4/3I2BiWuX8e8nseQJnVlj8fTPzqEGKCykSj3D qXf41rX87hcQGqtoKLSHGdqQ0mHpCJhA87vI25zl3Ge423dALYu39qXvt77Y2nkuXLZ1IT dj1yZ1eBz/pfZ8fHfqtGlIWU3fBaeen5wdK/C1H8J3pYHOGUT3cHrWBknTVpFDXZBL0hNG PgjzF4YMK3GLONtqCkqWiuieCQy2g07P/0ry8dbEvOyhhhkXEwe3eDz7Tn3U0Pcgnz2tEU 7drJ5Fb/IV8ua0eHXTgQFjL9UnSD5EPxWgHoOe0ca2aR7CyB7xU1XmmUd428Qg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (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 did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4cHLNX2tZTzh1W; Thu, 04 Sep 2025 00:45:00 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 5840j0uG060666; Thu, 4 Sep 2025 00:45:00 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 5840j08E060663; Thu, 4 Sep 2025 00:45:00 GMT (envelope-from git) Date: Thu, 4 Sep 2025 00:45:00 GMT Message-Id: <202509040045.5840j08E060663@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Konstantin Belousov Subject: git: 12b17b1cccd2 - stable/14 - vm_fault: improve interface for vm_fault_quick_hold_pages() 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: kib X-Git-Repository: src X-Git-Refname: refs/heads/stable/14 X-Git-Reftype: branch X-Git-Commit: 12b17b1cccd2b43de455a9c1d53a371ce67e4efa Auto-Submitted: auto-generated The branch stable/14 has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=12b17b1cccd2b43de455a9c1d53a371ce67e4efa commit 12b17b1cccd2b43de455a9c1d53a371ce67e4efa Author: Konstantin Belousov AuthorDate: 2025-08-26 15:03:10 +0000 Commit: Konstantin Belousov CommitDate: 2025-09-04 00:43:15 +0000 vm_fault: improve interface for vm_fault_quick_hold_pages() (cherry picked from commit 041efb55ec8ba4e379fd1d0a75bd0f637e3d9676) --- sys/vm/vm_extern.h | 2 ++ sys/vm/vm_fault.c | 81 ++++++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 63 insertions(+), 20 deletions(-) diff --git a/sys/vm/vm_extern.h b/sys/vm/vm_extern.h index 566c837aab7e..6057131668e1 100644 --- a/sys/vm/vm_extern.h +++ b/sys/vm/vm_extern.h @@ -95,6 +95,8 @@ int vm_fault_disable_pagefaults(void); void vm_fault_enable_pagefaults(int save); int vm_fault_quick_hold_pages(vm_map_t map, vm_offset_t addr, vm_size_t len, vm_prot_t prot, vm_page_t *ma, int max_count); +int vm_fault_quick_hold_pages_e(vm_map_t map, vm_offset_t addr, vm_size_t len, + vm_prot_t prot, vm_page_t *ma, int max_count, int *ppages_count); int vm_fault_trap(vm_map_t map, vm_offset_t vaddr, vm_prot_t fault_type, int fault_flags, int *signo, int *ucode); int vm_forkproc(struct thread *, struct proc *, struct thread *, diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c index 9d7c5d452a0b..0d6850d9e602 100644 --- a/sys/vm/vm_fault.c +++ b/sys/vm/vm_fault.c @@ -1971,32 +1971,43 @@ vm_fault_prefault(const struct faultstate *fs, vm_offset_t addra, } /* - * Hold each of the physical pages that are mapped by the specified range of - * virtual addresses, ["addr", "addr" + "len"), if those mappings are valid - * and allow the specified types of access, "prot". If all of the implied - * pages are successfully held, then the number of held pages is returned - * together with pointers to those pages in the array "ma". However, if any - * of the pages cannot be held, -1 is returned. + * Hold each of the physical pages that are mapped by the specified + * range of virtual addresses, ["addr", "addr" + "len"), if those + * mappings are valid and allow the specified types of access, "prot". + * If all of the implied pages are successfully held, then the number + * of held pages is assigned to *ppages_count, together with pointers + * to those pages in the array "ma". The returned value is zero. + * + * However, if any of the pages cannot be held, an error is returned, + * and no pages are held. + * Error values: + * ENOMEM - the range is not valid + * EINVAL - the provided vm_page array is too small to hold all pages + * EAGAIN - a page was not mapped, and the thread is in nofaulting mode + * EFAULT - a page with requested permissions cannot be mapped + * (more detailed result from vm_fault() is lost) */ int -vm_fault_quick_hold_pages(vm_map_t map, vm_offset_t addr, vm_size_t len, - vm_prot_t prot, vm_page_t *ma, int max_count) +vm_fault_quick_hold_pages_e(vm_map_t map, vm_offset_t addr, vm_size_t len, + vm_prot_t prot, vm_page_t *ma, int max_count, int *ppages_count) { vm_offset_t end, va; vm_page_t *mp; - int count; + int count, error; boolean_t pmap_failed; - if (len == 0) + if (len == 0) { + *ppages_count = 0; return (0); + } end = round_page(addr + len); addr = trunc_page(addr); if (!vm_map_range_valid(map, addr, end)) - return (-1); + return (ENOMEM); if (atop(end - addr) > max_count) - panic("vm_fault_quick_hold_pages: count > max_count"); + return (EINVAL); count = atop(end - addr); /* @@ -2038,19 +2049,49 @@ vm_fault_quick_hold_pages(vm_map_t map, vm_offset_t addr, vm_size_t len, * the proper behaviour explicitly. */ if ((prot & VM_PROT_QUICK_NOFAULT) != 0 && - (curthread->td_pflags & TDP_NOFAULTING) != 0) - goto error; - for (mp = ma, va = addr; va < end; mp++, va += PAGE_SIZE) + (curthread->td_pflags & TDP_NOFAULTING) != 0) { + error = EAGAIN; + goto fail; + } + for (mp = ma, va = addr; va < end; mp++, va += PAGE_SIZE) { if (*mp == NULL && vm_fault(map, va, prot, - VM_FAULT_NORMAL, mp) != KERN_SUCCESS) - goto error; + VM_FAULT_NORMAL, mp) != KERN_SUCCESS) { + error = EFAULT; + goto fail; + } + } } - return (count); -error: + *ppages_count = count; + return (0); +fail: for (mp = ma; mp < ma + count; mp++) if (*mp != NULL) vm_page_unwire(*mp, PQ_INACTIVE); - return (-1); + return (error); +} + + /* + * Hold each of the physical pages that are mapped by the specified range of + * virtual addresses, ["addr", "addr" + "len"), if those mappings are valid + * and allow the specified types of access, "prot". If all of the implied + * pages are successfully held, then the number of held pages is returned + * together with pointers to those pages in the array "ma". However, if any + * of the pages cannot be held, -1 is returned. + */ +int +vm_fault_quick_hold_pages(vm_map_t map, vm_offset_t addr, vm_size_t len, + vm_prot_t prot, vm_page_t *ma, int max_count) +{ + int error, pages_count; + + error = vm_fault_quick_hold_pages_e(map, addr, len, prot, ma, + max_count, &pages_count); + if (error != 0) { + if (error == EINVAL) + panic("vm_fault_quick_hold_pages: count > max_count"); + return (-1); + } + return (pages_count); } /*