From nobody Sat Jan 17 02:08:37 2026 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 4dtKrj70prz6PCRB for ; Sat, 17 Jan 2026 02:08:37 +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 4dtKrj5sdTz3KGX for ; Sat, 17 Jan 2026 02:08:37 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1768615717; 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=OkaBDxLje+75/vdX8KZwpQWiLphb1234Mm1H3crw6Ik=; b=rvUBNfhL3xZkqXVLTUT9ApIw5eKh7Qzu3sFyQ0x1bKYHoubgniyJ2HGwA0o9eaemfn1LTq jZLWYXOCWVuc4Z70sYtnFoOVEOTEkekOBqcI1Rfz7SpkKcrMcrLVZOPsAv8WfblK5p/Y66 U7aai6CGfC2QkXIW/abMHFWaWJ2mhgob2mJXGd/26sIn4nJ8Nhld9opnA+hG4gDs6RzmBi /JU4M3qNGszm7m8eyYMPGz8YT7r2pSZ5KXx7RyF205hIpSgTD0uTiUDiJDi8yO96TSnOBt HmLLHTQX3qO90bQB0IkcqpIX3Glb996p2g7rYiGEksY5PvQoAYgu8e/oT8cJIg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1768615717; 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=OkaBDxLje+75/vdX8KZwpQWiLphb1234Mm1H3crw6Ik=; b=qhKW8KAlAufd9IUSRpwynNZYYadtkz73iDES7msKt4i91NH/SGf9NV9NdrLg1FUwqtIr9e S/QWH9BZiyGBsuGvmAJBcd84D02VRYdArLm2TpmNiDlIAfH76aGdXcg6doZov66fqFCnYP S/uh+RPgi7GuAkzV4UdWhGFuTuCOUTmy43oi33btyKkWkg2BWLYPLgeBDD7MAlPcB+69aT jiRs7sJFZ5nkdFUdGQhvXlfbRo9SzMWAqWQ5SKduGOlEX6xDRxOnpnMD3lqk23GGwJlucf kMb8dUNyUS6KaT2T4lOjwYGt+O1ZMeD7wi+BUV5xEAl8sO5Yy5j7KYm1Kiyz9Q== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1768615717; a=rsa-sha256; cv=none; b=YNYTBbDOK/9mTGXkJgPqbrwSk6j4eNAxxX4wlAVZ4z6gbkyr9adV+1izc8nPohXyG4WMtj +zsqpln3dyluLtZ/t7SZcLznN8V1FA2o5xs9bkdlfGJRFLe4mrksxodny2jc2OZAPu5pvj 9KqP+Mp9XGSV7agjVd1bX0LgHG314QM57y4nB84lB+b14rbVtgUIh59LOO3Tw9AjCo2V9R JJqsXNXduuKCuVyrdIKoZCyRKTKQL/RvlTW8SL3wBuCpZVeJ67e0BzdTp1qfPru6mEtNf8 nI5JLDkA81cuJVorWs20aLYtd5N7j/uF2ueJjgIzQZuTsKN+7i87AkyCYW9KNg== 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 4dtKrj5T1szgsH for ; Sat, 17 Jan 2026 02:08:37 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id afab by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Sat, 17 Jan 2026 02:08:37 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Konstantin Belousov Subject: git: d198ad51ea73 - main - swap_pager_getpages(): some pages from ma[] might be bogus 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/main X-Git-Reftype: branch X-Git-Commit: d198ad51ea73bbb162336923a387f52b0b1c1f1d Auto-Submitted: auto-generated Date: Sat, 17 Jan 2026 02:08:37 +0000 Message-Id: <696aef25.afab.6c7615d@gitrepo.freebsd.org> The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=d198ad51ea73bbb162336923a387f52b0b1c1f1d commit d198ad51ea73bbb162336923a387f52b0b1c1f1d Author: Konstantin Belousov AuthorDate: 2026-01-13 13:35:28 +0000 Commit: Konstantin Belousov CommitDate: 2026-01-17 02:08:03 +0000 swap_pager_getpages(): some pages from ma[] might be bogus Same as vnode_pager_generic_getpages_async(), swap_pager_getpages() must handle a possibility of the provided page run to include bogus_page on some positions, when called from sendfile_swapin(). The swap pager is used for tmpfs vnodes. In particular, the bogus page must not be used for pindex calculation, we better not update the flags on it or wait for the flag clearing, and we must not call vm_page_valid() because the function expects busy page. This was bisected down to 72ddb6de1028426 (unix: increase net.local.(stream|seqpacket).(recv|send)space to 64 KiB), which is somewhat surprising, but apparently reasonable because it allowed the run of more than one page for page-in from the swap pager, which now might include valid pages replaced by bogus one. In collaboration with: pho Reviewed by: glebius, markj Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D54713 --- sys/vm/swap_pager.c | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c index 012d89db3310..f6d201309349 100644 --- a/sys/vm/swap_pager.c +++ b/sys/vm/swap_pager.c @@ -1362,14 +1362,22 @@ static int swap_pager_getpages_locked(struct pctrie_iter *blks, vm_object_t object, vm_page_t *ma, int count, int *a_rbehind, int *a_rahead, struct buf *bp) { + vm_page_t m; vm_pindex_t pindex; - int rahead, rbehind; + int i, rahead, rbehind; VM_OBJECT_ASSERT_WLOCKED(object); KASSERT((object->flags & OBJ_SWAP) != 0, ("%s: object not swappable", __func__)); - pindex = ma[0]->pindex; + for (i = 0; i < count; i++) { + m = ma[i]; + if (m != bogus_page) { + pindex = m->pindex - i; + break; + } + } + MPASS(i != count); if (!swp_pager_haspage_iter(pindex, &rbehind, &rahead, blks)) { VM_OBJECT_WUNLOCK(object); uma_zfree(swrbuf_zone, bp); @@ -1399,8 +1407,11 @@ swap_pager_getpages_locked(struct pctrie_iter *blks, vm_object_t object, KASSERT(bp->b_npages <= PBUF_PAGES, ("bp_npages %d (rb %d c %d ra %d) not less than PBUF_PAGES %jd", bp->b_npages, rbehind, count, rahead, (uintmax_t)PBUF_PAGES)); - for (int i = 0; i < bp->b_npages; i++) - bp->b_pages[i]->oflags |= VPO_SWAPINPROG; + for (i = 0; i < bp->b_npages; i++) { + m = bp->b_pages[i]; + if (m != bogus_page) + m->oflags |= VPO_SWAPINPROG; + } bp->b_blkno = swp_pager_meta_lookup(blks, pindex - rbehind); KASSERT(bp->b_blkno != SWAPBLK_NONE, ("no swap blocking containing %p(%jx)", object, (uintmax_t)pindex)); @@ -1448,8 +1459,14 @@ swap_pager_getpages_locked(struct pctrie_iter *blks, vm_object_t object, */ VM_OBJECT_WLOCK(object); /* This could be implemented more efficiently with aflags */ - while ((ma[0]->oflags & VPO_SWAPINPROG) != 0) { - ma[0]->oflags |= VPO_SWAPSLEEP; + for (i = 0; i < count; i++) { + m = ma[i]; + if (m != bogus_page) + break; + } + MPASS(i != count); + while ((m->oflags & VPO_SWAPINPROG) != 0) { + m->oflags |= VPO_SWAPSLEEP; VM_CNT_INC(v_intrans); if (VM_OBJECT_SLEEP(object, &object->handle, PSWP, "swread", hz * 20)) { @@ -1463,9 +1480,10 @@ swap_pager_getpages_locked(struct pctrie_iter *blks, vm_object_t object, /* * If we had an unrecoverable read error pages will not be valid. */ - for (int i = 0; i < count; i++) - if (ma[i]->valid != VM_PAGE_BITS_ALL) + for (i = 0; i < count; i++) { + if (ma[i] != bogus_page && ma[i]->valid != VM_PAGE_BITS_ALL) return (VM_PAGER_ERROR); + } return (VM_PAGER_OK); @@ -1730,6 +1748,9 @@ swp_pager_async_iodone(struct buf *bp) for (i = 0; i < bp->b_npages; ++i) { vm_page_t m = bp->b_pages[i]; + if (m == bogus_page) + continue; + m->oflags &= ~VPO_SWAPINPROG; if (m->oflags & VPO_SWAPSLEEP) { m->oflags &= ~VPO_SWAPSLEEP;