From nobody Fri Jun 5 16:11:38 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 4gX5zG4pN2z6g5J8 for ; Fri, 05 Jun 2026 16:11:38 +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" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4gX5zG4BTmz40Pt for ; Fri, 05 Jun 2026 16:11:38 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1780675898; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=QLEzjOCr1Xhj80Qau2so0m0gIxwSsUPhpmNG+dZvUJM=; b=P84PQ9tNoygTm3yBhVZ5c3tN0ZP0JByX0wKqz8+TGB1+61OQbHYJ7r4DPeeVRPKNaDnWUk PhtHIpJJkVbIzL+6xWaJZVfxYX5+1uCWLQ3GCz89jOTgCeflXEsfYLiNLuy8T5kmMNAeND /vw203sItAFdgzsJcqTkWDSEDRFyVsX9B3qJYTjd5exOKnN2Z36ReH9m2DvbelPCJLedw6 2ivGiFfcQYxRii3zCeIN2yhsa716togsqKwgrKnBQ7b4Co1vqmEVCzreytMQRK9llAondS Z+BCWyHe5mFvA6RQCiScfjYna6RU4fQOBla1Ejayt8DQlXMlz839XRb/fMT9iA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1780675898; a=rsa-sha256; cv=none; b=mQTUL1uqZOn5GvNd1lksBFjf2xEPwLFuUsZgccSjw/4fUDGIjlBRQd4jzCik1BWFwZMRjA I/EORjKdFoHf0ggNuejBz7rjq8NljiYI2Qi4M9l+dcJULc7H0bCmWeGt7IWnP+B4lNGYrQ InM2ax75p/6OmSHAGVJyRGC4ctFN5e1Sxo13Hmst44bSrScn53pzB6CWjVife+1JSfDWn/ U2+ES0VFrH7Za1kKZTW3K3ywNU3Q9KSgyP1Joy45g+DwTuiTdCofmzmfTcVCAzTlDIrmCT /i/dzcOsBh+ZhZuBFJQsv8FZHztuoFFq3sYjgE/oZ+/zAgaD+3OIds8etXok/w== 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=1780675898; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=QLEzjOCr1Xhj80Qau2so0m0gIxwSsUPhpmNG+dZvUJM=; b=daOs6pGeXjimUnXfKGNnD0gx2rlUVaFRNlhzg29n2IUODAAxLf0hqVp+Xt2TbtkiueB7oR 0NSTgLkIm2PMZ3OPPDDDmrtXGw6VsJvUap7ahwxHq8WpmK7+xfDQWhKCMEdkH+Lzw5VlJh JVTi+ACg7t4E5LfDsoavDYnwDrSwFt9+pul6M8K9SIJPdqo+vHfjmlF7Yypg1GDRHLL5Uc h3c+1z/soSYA3VddgHfGo1sZh8SY3b4SSjXgprEpSx0h7LDteP4Z6gy3NkBwk5718oInpp DR6rPVcOloIXmiUnFHgqKtUAmAIYRpdpXZmYPz2yGs8z+lMZgD1w9j3eNOkb9A== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4gX5zG3Qkszcqk for ; Fri, 05 Jun 2026 16:11:38 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 45131 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Fri, 05 Jun 2026 16:11:38 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Cc: Antranig Vartanian From: Bojan Novk=?utf-8?Q?ovi=C4=87?= Subject: git: 8f6c577c9f70 - main - bhyve(8): allow cpu pinning using N-M:X-Y ranges 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 List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: bnovkov X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 8f6c577c9f706aea6f138fa1bec27029d4ab587d Auto-Submitted: auto-generated Date: Fri, 05 Jun 2026 16:11:38 +0000 Message-Id: <6a22f53a.45131.71378d33@gitrepo.freebsd.org> The branch main has been updated by bnovkov: URL: https://cgit.FreeBSD.org/src/commit/?id=8f6c577c9f706aea6f138fa1bec27029d4ab587d commit 8f6c577c9f706aea6f138fa1bec27029d4ab587d Author: Antranig Vartanian AuthorDate: 2026-06-05 15:34:18 +0000 Commit: Bojan Novković CommitDate: 2026-06-05 16:07:49 +0000 bhyve(8): allow cpu pinning using N-M:X-Y ranges bhyve's -p allows to pin guest's virtual CPU vcpu to hostcpu, however this becomes very tedious work when you have to pin more than a single CPU. This allows to pass a range to -p, e.g. -p 0-3:4-7 which will pin the cpus 0:4, 1:5, 2:6, 3:7. The ranges must be equal and the CPU numbers must be ascending. Sponsored by: Armenian Bioinformatics Institute Reviewed by: corvink, markj Tested by: bnovkov MFC after: 3 weeks Differential Revision: https://reviews.freebsd.org/D54937 --- usr.sbin/bhyve/aarch64/bhyverun_machdep.c | 5 ++-- usr.sbin/bhyve/amd64/bhyverun_machdep.c | 5 ++-- usr.sbin/bhyve/bhyverun.c | 38 ++++++++++++++++++++++++------- usr.sbin/bhyve/riscv/bhyverun_machdep.c | 5 ++-- 4 files changed, 39 insertions(+), 14 deletions(-) diff --git a/usr.sbin/bhyve/aarch64/bhyverun_machdep.c b/usr.sbin/bhyve/aarch64/bhyverun_machdep.c index 10018d082f7e..7d82784131b4 100644 --- a/usr.sbin/bhyve/aarch64/bhyverun_machdep.c +++ b/usr.sbin/bhyve/aarch64/bhyverun_machdep.c @@ -100,7 +100,8 @@ bhyve_usage(int code) "Usage: %s [-CDHhSW]\n" " %*s [-c [[cpus=]numcpus][,sockets=n][,cores=n][,threads=n]]\n" " %*s [-k config_file] [-m mem] [-o var=value]\n" - " %*s [-p vcpu:hostcpu] [-r file] [-s pci] [-U uuid] vmname\n" + " %*s [-p vcpuN[-vcpuM]]:hostcpuX[-hostcpuY]\n" + " %*s [-r file] [-s pci] [-U uuid] vmname\n" " -C: include guest memory in core file\n" " -c: number of CPUs and/or topology specification\n" " -D: destroy on power-off\n" @@ -116,7 +117,7 @@ bhyve_usage(int code) " -U: UUID\n" " -W: force virtio to use single-vector MSI\n", progname, (int)strlen(progname), "", (int)strlen(progname), "", - (int)strlen(progname), ""); + (int)strlen(progname), "", (int)strlen(progname), ""); exit(code); } diff --git a/usr.sbin/bhyve/amd64/bhyverun_machdep.c b/usr.sbin/bhyve/amd64/bhyverun_machdep.c index 538d031fd1a4..98a756551272 100644 --- a/usr.sbin/bhyve/amd64/bhyverun_machdep.c +++ b/usr.sbin/bhyve/amd64/bhyverun_machdep.c @@ -78,7 +78,8 @@ bhyve_usage(int code) "Usage: %s [-aCDeHhPSuWwxY]\n" " %*s [-c [[cpus=]numcpus][,sockets=n][,cores=n][,threads=n]]\n" " %*s [-G port] [-k config_file] [-l lpc] [-m mem] [-o var=value]\n" - " %*s [-p vcpu:hostcpu] [-r file] [-s pci] [-U uuid] vmname\n" + " %*s [-p vcpuN[-vcpuM]]:hostcpuX[-hostcpuY]\n" + " %*s [-r file] [-s pci] [-U uuid] vmname\n" " -a: local apic is in xAPIC mode (deprecated)\n" " -C: include guest memory in core file\n" " -c: number of CPUs and/or topology specification\n" @@ -108,7 +109,7 @@ bhyve_usage(int code) " -x: local APIC is in x2APIC mode\n" " -Y: disable MPtable generation\n", progname, (int)strlen(progname), "", (int)strlen(progname), "", - (int)strlen(progname), ""); + (int)strlen(progname), "", (int)strlen(progname), ""); exit(code); } diff --git a/usr.sbin/bhyve/bhyverun.c b/usr.sbin/bhyve/bhyverun.c index 994f0f1fef21..b5e7a4709fb4 100644 --- a/usr.sbin/bhyve/bhyverun.c +++ b/usr.sbin/bhyve/bhyverun.c @@ -357,18 +357,12 @@ calc_topology(void) guest_ncpus = ncpus; } -int -bhyve_pincpu_parse(const char *opt) +static int +bhyve_pincpu(int vcpu, int pcpu) { const char *value; char *newval; char key[16]; - int vcpu, pcpu; - - if (sscanf(opt, "%d:%d", &vcpu, &pcpu) != 2) { - fprintf(stderr, "invalid format: %s\n", opt); - return (-1); - } if (vcpu < 0) { fprintf(stderr, "invalid vcpu '%d'\n", vcpu); @@ -395,6 +389,34 @@ bhyve_pincpu_parse(const char *opt) return (0); } +int +bhyve_pincpu_parse(const char *opt) +{ + int vcpu_first, vcpu_last, pcpu_first, pcpu_last; + int vcpu, pcpu; + + if (sscanf(opt, "%d-%d:%d-%d", &vcpu_first, &vcpu_last, &pcpu_first, &pcpu_last) == 4) { + if (vcpu_first > vcpu_last || pcpu_first > pcpu_last) { + fprintf(stderr, "invalid range (must be ascending): %s\n", opt); + return (-1); + } + if ((vcpu_last - vcpu_first) != (pcpu_last - pcpu_first)) { + fprintf(stderr, "range sizes do not match: %s\n", opt); + return (-1); + } + for (vcpu = vcpu_first, pcpu = pcpu_first; vcpu <= vcpu_last; vcpu++, pcpu++) + if (bhyve_pincpu(vcpu, pcpu) != 0) + return (-1); + return (0); + } + + if (sscanf(opt, "%d:%d", &vcpu, &pcpu) == 2) + return (bhyve_pincpu(vcpu, pcpu)); + + fprintf(stderr, "invalid format: %s\n", opt); + return (-1); +} + static void parse_cpuset(int vcpu, const char *list, cpuset_t *set) { diff --git a/usr.sbin/bhyve/riscv/bhyverun_machdep.c b/usr.sbin/bhyve/riscv/bhyverun_machdep.c index a90a508901bc..adbba6bcce60 100644 --- a/usr.sbin/bhyve/riscv/bhyverun_machdep.c +++ b/usr.sbin/bhyve/riscv/bhyverun_machdep.c @@ -95,7 +95,8 @@ bhyve_usage(int code) "Usage: %s [-CDHhSW]\n" " %*s [-c [[cpus=]numcpus][,sockets=n][,cores=n][,threads=n]]\n" " %*s [-k config_file] [-m mem] [-o var=value]\n" - " %*s [-p vcpu:hostcpu] [-r file] [-s pci] [-U uuid] vmname\n" + " %*s [-p vcpuN[-vcpuM]]:hostcpuX[-hostcpuY]\n" + " %*s [-r file] [-s pci] [-U uuid] vmname\n" " -C: include guest memory in core file\n" " -c: number of CPUs and/or topology specification\n" " -D: destroy on power-off\n" @@ -110,7 +111,7 @@ bhyve_usage(int code) " -U: UUID\n" " -W: force virtio to use single-vector MSI\n", progname, (int)strlen(progname), "", (int)strlen(progname), "", - (int)strlen(progname), ""); + (int)strlen(progname), "", (int)strlen(progname), ""); exit(code); }