From nobody Tue Apr 8 13:40:38 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 4ZX6fH0f7Gz5sQFs; Tue, 08 Apr 2025 13:40:39 +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 "R10" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4ZX6fG6pxvz3CWP; Tue, 08 Apr 2025 13:40:38 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1744119639; 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=nPmUpI0AQ83489OPQYssp14LbHCdK7wx3DGtMVYd8WE=; b=RqvnAP1eVfdSF3AunUHDxrlb1NobZwDMxJORIpU2zORwrqEw3dISrEtUUOMIptPAlsZLAc HAsweyH3zupn4j0fRVvzGYiF1M70OZeqSFbHdTbzVGbjizK+c2wVmkS/xmYVKFjXmACx+q dJk1+BOaaUnvnoi4kuHj5MlGCoLtydLy/DuPC9wbGk5g9h0mqgTBnaLB8by9E1ok89ilhc GvoC+L4ctbkmSgSrH44as8pMG2GEXQX5dEW7fewXreIe1J1+iSn/F37z5prA/gxT4T0210 Y1v61LnBs3JtPxwdzQvtes156NPXym4jN1tS5pt1kAuB/2TV1kSf2PxZmOiFGQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1744119639; a=rsa-sha256; cv=none; b=ZGbauTQf64RFowDS/dBFamMQjl4p0e2xbC2Fhr6/tQiXAJiyvONRhlfQwFJbMvRzuG1pT9 M2RRft3A0VcrLRcw9Uoam24S10Ai/k86jJmEV4I/WKT86Xrfp57/4v5jwWpbByOFzSmQZg 78W515TMRzuMpDTvUXdvJ+lNXauW7Slpl+vqK3jSAcHOuOC8JDd7mk9+USvZHv74ufZFim u+AbRIWczhZ/sxdQBqNdn7Vw6T7slin+Cs8LUnx6wkGKBZX1Zb7lJ3E2rmsz/OBU3YawS2 KhjmoOJzZPQOYycrXJUQE+nUHCmgbyMh6MZzISxnRR7lXqecy+UuCHAnlrpM7A== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1744119639; 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=nPmUpI0AQ83489OPQYssp14LbHCdK7wx3DGtMVYd8WE=; b=HjN5rtJbco5PSP7WQcnDUcGBKCO2KMoMaJDjUH/1G4KCMclV2p1J1biVISK+v8cIIQzheI zvjmaIY4gCQmp01BaaLcHVX+bfymNfWR8xjD38FT57EuQmwfjh+tVENj1MMDj0WrCFaohD yMCJgJd3HLX4R8l4ypqOOS9vk8YA4hMBXdnUaFUdHFnvISYfFVyVQ883/bdKL2QcNvCygi uiV+D0dW1gyZB1Yn6F5IllNpgYKOsgRqVcQ4VTV7LYi+55zpn27Q2u4Fn3J8U+z7sv8Fv9 vPAd4S5CkbQSwscjkjFx3zD7XZai1hghxFZU48p9i7JfACRn4+mD6Gl7ONylTg== 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 4ZX6fG6Nvyzb5l; Tue, 08 Apr 2025 13:40:38 +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 538DecPv030620; Tue, 8 Apr 2025 13:40:38 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 538DecTS030617; Tue, 8 Apr 2025 13:40:38 GMT (envelope-from git) Date: Tue, 8 Apr 2025 13:40:38 GMT Message-Id: <202504081340.538DecTS030617@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Olivier Certner Subject: git: 088dd40169b1 - stable/14 - vm_phys_add_seg(): Check for bad segments, allow empty ones 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: olce X-Git-Repository: src X-Git-Refname: refs/heads/stable/14 X-Git-Reftype: branch X-Git-Commit: 088dd40169b1186bd09164daea10e26bdb833eee Auto-Submitted: auto-generated The branch stable/14 has been updated by olce: URL: https://cgit.FreeBSD.org/src/commit/?id=088dd40169b1186bd09164daea10e26bdb833eee commit 088dd40169b1186bd09164daea10e26bdb833eee Author: Olivier Certner AuthorDate: 2024-10-09 17:04:34 +0000 Commit: Olivier Certner CommitDate: 2025-04-08 13:38:21 +0000 vm_phys_add_seg(): Check for bad segments, allow empty ones A bad specification is if 'start' is strictly greater than 'end', or bounds are not page aligned. The latter was already tested under INVARIANTS, but now will be also on production kernels. The reason is that vm_phys_early_startup() pours early segments into the final phys_segs[] array via vm_phys_add_seg(), but vm_phys_early_add_seg() did not check their validity. Checking segments once and for all in vm_phys_add_seg() avoids duplicating validity tests and is possible since early segments are not used before being poured into phys_segs[]. Finally, vm_phys_add_seg() is not performance critical. Allow empty segments and discard them (silently, unless 'bootverbose' is true), as vm_page_startup() was testing for this case before calling vm_phys_add_seg(), and we felt the same test in vm_phys_early_startup() was due before calling vm_phys_add_seg(). As a consequence, remove the empty segment test from vm_page_startup(). Reviewed by: markj MFC after: 1 week Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D48627 (cherry picked from commit f30309abcce4cec891413da5cba2db92dd6ab0d7) --- sys/vm/vm_page.c | 3 +-- sys/vm/vm_phys.c | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c index 7eebf30e19a7..49628b94b12b 100644 --- a/sys/vm/vm_page.c +++ b/sys/vm/vm_page.c @@ -746,8 +746,7 @@ vm_page_startup(vm_offset_t vaddr) * physical pages. */ for (i = 0; phys_avail[i + 1] != 0; i += 2) - if (vm_phys_avail_size(i) != 0) - vm_phys_add_seg(phys_avail[i], phys_avail[i + 1]); + vm_phys_add_seg(phys_avail[i], phys_avail[i + 1]); /* * Initialize the physical memory allocator. diff --git a/sys/vm/vm_phys.c b/sys/vm/vm_phys.c index 83038b2af0ea..98ea22fd2b9d 100644 --- a/sys/vm/vm_phys.c +++ b/sys/vm/vm_phys.c @@ -458,10 +458,18 @@ vm_phys_add_seg(vm_paddr_t start, vm_paddr_t end) { vm_paddr_t paddr; - KASSERT((start & PAGE_MASK) == 0, - ("vm_phys_define_seg: start is not page aligned")); - KASSERT((end & PAGE_MASK) == 0, - ("vm_phys_define_seg: end is not page aligned")); + if ((start & PAGE_MASK) != 0) + panic("%s: start (%jx) is not page aligned", __func__, + (uintmax_t)start); + if ((end & PAGE_MASK) != 0) + panic("%s: end (%jx) is not page aligned", __func__, + (uintmax_t)end); + if (start > end) + panic("%s: start (%jx) > end (%jx)!", __func__, + (uintmax_t)start, (uintmax_t)end); + + if (start == end) + return; /* * Split the physical memory segment if it spans two or more free