From nobody Fri Apr 24 17:56:16 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 4g2LHP1tqbz6ZxTd for ; Fri, 24 Apr 2026 17:56:17 +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 4g2LHN5TgFz3qMS for ; Fri, 24 Apr 2026 17:56:16 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1777053376; 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=UyFZJvAUhOY0cfzki3C6olRhyRAIjXav2vpnNnGbiKE=; b=KZF/+8m7yTRrQ8jzxfO+NVg5VJ/1mIrR5ZO0we9eash27Y9v3/CwIZdFKUfD78GWlBc3qX W7/HdLCL7Ci5Uo0njF9wdiFaFm3kbWdndHnsWhh0HKb+5ZPe+37zeNiuehbPLGtVTBTyQx mHN2JvGbtECXK6bOnGxs0RD3iEnvVsxhuZo4gnAXzGZWlOfjXDTmJAmtJTIn069cOH2/sf 1/5HxucU/NKVrs2OrGhiEOUm1iEcVNaNEU2UDSxdqPShI6mXeGRIMWj3A6noanfVs06QyP gV0wog5oqGnf8e5i6NTiHPVF+gSPhdihtV8atza+nwlqv0KtRYZ+tMwN/9kpMw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1777053376; a=rsa-sha256; cv=none; b=lALANC413slMXM22GOOa4OfFOPDQISZx6CvmrubzdzFpzSOZOTZbyMlPIlnAVL4oN4uXaN IDyyOpX/50IYDK3ponpA/oiJP6lj4HdiJPsj5kMc4th1VSf46LvDAfYGiHzQX73rPcn5Qj gvxdYhkI6Zryz1XWPPYzPdMau2W9srBNc4qtUhWJiStKFg/N7wvjat0ar5PYaJLaPcdqoR Ji6RQRsLeLj3sS3Mg6XAkQ6xLLH+Yp+FhqMqx3WiSSKp7W3TEnjlN3BoWE7YphPlRDZ+8o F5lITn3vMBXugRwsRHtJxTXZP+sbiQkEKQIMihqoF+is7I2EaHRMUL8zsHOU5Q== 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=1777053376; 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=UyFZJvAUhOY0cfzki3C6olRhyRAIjXav2vpnNnGbiKE=; b=Xr7ywTm5F+1UElHulTitlqkzyb6I3H5h9QPkLfiG8EERLtX+1gfrTQ9Ipn4cqORxKJBhJR 68kDhuVVPJbeBJApMViV0/FPN7z19NxhDvTKVCjDTV/9ZyTWq/VHDQ0Ux1hKaHJBWUurWG vlh7wQYpyVD4vMsr7r5iXNL5l8sbYgTttLC4tlROdRZZDUm6ugDCH3+huDvgXU8ikv2G/g jOoILIkuqsuloQbN+EHFlQ4rPLP0QylCkpqb/+V92VyhnSbLmswuDwFQgoyL7ewGOanzrN 7bg7WOffBtQSGkGtsBDzoG3xuozIZt8w6XF6foZIWswgCjAdlFz84ew7/dyNdg== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4g2LHN54b9z1C4Z for ; Fri, 24 Apr 2026 17:56:16 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 1a17e by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Fri, 24 Apr 2026 17:56:16 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: John Baldwin Subject: git: 656838ab3fcc - stable/15 - pciconf: Factor out fetching of matching devices from list_devs 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: jhb X-Git-Repository: src X-Git-Refname: refs/heads/stable/15 X-Git-Reftype: branch X-Git-Commit: 656838ab3fcc5ae9d0be816bbdbb23549b6bd5b3 Auto-Submitted: auto-generated Date: Fri, 24 Apr 2026 17:56:16 +0000 Message-Id: <69ebaec0.1a17e.69f93ea2@gitrepo.freebsd.org> The branch stable/15 has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=656838ab3fcc5ae9d0be816bbdbb23549b6bd5b3 commit 656838ab3fcc5ae9d0be816bbdbb23549b6bd5b3 Author: John Baldwin AuthorDate: 2026-03-10 16:48:04 +0000 Commit: John Baldwin CommitDate: 2026-04-24 17:33:52 +0000 pciconf: Factor out fetching of matching devices from list_devs The new fetch_devs function fetches the entire list of PCI devices into a single list, retrying if the list changes while it is being fetched. Reviewed by: imp Sponsored by: Chelsio Communications Differential Revision: https://reviews.freebsd.org/D55768 (cherry picked from commit 9eb035ff8439195f565b9e3180b727333a4e7170) --- usr.sbin/pciconf/pciconf.c | 168 ++++++++++++++++++++++++++------------------- 1 file changed, 96 insertions(+), 72 deletions(-) diff --git a/usr.sbin/pciconf/pciconf.c b/usr.sbin/pciconf/pciconf.c index 4d3941131858..6aa33d332c08 100644 --- a/usr.sbin/pciconf/pciconf.c +++ b/usr.sbin/pciconf/pciconf.c @@ -200,23 +200,13 @@ main(int argc, char **argv) return (exitstatus); } -static void -list_devs(const char *name, int verbose, int bars, int bridge, int caps, - int errors, int vpd, int listmode) +static bool +fetch_devs(int fd, const char *name, struct pci_conf **confp, size_t *countp) { - int fd; struct pci_conf_io pc; struct pci_conf conf[255], *p; struct pci_match_conf patterns[1]; - int none_count = 0; - - if (verbose) - load_vendors(); - - fd = open(_PATH_DEVPCI, (bridge || caps || errors) ? O_RDWR : O_RDONLY, - 0); - if (fd < 0) - err(1, "%s", _PATH_DEVPCI); + size_t count; bzero(&pc, sizeof(struct pci_conf_io)); pc.match_buf_len = sizeof(conf); @@ -232,75 +222,109 @@ list_devs(const char *name, int verbose, int bars, int bridge, int caps, pc.patterns = patterns; } + p = NULL; + count = 0; do { if (ioctl(fd, PCIOCGETCONF, &pc) == -1) err(1, "ioctl(PCIOCGETCONF)"); - /* - * 255 entries should be more than enough for most people, - * but if someone has more devices, and then changes things - * around between ioctls, we'll do the cheesy thing and - * just bail. The alternative would be to go back to the - * beginning of the list, and print things twice, which may - * not be desirable. - */ if (pc.status == PCI_GETCONF_LIST_CHANGED) { - warnx("PCI device list changed, please try again"); - exitstatus = 1; - close(fd); - return; - } else if (pc.status == PCI_GETCONF_ERROR) { + free(p); + p = NULL; + count = 0; + pc.offset = 0; + continue; + } + + if (pc.status == PCI_GETCONF_ERROR) { warnx("error returned from PCIOCGETCONF ioctl"); - exitstatus = 1; - close(fd); - return; + return (false); } - if (listmode == 2) - printf("drv\tselector\tclass rev hdr " - "vendor device subven subdev\n"); - for (p = conf; p < &conf[pc.num_matches]; p++) { - if (listmode == 2) - printf("%s%d@pci%d:%d:%d:%d:" - "\t%06x %02x %02x " - "%04x %04x %04x %04x\n", - *p->pd_name ? p->pd_name : "none", - *p->pd_name ? (int)p->pd_unit : - none_count++, p->pc_sel.pc_domain, - p->pc_sel.pc_bus, p->pc_sel.pc_dev, - p->pc_sel.pc_func, (p->pc_class << 16) | - (p->pc_subclass << 8) | p->pc_progif, - p->pc_revid, p->pc_hdr, - p->pc_vendor, p->pc_device, - p->pc_subvendor, p->pc_subdevice); - else - printf("%s%d@pci%d:%d:%d:%d:" - "\tclass=0x%06x rev=0x%02x hdr=0x%02x " - "vendor=0x%04x device=0x%04x " - "subvendor=0x%04x subdevice=0x%04x\n", - *p->pd_name ? p->pd_name : "none", - *p->pd_name ? (int)p->pd_unit : - none_count++, p->pc_sel.pc_domain, - p->pc_sel.pc_bus, p->pc_sel.pc_dev, - p->pc_sel.pc_func, (p->pc_class << 16) | - (p->pc_subclass << 8) | p->pc_progif, - p->pc_revid, p->pc_hdr, - p->pc_vendor, p->pc_device, - p->pc_subvendor, p->pc_subdevice); - if (verbose) - list_verbose(p); - if (bars) - list_bars(fd, p); - if (bridge) - list_bridge(fd, p); - if (caps) - list_caps(fd, p, caps); - if (errors) - list_errors(fd, p); - if (vpd) - list_vpd(fd, p); + + p = reallocf(p, (count + pc.num_matches) * sizeof(*p)); + if (p == NULL) { + warnx("failed to allocate buffer for PCIOCGETCONF results"); + return (false); } + + memcpy(p + count, conf, pc.num_matches * sizeof(*p)); + count += pc.num_matches; } while (pc.status == PCI_GETCONF_MORE_DEVS); + *confp = p; + *countp = count; + return (true); +} + +static void +list_devs(const char *name, int verbose, int bars, int bridge, int caps, + int errors, int vpd, int listmode) +{ + int fd; + struct pci_conf *conf, *p; + size_t count; + int none_count = 0; + + if (verbose) + load_vendors(); + + fd = open(_PATH_DEVPCI, (bridge || caps || errors) ? O_RDWR : O_RDONLY, + 0); + if (fd < 0) + err(1, "%s", _PATH_DEVPCI); + + if (!fetch_devs(fd, name, &conf, &count)) { + exitstatus = 1; + close(fd); + return; + } + + if (listmode == 2) + printf("drv\tselector\tclass rev hdr " + "vendor device subven subdev\n"); + for (p = conf; p < conf + count; p++) { + if (listmode == 2) + printf("%s%d@pci%d:%d:%d:%d:" + "\t%06x %02x %02x " + "%04x %04x %04x %04x\n", + *p->pd_name ? p->pd_name : "none", + *p->pd_name ? (int)p->pd_unit : + none_count++, p->pc_sel.pc_domain, + p->pc_sel.pc_bus, p->pc_sel.pc_dev, + p->pc_sel.pc_func, (p->pc_class << 16) | + (p->pc_subclass << 8) | p->pc_progif, + p->pc_revid, p->pc_hdr, + p->pc_vendor, p->pc_device, + p->pc_subvendor, p->pc_subdevice); + else + printf("%s%d@pci%d:%d:%d:%d:" + "\tclass=0x%06x rev=0x%02x hdr=0x%02x " + "vendor=0x%04x device=0x%04x " + "subvendor=0x%04x subdevice=0x%04x\n", + *p->pd_name ? p->pd_name : "none", + *p->pd_name ? (int)p->pd_unit : + none_count++, p->pc_sel.pc_domain, + p->pc_sel.pc_bus, p->pc_sel.pc_dev, + p->pc_sel.pc_func, (p->pc_class << 16) | + (p->pc_subclass << 8) | p->pc_progif, + p->pc_revid, p->pc_hdr, + p->pc_vendor, p->pc_device, + p->pc_subvendor, p->pc_subdevice); + if (verbose) + list_verbose(p); + if (bars) + list_bars(fd, p); + if (bridge) + list_bridge(fd, p); + if (caps) + list_caps(fd, p, caps); + if (errors) + list_errors(fd, p); + if (vpd) + list_vpd(fd, p); + } + + free(conf); close(fd); }