From nobody Mon Oct 20 16:47:19 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 4cr1Yg6cHYz6CkgL; Mon, 20 Oct 2025 16:47:19 +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 4cr1Yg5ynWz3fMK; Mon, 20 Oct 2025 16:47:19 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1760978839; 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=gkgiqMalMIQDQ0+lZbF/mw38nR9vyaKSLyRIGPBKCdI=; b=dy8f/WBqZBrTeExLttFeWj0diY9AkEGMAJaIWOPOTWkAdx2/U1cmq/9CAPJaB/xbpCZ+a7 Lx18ZFDsU6lCI6ISQkYNcYqYw6wtrMr409RbDQrh4FqVxGa7Gk39qUS44NhzK0mxLaSqyI TRho2kW7zOMOyIyod80y9dGuBrsYznj3ZHPqWDzuZMfez2hhg19bbB8fEptaIbShgQiWzQ b5ZSx+83mEhkLB024SAaKi3AaG9UB9gejAMBmbebUWG7Q3+kYWgo2w4oSQZ7phXJHqlkQp zNy2cIOtNe92uNiXVOA4IRibt3h+CRnEaONwL0la+jenrQCLav+qc3rX/WFJag== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1760978839; 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=gkgiqMalMIQDQ0+lZbF/mw38nR9vyaKSLyRIGPBKCdI=; b=XECZEszMCBENoWPdivgyUdshQLkNwWQdO4/vK0PZ0g/6kK87n10+BeqLVzLm/n7+hzpDkd LQ9gnneJUaDlQaOSmnTX8UoHc+AX0PWtBoTfQgnCJeisQY1gArMH+OxLfKJ5Ee/Kuv4GCs 5ukQIMbBmtb7Nw8ju/NO48NzFEbdrepKO5VAS0Cy6QGNyQ55tp8ve7ApYRsZ6dGKwPpPRq 45etY/4c090W4yY/liIwcYFDri2QEA9/Nv517QJKhz+RdwyagU7sT9572k8WulPWhx+IGe +d+9nf8gCELAEWrWtws9XXnkdAmJq7KJpo97lywmzUZWMbwZtHjdJrgTuW2sgg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1760978839; a=rsa-sha256; cv=none; b=bLQfOiMOnfn3aUCuQoF7Z1hvlRBi4QyJh5LikKbrZWYabX4tsbASJLQ3MyHliP9m3vBtpq IdcweWV5HD3orOQmBoPEXeZZWk+YSLPk6NZrytSr2wAsraadRtMb5xEO0LbUAwI5v3DChu VhiBUZQOCFZpYhiPW72M6vZHAB/P8qpgn7Rgw+uaNZ/bSWHkidt10jN0TbuvLWVEfZomol 0fR5JGhEZqq96aE19OQ8bflnmo/gr1okrhJ1aYt2PJY+7//o+qAcYg7MJOkYVuyqcP3XhW 2pviYhtV+5Tgm+5zGMM3NwN265HzhgoNXcxtK6NTJuoe+IXDorCk5GGJxXtACQ== 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 4cr1Yg5XWrz5pY; Mon, 20 Oct 2025 16:47:19 +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 59KGlJTm099705; Mon, 20 Oct 2025 16:47:19 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 59KGlJEF099702; Mon, 20 Oct 2025 16:47:19 GMT (envelope-from git) Date: Mon, 20 Oct 2025 16:47:19 GMT Message-Id: <202510201647.59KGlJEF099702@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Mark Johnston Subject: git: 511311e4f7a6 - stable/15 - vm: Fix iterator usage in vm_thread_stack_create() 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: markj X-Git-Repository: src X-Git-Refname: refs/heads/stable/15 X-Git-Reftype: branch X-Git-Commit: 511311e4f7a6220234bc5bced1e8e0fae96d02a6 Auto-Submitted: auto-generated The branch stable/15 has been updated by markj: URL: https://cgit.FreeBSD.org/src/commit/?id=511311e4f7a6220234bc5bced1e8e0fae96d02a6 commit 511311e4f7a6220234bc5bced1e8e0fae96d02a6 Author: Mark Johnston AuthorDate: 2025-10-16 23:12:54 +0000 Commit: Mark Johnston CommitDate: 2025-10-20 16:46:02 +0000 vm: Fix iterator usage in vm_thread_stack_create() After commit 7a79d0669761 we no longer hold the VM object lock when initializing or advancing the domainset iterator in vm_thread_stack_create(). We could lift the lock out of vm_thread_stack_back() but that poses complications since we cannot allocate KVA with a VM object lock held. Instead of overridding the object's iterator, just borrow that of the current thread. Kernel stacks are basically always allocated with a DOMAINSET_POLICY_PREFER policy, so it's not very important to maintain a global iterator for round-robin allocation. As a part of this, fix up flag handling: make sure we handle M_NOWAIT/M_WAITOK from the caller. Delete a comment in vm_thread_new() which refers to a non-existent consideration (stack swapping has been removed). I suspect vm_thread_new() can use M_WAITOK but opted not to make that change here. Reported by: olce Reviewed by: olce, alc, kib Fixes: 7a79d0669761 ("vm: improve kstack_object pindex calculation to avoid pindex holes") MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D52982 (cherry picked from commit 3b9b64457676561b8de2bec7c94c561bbd807b0c) --- sys/vm/vm_glue.c | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/sys/vm/vm_glue.c b/sys/vm/vm_glue.c index e0f1807a1b32..18d789c59281 100644 --- a/sys/vm/vm_glue.c +++ b/sys/vm/vm_glue.c @@ -441,19 +441,16 @@ vm_thread_kstack_arena_release(void *arena, vmem_addr_t addr, vmem_size_t size) * Create the kernel stack for a new thread. */ static vm_offset_t -vm_thread_stack_create(struct domainset *ds, int pages) +vm_thread_stack_create(struct domainset *ds, int pages, int flags) { vm_page_t ma[KSTACK_MAX_PAGES]; struct vm_domainset_iter di; - int req = VM_ALLOC_NORMAL; - vm_object_t obj; + int req; vm_offset_t ks; int domain, i; - obj = vm_thread_kstack_size_to_obj(pages); - if (vm_ndomains > 1) - obj->domain.dr_policy = ds; - vm_domainset_iter_page_init(&di, obj, 0, &domain, &req); + vm_domainset_iter_policy_init(&di, ds, &domain, &flags); + req = malloc2vm_flags(flags); do { /* * Get a kernel virtual address for this thread's kstack. @@ -480,7 +477,7 @@ vm_thread_stack_create(struct domainset *ds, int pages) vm_page_valid(ma[i]); pmap_qenter(ks, ma, pages); return (ks); - } while (vm_domainset_iter_page(&di, obj, &domain, NULL) == 0); + } while (vm_domainset_iter_policy(&di, &domain) == 0); return (0); } @@ -532,15 +529,9 @@ vm_thread_new(struct thread *td, int pages) ks = 0; if (pages == kstack_pages && kstack_cache != NULL) ks = (vm_offset_t)uma_zalloc(kstack_cache, M_NOWAIT); - - /* - * Ensure that kstack objects can draw pages from any memory - * domain. Otherwise a local memory shortage can block a process - * swap-in. - */ if (ks == 0) ks = vm_thread_stack_create(DOMAINSET_PREF(PCPU_GET(domain)), - pages); + pages, M_NOWAIT); if (ks == 0) return (0); @@ -660,7 +651,8 @@ kstack_import(void *arg, void **store, int cnt, int domain, int flags) ds = DOMAINSET_PREF(domain); for (i = 0; i < cnt; i++) { - store[i] = (void *)vm_thread_stack_create(ds, kstack_pages); + store[i] = (void *)vm_thread_stack_create(ds, kstack_pages, + flags); if (store[i] == NULL) break; }