From nobody Wed May 27 21:00:33 2026 X-Original-To: dev-commits-src-main@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 4gQhpp513Rz6fgpK for ; Wed, 27 May 2026 21:00:34 +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 4gQhpn69Dbz3PJg for ; Wed, 27 May 2026 21:00:33 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1779915633; 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=gfPlbozd8aELjELqMumpqpHVIqq5lF0Alfwd8zH98rE=; b=QeVHgxpJcZSIS86MbyyaGlfs1qGhdRA44V9pofh5doENyvilUH5NE48kdVK1w9IHOi5/Ew Mm8LKYmW23m6+EtcFccxbftv4o4CLOhn3clso8ha/jPhP2EYhYq64rXmGwogvCGI/0D4ZS WLcpXQ4g5hmR8Znaehgaq96Pa/2FoV++G54MS/X9bTIrM25JuGZCU/MDCmNjLfe0Op4JFl 4GuK2vXP3VYledw9/ckUA/b05PSBHDoZiNs1QlkXUNnnjrM/s7HYx36QlkJJ2oxfm57z5q x2FJLWgM1vO8a3mEDvNalZHwQZOAiSuHYrYMyIjqOHj7IVLm3vL9iB9dZNvQhQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1779915633; a=rsa-sha256; cv=none; b=uWyPvDC/xpZIrfLTTdHNdz2rOOLaCqF9bgtPp53lYn15HzstsSwRDfiEz5IbZNnRTEk2Qp 0nzUYxcUiiQ6WYTXPZaioHFM6IsWRyLxZWwj8gQyW7tOssaSQU2roIvNIKu1LmhWGRabRF HhLBIMxiEHl+YHBjCNngKKD+ikZfLyXFYYtejZA8NZ3nWSeVB7Bj9vgbXCif5fxixDprTZ 6gjRpQsDclhIRFSRyQ6xbg8qti1XqBvoyxNA5yQdWHxlpfxKmY+EZYIKp4U8kWeu+oDH0s puGyT40JDSKYnfVK3bec/b9FrH1bmGo6zeGvxCKm5Wk93EeVoPc1dVeYUJN9lQ== 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=1779915633; 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=gfPlbozd8aELjELqMumpqpHVIqq5lF0Alfwd8zH98rE=; b=g6JSOCwucC+jR1Mqen0B51AnILWvHS5rFWr30dRYt4yh9DvtNCL2suluQMoVY9Sl04o/+H 7Qb8l0H5FrLS5oduIFCRA3IgWpU2G8o3itCUtgvPOO85/IeQtpyBUPy9IVxIn0Oxo0wyxp FVabi4t5mBu2L05kqJINs1XYHoZa8QhlEfFS3Dn6pxl4nWF+fi3x2o8nCRWfFEbAS/m3dj o45MIEP/MnE4kawQGWRTKjKH8PDEhZHnw00Ec8JEBHCJZLm88crmxmpWvfwXTv16BNAXdM Sbm76f6FpedugSX+tfdliEF7vOQBM1DrIH4AF4UZQ9mBySQ2ZuhQxXkPBwAywg== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4gQhpn5V4Bz1QB for ; Wed, 27 May 2026 21:00:33 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 23698 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Wed, 27 May 2026 21:00:33 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: John Baldwin Subject: git: caef3c50ac06 - main - ctld: Refactor ioctl port handling List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@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: jhb X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: caef3c50ac067ca751ba4950f310821a521ebf57 Auto-Submitted: auto-generated Date: Wed, 27 May 2026 21:00:33 +0000 Message-Id: <6a175b71.23698.7ab2b30a@gitrepo.freebsd.org> The branch main has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=caef3c50ac067ca751ba4950f310821a521ebf57 commit caef3c50ac067ca751ba4950f310821a521ebf57 Author: John Baldwin AuthorDate: 2026-05-27 20:57:23 +0000 Commit: John Baldwin CommitDate: 2026-05-27 20:57:23 +0000 ctld: Refactor ioctl port handling - Normalize ioctl port names when the port name is first added to the configuration. This can catch potential duplicate port names sooner and helps with other parts of this change. - When recognizing existing ioctl ports, always expand the name to include the physical and virtual port numbers. This permits binding ioctl/0/0 or ioctl/1/0 to a target, for example. - When adding physical ports to a target, first check for an existing kernel port to reuse. This handles both ioctl and non-ioctl ports and removes the need for the conf::add_port method for ioctl ports to check in kports. - If an existing kport isn't found when adding physical ports, check to see if the port name is an ioctl port. If so, call conf::add_port to add an ioctl port. This add_port method overload is now simpler as it always creates a new port. NB: The kernel_port class handles CTL ports that already existed before ctld started including existing ioctl ports, whereas the ioctl_port class handles ioctl ports that are created and completely managed by ctld. This was true before this change but is perhaps more obvious after this change. Sponsored by: Chelsio Communications Differential Revision: https://reviews.freebsd.org/D57092 --- usr.sbin/ctld/ctld.cc | 80 ++++++++++++++++++++++++++++++------------------- usr.sbin/ctld/ctld.hh | 2 +- usr.sbin/ctld/kernel.cc | 5 +++- 3 files changed, 54 insertions(+), 33 deletions(-) diff --git a/usr.sbin/ctld/ctld.cc b/usr.sbin/ctld/ctld.cc index 9bdf15976911..8b99bde14911 100644 --- a/usr.sbin/ctld/ctld.cc +++ b/usr.sbin/ctld/ctld.cc @@ -1180,16 +1180,8 @@ conf::add_port(struct target *target, struct pport *pp) } bool -conf::add_port(struct kports &kports, struct target *target, int pp, int vp) +conf::add_port(struct target *target, const std::string &pname, int pp, int vp) { - struct pport *pport; - - std::string pname = freebsd::stringf("ioctl/%d/%d", pp, vp); - - pport = kports.find_port(pname); - if (pport != NULL) - return (add_port(target, pport)); - std::string name = pname + "-" + target->name(); const auto &pair = conf_ports.try_emplace(name, std::make_unique(target, pp, vp)); @@ -1387,6 +1379,19 @@ target::set_auth_type(const char *type) bool target::add_physical_port(std::string_view pport) { + /* Normalize ioctl port names. */ + std::string pname; + if (pport.compare(0, strlen("ioctl/"), "ioctl/") == 0) { + int ret, pp, vp; + + pname = std::string(pport); + ret = sscanf(pname.c_str(), "ioctl/%d/%d", &pp, &vp); + if (ret == 2) { + pname = freebsd::stringf("ioctl/%d/%d", pp, vp); + pport = pname; + } + } + for (const auto &s : t_pports) { if (s == pport) { log_warnx("duplicate physical port \"%s\" for target " @@ -2643,35 +2648,48 @@ conf::add_pports(struct kports &kports) struct target *targ = kv.second.get(); for (const auto &pport : targ->pports()) { - ret = sscanf(pport.c_str(), "ioctl/%d/%d", &i_pp, - &i_vp); - if (ret > 0) { - if (!add_port(kports, targ, i_pp, i_vp)) { - log_warnx("can't create new ioctl port " - "for %s", targ->label()); + /* + * If this port is already present in the + * kernel, reuse the existing port. + */ + pp = kports.find_port(pport); + if (pp != nullptr) { + if (pp->linked()) { + log_warnx("can't link port \"%s\" to " + "%s, port already linked to some " + "target", pport.c_str(), + targ->label()); return (false); } + if (!add_port(targ, pp)) { + log_warnx( + "can't link port \"%s\" to %s", + pport.c_str(), targ->label()); + return (false); + } continue; } - pp = kports.find_port(pport); - if (pp == NULL) { - log_warnx("unknown port \"%s\" for %s", - pport.c_str(), targ->label()); - return (false); - } - if (pp->linked()) { - log_warnx("can't link port \"%s\" to %s, " - "port already linked to some target", - pport.c_str(), targ->label()); - return (false); - } - if (!add_port(targ, pp)) { - log_warnx("can't link port \"%s\" to %s", - pport.c_str(), targ->label()); - return (false); + /* + * If this port is an ioctl port, create a new + * port. + */ + ret = sscanf(pport.c_str(), "ioctl/%d/%d", &i_pp, + &i_vp); + if (ret == 2) { + if (!add_port(targ, pport, i_pp, i_vp)) { + log_warnx("can't create new port %s " + "for %s", pport.c_str(), + targ->label()); + return (false); + } + continue; } + + log_warnx("unknown port \"%s\" for %s", + pport.c_str(), targ->label()); + return (false); } } return (true); diff --git a/usr.sbin/ctld/ctld.hh b/usr.sbin/ctld/ctld.hh index 7ae033804157..8d63de06dd80 100644 --- a/usr.sbin/ctld/ctld.hh +++ b/usr.sbin/ctld/ctld.hh @@ -487,7 +487,7 @@ struct conf { bool add_port(struct target *target, struct portal_group *pg, uint32_t ctl_port); bool add_port(struct target *target, struct pport *pp); - bool add_port(struct kports &kports, struct target *target, int pp, + bool add_port(struct target *target, const std::string &pname, int pp, int vp); bool add_pports(struct kports &kports); diff --git a/usr.sbin/ctld/kernel.cc b/usr.sbin/ctld/kernel.cc index 59a339e1c96b..8c5c447f3e80 100644 --- a/usr.sbin/ctld/kernel.cc +++ b/usr.sbin/ctld/kernel.cc @@ -549,7 +549,10 @@ conf_new_from_kernel(struct kports &kports) continue; std::string name = port.port_name; - if (port.pp != 0 || port.vp != 0) { + if (port.port_frontend == "ioctl") + name += "/" + std::to_string(port.pp) + "/" + + std::to_string(port.vp); + else if (port.pp != 0 || port.vp != 0) { name += "/" + std::to_string(port.pp); if (port.vp != 0) name += "/" + std::to_string(port.vp);