From nobody Tue Jan 13 14:03:23 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 4dr9vJ12g3z6Nxcd for ; Tue, 13 Jan 2026 14:03:24 +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 4dr9vH6CBqz40TL for ; Tue, 13 Jan 2026 14:03:23 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1768313003; 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=5mBqq7WYMZOv0iAjVSAgC+0oGlwIPDfQeYUDYHHx70k=; b=S4wuOIz2XCBCHc+NUsn3aEkCwXzksMbg1sDdA+GuN5Ucs6S0NDnOOH8oYMFTxyNPyet+yD a8AW9fNSTD9OKXC5cv6Wl+QxogIofSOSVXCW14bXJysnG4kGZkxNZcudaUXrjEvCKNqt/a czdxmldKIEWDjwf1vFyfojOqoCWVYjIbfF4qzJF9c5NvEIxADEyfXt55csKbuFAlyflxbR 34FS3UPvSYY+yL+eMwvymGzImZeUbLV5cdZ8QbClmTwf+VagRy8StDZOlx6vxp3j6EUnFu OkUrU2tLkQebDnQzmO/DH2y/NxjcKCktATpHduBcOgjoN9jYooJDQwwo7thLPQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1768313003; 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=5mBqq7WYMZOv0iAjVSAgC+0oGlwIPDfQeYUDYHHx70k=; b=AyymZy0Qki3st4CIXRsHmpWPOIXm0xI5lEPuR5vZyb1btuH5ELiXbsSq7pHAqz+9fD/C4Z 6ubNtops3lWIe5dXFFqyuNTDugmsxuKEFUW9wqPa9GvFc7aKYtILRWoEOVJTlQkCG/h7n0 6CC0t+ru2RcjZtv/totAa91QtskoWt2ZhWMfGA7amdHDI3XKsdgiSk6KwX0HA79n5kMP5t LVXNSf3GLITUOMtlWAcY5X5OhhFB+PRupp+uESPrGsFGP/ruYqUfvJVEP4dytPdE4Q2eIc jRlZAzdtwjESpitopNZ5eMdUWesudNfbW0HkjOVFb9bOL2gKSEF+Jubn8BxrhA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1768313003; a=rsa-sha256; cv=none; b=VhkYzf4uGbolTJijmcyNFDzJlKw45/JzdgGHwsNQlPRX5npmfKOz90yznhuGF3RemRRReF qdiCo3g5JdOB6K2Sv2SRtJuuLI9NXaIJHFKFyZju9dRiVvwpgeheEA7S75Exq6EDZPDNdd n2bTlRoIcWX3F9X/OUgiy818Sqg95cjCnDQoWQutMtYeb/mrG/CQuWE+HS5biQKYX4tmJq /4lZSezNNybdBCZ53BWVIZtEk6/1Dp0GOv1RU033OjgDOl0VuUkVnUujpfhrQLTMGy/Ncf WW34xs6xY0oW5rtqwEhz4zVZUijAVRJaxokkp/m7GJ9xRzpDpADDt/UYYznAgA== 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 4dr9vH5kc4zww for ; Tue, 13 Jan 2026 14:03:23 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 86f6 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Tue, 13 Jan 2026 14:03:23 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Konstantin Belousov Subject: git: de770681234d - main - rfork(2): fix swap accounting in vmspace_unshare() 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: de770681234d001a1f4cdb8121179331dc3a2def Auto-Submitted: auto-generated Date: Tue, 13 Jan 2026 14:03:23 +0000 Message-Id: <696650ab.86f6.171ec864@gitrepo.freebsd.org> The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=de770681234d001a1f4cdb8121179331dc3a2def commit de770681234d001a1f4cdb8121179331dc3a2def Author: Konstantin Belousov AuthorDate: 2026-01-04 00:19:36 +0000 Commit: Konstantin Belousov CommitDate: 2026-01-13 14:03:14 +0000 rfork(2): fix swap accounting in vmspace_unshare() When an attempt to increase the swap charge for the ucred failed, we must forcibly increase the charge to allow the vmspace_destroy() operation to correctly un-charge the accumulated objects. Add a swap_reserve_force_by_cred() helper and use it in vmspace_unshare(), same as it is done in normal fork operations. Reviewed by: markj Tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D54572 --- sys/vm/swap_pager.c | 10 ++++++++-- sys/vm/vm.h | 1 + sys/vm/vm_map.c | 7 +++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c index e0bdca07ff0f..3f077289ac30 100644 --- a/sys/vm/swap_pager.c +++ b/sys/vm/swap_pager.c @@ -330,7 +330,7 @@ out_error: } void -swap_reserve_force(vm_ooffset_t incr) +swap_reserve_force_by_cred(vm_ooffset_t incr, struct ucred *cred) { u_long pincr; @@ -346,7 +346,13 @@ swap_reserve_force(vm_ooffset_t incr) #endif pincr = atop(incr); atomic_add_long(&swap_reserved, pincr); - swap_reserve_force_rlimit(pincr, curthread->td_ucred); + swap_reserve_force_rlimit(pincr, cred); +} + +void +swap_reserve_force(vm_ooffset_t incr) +{ + swap_reserve_force_by_cred(incr, curthread->td_ucred); } void diff --git a/sys/vm/vm.h b/sys/vm/vm.h index d28c84dd1c95..0da1891dfcc7 100644 --- a/sys/vm/vm.h +++ b/sys/vm/vm.h @@ -168,6 +168,7 @@ void vm_ksubmap_init(struct kva_md_info *); bool swap_reserve(vm_ooffset_t incr); bool swap_reserve_by_cred(vm_ooffset_t incr, struct ucred *cred); void swap_reserve_force(vm_ooffset_t incr); +void swap_reserve_force_by_cred(vm_ooffset_t incr, struct ucred *cred); void swap_release(vm_ooffset_t decr); void swap_release_by_cred(vm_ooffset_t decr, struct ucred *cred); diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c index 68dcadd2b2f1..4c33b786eaa0 100644 --- a/sys/vm/vm_map.c +++ b/sys/vm/vm_map.c @@ -4957,6 +4957,13 @@ vmspace_unshare(struct proc *p) if (newvmspace == NULL) return (ENOMEM); if (!swap_reserve_by_cred(fork_charge, p->p_ucred)) { + /* + * The swap reservation failed. The accounting from + * the entries of the copied newvmspace will be + * subtracted in vmspace_free(), so force the + * reservation there. + */ + swap_reserve_force_by_cred(fork_charge, p->p_ucred); vmspace_free(newvmspace); return (ENOMEM); }