From nobody Mon Jul 31 12:56:26 2023 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 4RDytJ3rHGz4q6k0; Mon, 31 Jul 2023 12:56:29 +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 "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4RDyt36XKxz40t1; Mon, 31 Jul 2023 12:56:27 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1690808188; 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=SIxHoWnZ7mNLxumm2+/NetVfWmRSSRKIeQ8JlLUaNZg=; b=l8geFNa0NI3ZbjJ+GhQJMg4BGcgKeJvqm29QS3XxEr1uUMu7uV9+QK1KgKLutk2HmBZDTe e87CkmpoOTImMIZonEF71b77fhEwLlnQmvxlnB0p2BltWHA4Eq63i4gAPjTNYt2E8EbnwW sfICsDqOUcrFBv8GbyzrJhcjITGFyriCWS3MvoFpO+6ERbddt9X2ur7TA5YH9Vbo7yaq8M Xw3KK9k11UxLCSIyX66SYB/8zdyMSGS+XBxWFwuQa3bEb8BFeilEkH+ybc7qu/J5dGD/Jr 65pBa8gzrJgvPsUnZ/tVMmEvpi6/SyQ9lD/WvCXCBARuOsE2UWgwjc7ffkggiQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1690808188; 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=SIxHoWnZ7mNLxumm2+/NetVfWmRSSRKIeQ8JlLUaNZg=; b=foBM4uqYsoIW5DKCxDJuiUshSkEJnoNMrJR0aPUNT46hM9M9L76q1IOvx1kFFMHcGji+Qf oQBP7TZE6MNqmy7BlB3pZaeCb9vdvMswaGKmvOemABHF+ERIXqqrLkuY8pnpQhrwzmdnmm IB5WymN+b53LTLMM+45H/sXiJ2h3fZjGobpSVUO6LBRNT9IKgQ3VwLB2mUWq7VGHB9Vx2s /LJDGJVGEA/jikuacVT8za9L2a3eNwwTuhvtVriqh0o86f5S31wsRKccom2Unqc5FF1xTC pBAQbxEDH39BVWLsC+w+TPy5ajak873Gf8Q3fhHHPOSEIaDqkzToLnACK2iAvQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1690808188; a=rsa-sha256; cv=none; b=Zo3+AYSCeDvShsKEqgdfVGA1g5osdgcd+OlMLDYyZElgFJc2M5O2zAxc4mmpiIi0Fe3pQr Rp98Ib3ARPrRAoeqXu0Go7Hw5sdw+e7HbACEkLXAYZt3r7axbamqKbsvD7N6rclKSEIsHP I7B6KO/EStNfpxI2YUxrORUqG7BryzPvLrBgwRFezsOVmuomF7t05Pi8IIhr+GW400Vvzo 8XWGKbz20apUsVMQr43ZHzDTkvCUk8WACOdgiZD+Aybm5tmmp+5YFIHDKPuX+eVGT7/P5C 2AO37LZ8jTjZsMF/8YOysleYIX1UrvMHsQLjSX+BxzWU8mAlxbc1lkDj5Ts1Pg== 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 4RDyt314jgzx0y; Mon, 31 Jul 2023 12:56:27 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 36VCuQdl093330; Mon, 31 Jul 2023 12:56:26 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 36VCuQIf093329; Mon, 31 Jul 2023 12:56:26 GMT (envelope-from git) Date: Mon, 31 Jul 2023 12:56:26 GMT Message-Id: <202307311256.36VCuQIf093329@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Marcin Wojtas Subject: git: 383cf7052a29 - stable/12 - ena: Initialize statistics before the interface is available 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: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: mw X-Git-Repository: src X-Git-Refname: refs/heads/stable/12 X-Git-Reftype: branch X-Git-Commit: 383cf7052a29ab3f4d1bdffb888696546e4f0fe4 Auto-Submitted: auto-generated The branch stable/12 has been updated by mw: URL: https://cgit.FreeBSD.org/src/commit/?id=383cf7052a29ab3f4d1bdffb888696546e4f0fe4 commit 383cf7052a29ab3f4d1bdffb888696546e4f0fe4 Author: Osama Abboud AuthorDate: 2023-01-18 13:19:07 +0000 Commit: Marcin Wojtas CommitDate: 2023-07-31 12:49:47 +0000 ena: Initialize statistics before the interface is available In [1], the FBSD community exposed a bug in the fbsd/ena driver. Bug description: ---------------- Current function call order is as follows: 1. ena_attach() 1.1. ena_setup_ifnet() 1.1.1. Registration of ena_get_counter() 1.1.2. ether_ifattach(ifp, adapter->mac_addr); 1.2. Statistics allocation and initialization. At point 1.1.2, when ether_ifattach() returns, the interface is available, and stats can be read before they are allocated, leading to kernel panic. Also fixed a potential memory leak by freeing the stats since they were not freed in case the following calls failed. Fix: ---- This commit moves the statistics allocation and initialization to happen before ena_setup_ifnet() [1] https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=268934 Fixes: 9b8d05b8ac78 ("Add support for Amazon Elastic Network Adapter (ENA) NIC") Fixes: 30217e2dff10 ("Rework counting of hardware statistics in ENA driver") MFC after: 2 weeks Sponsored by: Amazon, Inc. (cherry picked from commit b9e80b5280b75f2c641d680245df44b8ff26a7b0) --- sys/dev/ena/ena.c | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/sys/dev/ena/ena.c b/sys/dev/ena/ena.c index 15c8d39d8fb5..c8c12593fcd1 100644 --- a/sys/dev/ena/ena.c +++ b/sys/dev/ena/ena.c @@ -3484,6 +3484,15 @@ ena_reset_task(void *arg, int pending) ENA_LOCK_UNLOCK(); } +static void +ena_free_stats(struct ena_adapter *adapter) +{ + ena_free_counters((counter_u64_t *)&adapter->hw_stats, + sizeof(struct ena_hw_stats)); + ena_free_counters((counter_u64_t *)&adapter->dev_stats, + sizeof(struct ena_stats_dev)); + +} /** * ena_attach - Device Initialization Routine * @pdev: device information struct @@ -3661,6 +3670,13 @@ ena_attach(device_t pdev) /* initialize rings basic information */ ena_init_io_rings(adapter); + /* Initialize statistics */ + ena_alloc_counters((counter_u64_t *)&adapter->dev_stats, + sizeof(struct ena_stats_dev)); + ena_alloc_counters((counter_u64_t *)&adapter->hw_stats, + sizeof(struct ena_hw_stats)); + ena_sysctl_add_nodes(adapter); + /* setup network interface */ rc = ena_setup_ifnet(pdev, adapter, &get_feat_ctx); if (unlikely(rc != 0)) { @@ -3682,13 +3698,6 @@ ena_attach(device_t pdev) taskqueue_start_threads(&adapter->metrics_tq, 1, PI_NET, "%s metricsq", device_get_nameunit(adapter->pdev)); - /* Initialize statistics */ - ena_alloc_counters((counter_u64_t *)&adapter->dev_stats, - sizeof(struct ena_stats_dev)); - ena_alloc_counters((counter_u64_t *)&adapter->hw_stats, - sizeof(struct ena_hw_stats)); - ena_sysctl_add_nodes(adapter); - #ifdef DEV_NETMAP rc = ena_netmap_attach(adapter); if (rc != 0) { @@ -3711,6 +3720,7 @@ err_detach: ether_ifdetach(adapter->ifp); #endif /* DEV_NETMAP */ err_msix_free: + ena_free_stats(adapter); ena_com_dev_reset(adapter->ena_dev, ENA_REGS_RESET_INIT_ERR); ena_free_mgmnt_irq(adapter); ena_disable_msix(adapter); @@ -3783,10 +3793,7 @@ ena_detach(device_t pdev) netmap_detach(adapter->ifp); #endif /* DEV_NETMAP */ - ena_free_counters((counter_u64_t *)&adapter->hw_stats, - sizeof(struct ena_hw_stats)); - ena_free_counters((counter_u64_t *)&adapter->dev_stats, - sizeof(struct ena_stats_dev)); + ena_free_stats(adapter); rc = ena_free_rx_dma_tag(adapter); if (unlikely(rc != 0))