From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E23CA55C2A; Wed, 13 Mar 2024 16:46:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348405; cv=none; b=qNxgfVzgc/IIH9w6xHro0aQxtQNXUbk1jp0x0u8wcXjwkdFCRygOxnbHf+tdo2I18G+uh8beozOwe5nd0S/1O5m0Cu26l1pnSPJsvPmO9hKqLXNK2gfO9FG+lXlcJmD7CQeQdak2Zpgbj8fMF3QUmL46tpPJFqMKLQvVo0RGdkw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348405; c=relaxed/simple; bh=IdN3gYeyWAVlGPzwpeyM5dTBSOISdvZ318vw8Bk+/9w=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bmRYdHyFVevk+EFi5mMIWELidaq9QsSIJ74Hznz94MmauBI7Dqtw9ZWGZfykdfgh+nI9puthJTMh3Ha+1TR/BYf/oTgocFLmiAiOWSVVStnANQuAZpSXJlpuFrsfyXL3NWeidEnlSJbzuwnOSYcjvsTVvB/mi6rrIAJtclO7ZZA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=TOvDcFll; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="TOvDcFll" Received: by smtp.kernel.org (Postfix) with ESMTPSA id CBB5AC433F1; Wed, 13 Mar 2024 16:46:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348404; bh=IdN3gYeyWAVlGPzwpeyM5dTBSOISdvZ318vw8Bk+/9w=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=TOvDcFllyPZAcFhdLE9F8bol1gzsuIoKSKp6To1SY4Ye6fARhMPvEgYlVBsetaCqn jzE8ARLm59mJG/lOcqOqUgYSa/2Nm4fnt/qWo3ans0nSHa080JyXastjxWSRQeF5yi t3jZEvscQbReREMo3sIyv640ZE9CRUkS1iJFJ0XAQwrcIjOU5UmHHl0+n/5hQ1ACiL mTMjv/nhvsmBohkBRg1LwmAvXRFdmjQydeC6kq2d4hT+k8XDAp1xavmeX96JaW/mF0 KiOoHxKVBaPtaaz+jR3uK2Lao+A0ABdjg01YJMzJkZFMsUvKeFkUe8esAUiSPDk67R RbeA6PWODNwDw== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Yann Gautier , Ulf Hansson , Sasha Levin Subject: [PATCH 5.10 01/73] mmc: mmci: stm32: use a buffer for unaligned DMA requests Date: Wed, 13 Mar 2024 12:45:28 -0400 Message-ID: <20240313164640.616049-2-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Yann Gautier [ Upstream commit 970dc9c11a17994ab878016b536612ab00d1441d ] In SDIO mode, the sg list for requests can be unaligned with what the STM32 SDMMC internal DMA can support. In that case, instead of failing, use a temporary bounce buffer to copy from/to the sg list. This buffer is limited to 1MB. But for that we need to also limit max_req_size to 1MB. It has not shown any throughput penalties for SD-cards or eMMC. Signed-off-by: Yann Gautier Link: https://lore.kernel.org/r/20220328145114.334577-1-yann.gautier@foss.s= t.com Signed-off-by: Ulf Hansson Stable-dep-of: 6b1ba3f9040b ("mmc: mmci: stm32: fix DMA API overlapping map= pings warning") Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- drivers/mmc/host/mmci_stm32_sdmmc.c | 88 +++++++++++++++++++++++------ 1 file changed, 71 insertions(+), 17 deletions(-) diff --git a/drivers/mmc/host/mmci_stm32_sdmmc.c b/drivers/mmc/host/mmci_st= m32_sdmmc.c index 4cceb9bab0361..11ae0cb479239 100644 --- a/drivers/mmc/host/mmci_stm32_sdmmc.c +++ b/drivers/mmc/host/mmci_stm32_sdmmc.c @@ -43,6 +43,9 @@ struct sdmmc_lli_desc { struct sdmmc_idma { dma_addr_t sg_dma; void *sg_cpu; + dma_addr_t bounce_dma_addr; + void *bounce_buf; + bool use_bounce_buffer; }; =20 struct sdmmc_dlyb { @@ -54,6 +57,8 @@ struct sdmmc_dlyb { static int sdmmc_idma_validate_data(struct mmci_host *host, struct mmc_data *data) { + struct sdmmc_idma *idma =3D host->dma_priv; + struct device *dev =3D mmc_dev(host->mmc); struct scatterlist *sg; int i; =20 @@ -61,41 +66,69 @@ static int sdmmc_idma_validate_data(struct mmci_host *h= ost, * idma has constraints on idmabase & idmasize for each element * excepted the last element which has no constraint on idmasize */ + idma->use_bounce_buffer =3D false; for_each_sg(data->sg, sg, data->sg_len - 1, i) { if (!IS_ALIGNED(sg->offset, sizeof(u32)) || !IS_ALIGNED(sg->length, SDMMC_IDMA_BURST)) { - dev_err(mmc_dev(host->mmc), + dev_dbg(mmc_dev(host->mmc), "unaligned scatterlist: ofst:%x length:%d\n", data->sg->offset, data->sg->length); - return -EINVAL; + goto use_bounce_buffer; } } =20 if (!IS_ALIGNED(sg->offset, sizeof(u32))) { - dev_err(mmc_dev(host->mmc), + dev_dbg(mmc_dev(host->mmc), "unaligned last scatterlist: ofst:%x length:%d\n", data->sg->offset, data->sg->length); - return -EINVAL; + goto use_bounce_buffer; } =20 + return 0; + +use_bounce_buffer: + if (!idma->bounce_buf) { + idma->bounce_buf =3D dmam_alloc_coherent(dev, + host->mmc->max_req_size, + &idma->bounce_dma_addr, + GFP_KERNEL); + if (!idma->bounce_buf) { + dev_err(dev, "Unable to map allocate DMA bounce buffer.\n"); + return -ENOMEM; + } + } + + idma->use_bounce_buffer =3D true; + return 0; } =20 static int _sdmmc_idma_prep_data(struct mmci_host *host, struct mmc_data *data) { - int n_elem; + struct sdmmc_idma *idma =3D host->dma_priv; =20 - n_elem =3D dma_map_sg(mmc_dev(host->mmc), - data->sg, - data->sg_len, - mmc_get_dma_dir(data)); + if (idma->use_bounce_buffer) { + if (data->flags & MMC_DATA_WRITE) { + unsigned int xfer_bytes =3D data->blksz * data->blocks; =20 - if (!n_elem) { - dev_err(mmc_dev(host->mmc), "dma_map_sg failed\n"); - return -EINVAL; - } + sg_copy_to_buffer(data->sg, data->sg_len, + idma->bounce_buf, xfer_bytes); + dma_wmb(); + } + } else { + int n_elem; + + n_elem =3D dma_map_sg(mmc_dev(host->mmc), + data->sg, + data->sg_len, + mmc_get_dma_dir(data)); =20 + if (!n_elem) { + dev_err(mmc_dev(host->mmc), "dma_map_sg failed\n"); + return -EINVAL; + } + } return 0; } =20 @@ -112,8 +145,19 @@ static int sdmmc_idma_prep_data(struct mmci_host *host, static void sdmmc_idma_unprep_data(struct mmci_host *host, struct mmc_data *data, int err) { - dma_unmap_sg(mmc_dev(host->mmc), data->sg, data->sg_len, - mmc_get_dma_dir(data)); + struct sdmmc_idma *idma =3D host->dma_priv; + + if (idma->use_bounce_buffer) { + if (data->flags & MMC_DATA_READ) { + unsigned int xfer_bytes =3D data->blksz * data->blocks; + + sg_copy_from_buffer(data->sg, data->sg_len, + idma->bounce_buf, xfer_bytes); + } + } else { + dma_unmap_sg(mmc_dev(host->mmc), data->sg, data->sg_len, + mmc_get_dma_dir(data)); + } } =20 static int sdmmc_idma_setup(struct mmci_host *host) @@ -137,6 +181,8 @@ static int sdmmc_idma_setup(struct mmci_host *host) host->mmc->max_segs =3D SDMMC_LLI_BUF_LEN / sizeof(struct sdmmc_lli_desc); host->mmc->max_seg_size =3D host->variant->stm32_idmabsize_mask; + + host->mmc->max_req_size =3D SZ_1M; } else { host->mmc->max_segs =3D 1; host->mmc->max_seg_size =3D host->mmc->max_req_size; @@ -154,8 +200,16 @@ static int sdmmc_idma_start(struct mmci_host *host, un= signed int *datactrl) struct scatterlist *sg; int i; =20 - if (!host->variant->dma_lli || data->sg_len =3D=3D 1) { - writel_relaxed(sg_dma_address(data->sg), + if (!host->variant->dma_lli || data->sg_len =3D=3D 1 || + idma->use_bounce_buffer) { + u32 dma_addr; + + if (idma->use_bounce_buffer) + dma_addr =3D idma->bounce_dma_addr; + else + dma_addr =3D sg_dma_address(data->sg); + + writel_relaxed(dma_addr, host->base + MMCI_STM32_IDMABASE0R); writel_relaxed(MMCI_STM32_IDMAEN, host->base + MMCI_STM32_IDMACTRLR); --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 774A565BC8; Wed, 13 Mar 2024 16:46:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348406; cv=none; b=iVs7Lbz98zeG36656OCGKba9vGGSbF5JDwRtCPsJzLI3ScX6ztt76I6NOZSKCCOkSZ7uIQElkPj2rmrstvhwwiINlIT5D3MBB2irz6VBxnO1bOo6ZNTeJywlYE4bAaxU9WOh2ZiFN3J4Tpi9FAu061hZ93Zk5SBGv2MJY6LaMf4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348406; c=relaxed/simple; bh=BKKvaSPOJcIzN9AKZ4t/6eH1vXhiFpdAhQlKssnCZxE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Z71vep2EiVsb2kFwKSdmnxQ959oqpXzCKe6VgIn72JxMBOD9PSilPAXkpTQjGqWtdTj23XO5pN5p8erUSie6cF4ABMVOPsu+OeuekiWMpTLhoOvHuDKlCODbPp/C5bFkEq6vqE2dEb4Ur5g3vlkWUZ2xXmIejTe/7hGuopBEOBA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=TlYb+PHe; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="TlYb+PHe" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C8573C43390; Wed, 13 Mar 2024 16:46:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348405; bh=BKKvaSPOJcIzN9AKZ4t/6eH1vXhiFpdAhQlKssnCZxE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=TlYb+PHeSLuicUVvd7XTWy3OmSljCScnJzsnXrEK2nxMJQFltelnMC10e+Jy/z1pT 8jxBXulUFOkayYx16mQLWtugj2bOQYUFyj8S1Jlb2a0o3yk8VY0QZRORHAUmnRAaPs rbHjJNI7Jk2KkmWimaOCFkyRYL58ixIGlnw3wRjr0vdErsdeMvP1vNqSAh48HF5mBw /izNYE4ggDMI46vUOQm/UYCCq7Ff0DzuIj+kxzbFo3bmk3twjoc/6veI5o8e35V1xB np1yHF/jRk+eCd/mRBQQijn3YNCaMdLEZ0tk6k3WFEFwGF5nKqhBZCCHLKA1eQkanT Nw8PxT9429TKQ== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Christophe Kerello , Ulf Hansson , Sasha Levin Subject: [PATCH 5.10 02/73] mmc: mmci: stm32: fix DMA API overlapping mappings warning Date: Wed, 13 Mar 2024 12:45:29 -0400 Message-ID: <20240313164640.616049-3-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Christophe Kerello [ Upstream commit 6b1ba3f9040be5efc4396d86c9752cdc564730be ] Turning on CONFIG_DMA_API_DEBUG_SG results in the following warning: DMA-API: mmci-pl18x 48220000.mmc: cacheline tracking EEXIST, overlapping mappings aren't supported WARNING: CPU: 1 PID: 51 at kernel/dma/debug.c:568 add_dma_entry+0x234/0x2f4 Modules linked in: CPU: 1 PID: 51 Comm: kworker/1:2 Not tainted 6.1.28 #1 Hardware name: STMicroelectronics STM32MP257F-EV1 Evaluation Board (DT) Workqueue: events_freezable mmc_rescan Call trace: add_dma_entry+0x234/0x2f4 debug_dma_map_sg+0x198/0x350 __dma_map_sg_attrs+0xa0/0x110 dma_map_sg_attrs+0x10/0x2c sdmmc_idma_prep_data+0x80/0xc0 mmci_prep_data+0x38/0x84 mmci_start_data+0x108/0x2dc mmci_request+0xe4/0x190 __mmc_start_request+0x68/0x140 mmc_start_request+0x94/0xc0 mmc_wait_for_req+0x70/0x100 mmc_send_tuning+0x108/0x1ac sdmmc_execute_tuning+0x14c/0x210 mmc_execute_tuning+0x48/0xec mmc_sd_init_uhs_card.part.0+0x208/0x464 mmc_sd_init_card+0x318/0x89c mmc_attach_sd+0xe4/0x180 mmc_rescan+0x244/0x320 DMA API debug brings to light leaking dma-mappings as dma_map_sg and dma_unmap_sg are not correctly balanced. If an error occurs in mmci_cmd_irq function, only mmci_dma_error function is called and as this API is not managed on stm32 variant, dma_unmap_sg is never called in this error path. Signed-off-by: Christophe Kerello Fixes: 46b723dd867d ("mmc: mmci: add stm32 sdmmc variant") Cc: stable@vger.kernel.org Link: https://lore.kernel.org/r/20240207143951.938144-1-christophe.kerello@= foss.st.com Signed-off-by: Ulf Hansson Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- drivers/mmc/host/mmci_stm32_sdmmc.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/drivers/mmc/host/mmci_stm32_sdmmc.c b/drivers/mmc/host/mmci_st= m32_sdmmc.c index 11ae0cb479239..e3201a621870a 100644 --- a/drivers/mmc/host/mmci_stm32_sdmmc.c +++ b/drivers/mmc/host/mmci_stm32_sdmmc.c @@ -200,6 +200,8 @@ static int sdmmc_idma_start(struct mmci_host *host, uns= igned int *datactrl) struct scatterlist *sg; int i; =20 + host->dma_in_progress =3D true; + if (!host->variant->dma_lli || data->sg_len =3D=3D 1 || idma->use_bounce_buffer) { u32 dma_addr; @@ -238,9 +240,30 @@ static int sdmmc_idma_start(struct mmci_host *host, un= signed int *datactrl) return 0; } =20 +static void sdmmc_idma_error(struct mmci_host *host) +{ + struct mmc_data *data =3D host->data; + struct sdmmc_idma *idma =3D host->dma_priv; + + if (!dma_inprogress(host)) + return; + + writel_relaxed(0, host->base + MMCI_STM32_IDMACTRLR); + host->dma_in_progress =3D false; + data->host_cookie =3D 0; + + if (!idma->use_bounce_buffer) + dma_unmap_sg(mmc_dev(host->mmc), data->sg, data->sg_len, + mmc_get_dma_dir(data)); +} + static void sdmmc_idma_finalize(struct mmci_host *host, struct mmc_data *d= ata) { + if (!dma_inprogress(host)) + return; + writel_relaxed(0, host->base + MMCI_STM32_IDMACTRLR); + host->dma_in_progress =3D false; =20 if (!data->host_cookie) sdmmc_idma_unprep_data(host, data, 0); @@ -566,6 +589,7 @@ static struct mmci_host_ops sdmmc_variant_ops =3D { .dma_setup =3D sdmmc_idma_setup, .dma_start =3D sdmmc_idma_start, .dma_finalize =3D sdmmc_idma_finalize, + .dma_error =3D sdmmc_idma_error, .set_clkreg =3D mmci_sdmmc_set_clkreg, .set_pwrreg =3D mmci_sdmmc_set_pwrreg, .busy_complete =3D sdmmc_busy_complete, --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B115165BCD; Wed, 13 Mar 2024 16:46:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348406; cv=none; b=MXjKDjKoRxIEBzIEz1ZuT3Kn5uL3p2866uLvGB4uzlgl4g8lMbmHg35PFaFbnH8gaWOskv7ba0OIR6WVfW+msPleP/tljBkjThsGsMrkSiH58rr2LaRxfADt9VqF9f5rXlaYWzlGVmBZW4O4LQvsn8GFBWYFzoSospz16wc/164= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348406; c=relaxed/simple; bh=O9RtS8FWhtxlW5ztN8AWDTv8q6f95o+zJ5QEMBwRT6k=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VP/UCYx68zfgzGmdFzHe58bpLqoLBhvljBTBm9/gyexhad794fDO/UEjH2hsa3BxbvtHKq6phUvcgfiE9M44J0QNlzn0960UOO9dQsbuIWcjl1yv5ci2O3jIfdAWG75MLc+0gHNLcGhDpcnPCNRKSR1H6jUPb5rOVCho+ZRqQYU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=B1pGaa55; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="B1pGaa55" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C6048C433F1; Wed, 13 Mar 2024 16:46:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348406; bh=O9RtS8FWhtxlW5ztN8AWDTv8q6f95o+zJ5QEMBwRT6k=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=B1pGaa55E+QqEwwrOten6Z7DkP7IgVn38NMbkEUx/7pSt+1GtAONCSUaD94wcl41w aW0/jexQIZ/IBNZTj5PcKwjYkHLQW3XKbkGGm00/uOLYRO8FFp72bX+puxO0V2QjM8 dhMCsCNL6uvHC0kHk3GEf64I2/oDdHhToeq3APiIlDXe8tjoy2qMtHOrYaWwYeJNiA h9OL29QUw+ehSMpkp5IH2+CrmJbQn+2EU1DYF1Rbt0QwOqfCvNUEz+1PsPhsWS/KP/ RMNmabn4rvYyDzIRVc/z7bMiuBau0a/8tE41dDpSO2AHaavbToSozvHo8A5ZWi4hmr uyWgKC+lvSJnQ== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: John Efstathiades , "David S . Miller" , Sasha Levin Subject: [PATCH 5.10 03/73] lan78xx: Fix white space and style issues Date: Wed, 13 Mar 2024 12:45:30 -0400 Message-ID: <20240313164640.616049-4-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: John Efstathiades [ Upstream commit 9ceec7d33adf9647293f24d2fd9a055b89c63864 ] Fix white space and code style issues identified by checkpatch. Signed-off-by: John Efstathiades Signed-off-by: David S. Miller Stable-dep-of: 1eecc7ab82c4 ("net: lan78xx: fix runtime PM count underflow = on link stop") Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- drivers/net/usb/lan78xx.c | 80 ++++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 38 deletions(-) diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c index c5a666bb86ee4..00424f3375528 100644 --- a/drivers/net/usb/lan78xx.c +++ b/drivers/net/usb/lan78xx.c @@ -385,7 +385,7 @@ struct lan78xx_net { struct usb_anchor deferred; =20 struct mutex phy_mutex; /* for phy access */ - unsigned pipe_in, pipe_out, pipe_intr; + unsigned int pipe_in, pipe_out, pipe_intr; =20 u32 hard_mtu; /* count any extra framing */ size_t rx_urb_size; /* size for rx urbs */ @@ -395,7 +395,7 @@ struct lan78xx_net { wait_queue_head_t *wait; unsigned char suspend_count; =20 - unsigned maxpacket; + unsigned int maxpacket; struct timer_list delay; struct timer_list stat_monitor; =20 @@ -504,7 +504,7 @@ static int lan78xx_read_stats(struct lan78xx_net *dev, if (likely(ret >=3D 0)) { src =3D (u32 *)stats; dst =3D (u32 *)data; - for (i =3D 0; i < sizeof(*stats)/sizeof(u32); i++) { + for (i =3D 0; i < sizeof(*stats) / sizeof(u32); i++) { le32_to_cpus(&src[i]); dst[i] =3D src[i]; } @@ -518,10 +518,11 @@ static int lan78xx_read_stats(struct lan78xx_net *dev, return ret; } =20 -#define check_counter_rollover(struct1, dev_stats, member) { \ - if (struct1->member < dev_stats.saved.member) \ - dev_stats.rollover_count.member++; \ - } +#define check_counter_rollover(struct1, dev_stats, member) \ + do { \ + if ((struct1)->member < (dev_stats).saved.member) \ + (dev_stats).rollover_count.member++; \ + } while (0) =20 static void lan78xx_check_stat_rollover(struct lan78xx_net *dev, struct lan78xx_statstage *stats) @@ -847,9 +848,9 @@ static int lan78xx_read_raw_otp(struct lan78xx_net *dev= , u32 offset, =20 for (i =3D 0; i < length; i++) { lan78xx_write_reg(dev, OTP_ADDR1, - ((offset + i) >> 8) & OTP_ADDR1_15_11); + ((offset + i) >> 8) & OTP_ADDR1_15_11); lan78xx_write_reg(dev, OTP_ADDR2, - ((offset + i) & OTP_ADDR2_10_3)); + ((offset + i) & OTP_ADDR2_10_3)); =20 lan78xx_write_reg(dev, OTP_FUNC_CMD, OTP_FUNC_CMD_READ_); lan78xx_write_reg(dev, OTP_CMD_GO, OTP_CMD_GO_GO_); @@ -903,9 +904,9 @@ static int lan78xx_write_raw_otp(struct lan78xx_net *de= v, u32 offset, =20 for (i =3D 0; i < length; i++) { lan78xx_write_reg(dev, OTP_ADDR1, - ((offset + i) >> 8) & OTP_ADDR1_15_11); + ((offset + i) >> 8) & OTP_ADDR1_15_11); lan78xx_write_reg(dev, OTP_ADDR2, - ((offset + i) & OTP_ADDR2_10_3)); + ((offset + i) & OTP_ADDR2_10_3)); lan78xx_write_reg(dev, OTP_PRGM_DATA, data[i]); lan78xx_write_reg(dev, OTP_TST_CMD, OTP_TST_CMD_PRGVRFY_); lan78xx_write_reg(dev, OTP_CMD_GO, OTP_CMD_GO_GO_); @@ -962,7 +963,7 @@ static int lan78xx_dataport_wait_not_busy(struct lan78x= x_net *dev) usleep_range(40, 100); } =20 - netdev_warn(dev->net, "lan78xx_dataport_wait_not_busy timed out"); + netdev_warn(dev->net, "%s timed out", __func__); =20 return -EIO; } @@ -975,7 +976,7 @@ static int lan78xx_dataport_write(struct lan78xx_net *d= ev, u32 ram_select, int i, ret; =20 if (usb_autopm_get_interface(dev->intf) < 0) - return 0; + return 0; =20 mutex_lock(&pdata->dataport_mutex); =20 @@ -1048,9 +1049,9 @@ static void lan78xx_deferred_multicast_write(struct w= ork_struct *param) for (i =3D 1; i < NUM_OF_MAF; i++) { lan78xx_write_reg(dev, MAF_HI(i), 0); lan78xx_write_reg(dev, MAF_LO(i), - pdata->pfilter_table[i][1]); + pdata->pfilter_table[i][1]); lan78xx_write_reg(dev, MAF_HI(i), - pdata->pfilter_table[i][0]); + pdata->pfilter_table[i][0]); } =20 lan78xx_write_reg(dev, RFE_CTL, pdata->rfe_ctl); @@ -1069,11 +1070,12 @@ static void lan78xx_set_multicast(struct net_device= *netdev) RFE_CTL_DA_PERFECT_ | RFE_CTL_MCAST_HASH_); =20 for (i =3D 0; i < DP_SEL_VHF_HASH_LEN; i++) - pdata->mchash_table[i] =3D 0; + pdata->mchash_table[i] =3D 0; + /* pfilter_table[0] has own HW address */ for (i =3D 1; i < NUM_OF_MAF; i++) { - pdata->pfilter_table[i][0] =3D - pdata->pfilter_table[i][1] =3D 0; + pdata->pfilter_table[i][0] =3D 0; + pdata->pfilter_table[i][1] =3D 0; } =20 pdata->rfe_ctl |=3D RFE_CTL_BCAST_EN_; @@ -1267,9 +1269,10 @@ static void lan78xx_status(struct lan78xx_net *dev, = struct urb *urb) generic_handle_irq(dev->domain_data.phyirq); local_irq_enable(); } - } else + } else { netdev_warn(dev->net, "unexpected interrupt: 0x%08x\n", intdata); + } } =20 static int lan78xx_ethtool_get_eeprom_len(struct net_device *netdev) @@ -1358,7 +1361,7 @@ static void lan78xx_get_wol(struct net_device *netdev, struct lan78xx_priv *pdata =3D (struct lan78xx_priv *)(dev->data[0]); =20 if (usb_autopm_get_interface(dev->intf) < 0) - return; + return; =20 ret =3D lan78xx_read_reg(dev, USB_CFG0, &buf); if (unlikely(ret < 0)) { @@ -1980,7 +1983,7 @@ static int lan8835_fixup(struct phy_device *phydev) =20 /* RGMII MAC TXC Delay Enable */ lan78xx_write_reg(dev, MAC_RGMII_ID, - MAC_RGMII_ID_TXC_DELAY_EN_); + MAC_RGMII_ID_TXC_DELAY_EN_); =20 /* RGMII TX DLL Tune Adjust */ lan78xx_write_reg(dev, RGMII_TX_BYP_DLL, 0x3D00); @@ -3334,9 +3337,10 @@ static void lan78xx_tx_bh(struct lan78xx_net *dev) if (skb) dev_kfree_skb_any(skb); usb_free_urb(urb); - } else + } else { netif_dbg(dev, tx_queued, dev->net, "> tx, len %d, type 0x%x\n", length, skb->protocol); + } } =20 static void lan78xx_rx_bh(struct lan78xx_net *dev) @@ -3437,7 +3441,7 @@ static void lan78xx_delayedwork(struct work_struct *w= ork) unlink_urbs(dev, &dev->rxq); status =3D usb_autopm_get_interface(dev->intf); if (status < 0) - goto fail_halt; + goto fail_halt; status =3D usb_clear_halt(dev->udev, dev->pipe_in); usb_autopm_put_interface(dev->intf); if (status < 0 && @@ -3610,8 +3614,8 @@ static int lan78xx_probe(struct usb_interface *intf, struct net_device *netdev; struct usb_device *udev; int ret; - unsigned maxp; - unsigned period; + unsigned int maxp; + unsigned int period; u8 *buf =3D NULL; =20 udev =3D interface_to_usbdev(intf); @@ -3842,10 +3846,10 @@ static int lan78xx_set_suspend(struct lan78xx_net *= dev, u32 wol) /* set WUF_CFG & WUF_MASK for IPv4 Multicast */ crc =3D lan78xx_wakeframe_crc16(ipv4_multicast, 3); lan78xx_write_reg(dev, WUF_CFG(mask_index), - WUF_CFGX_EN_ | - WUF_CFGX_TYPE_MCAST_ | - (0 << WUF_CFGX_OFFSET_SHIFT_) | - (crc & WUF_CFGX_CRC16_MASK_)); + WUF_CFGX_EN_ | + WUF_CFGX_TYPE_MCAST_ | + (0 << WUF_CFGX_OFFSET_SHIFT_) | + (crc & WUF_CFGX_CRC16_MASK_)); =20 lan78xx_write_reg(dev, WUF_MASK0(mask_index), 7); lan78xx_write_reg(dev, WUF_MASK1(mask_index), 0); @@ -3856,10 +3860,10 @@ static int lan78xx_set_suspend(struct lan78xx_net *= dev, u32 wol) /* for IPv6 Multicast */ crc =3D lan78xx_wakeframe_crc16(ipv6_multicast, 2); lan78xx_write_reg(dev, WUF_CFG(mask_index), - WUF_CFGX_EN_ | - WUF_CFGX_TYPE_MCAST_ | - (0 << WUF_CFGX_OFFSET_SHIFT_) | - (crc & WUF_CFGX_CRC16_MASK_)); + WUF_CFGX_EN_ | + WUF_CFGX_TYPE_MCAST_ | + (0 << WUF_CFGX_OFFSET_SHIFT_) | + (crc & WUF_CFGX_CRC16_MASK_)); =20 lan78xx_write_reg(dev, WUF_MASK0(mask_index), 3); lan78xx_write_reg(dev, WUF_MASK1(mask_index), 0); @@ -3886,10 +3890,10 @@ static int lan78xx_set_suspend(struct lan78xx_net *= dev, u32 wol) */ crc =3D lan78xx_wakeframe_crc16(arp_type, 2); lan78xx_write_reg(dev, WUF_CFG(mask_index), - WUF_CFGX_EN_ | - WUF_CFGX_TYPE_ALL_ | - (0 << WUF_CFGX_OFFSET_SHIFT_) | - (crc & WUF_CFGX_CRC16_MASK_)); + WUF_CFGX_EN_ | + WUF_CFGX_TYPE_ALL_ | + (0 << WUF_CFGX_OFFSET_SHIFT_) | + (crc & WUF_CFGX_CRC16_MASK_)); =20 lan78xx_write_reg(dev, WUF_MASK0(mask_index), 0x3000); lan78xx_write_reg(dev, WUF_MASK1(mask_index), 0); @@ -4034,7 +4038,7 @@ static int lan78xx_resume(struct usb_interface *intf) if (!--dev->suspend_count) { /* resume interrupt URBs */ if (dev->urb_intr && test_bit(EVENT_DEV_OPEN, &dev->flags)) - usb_submit_urb(dev->urb_intr, GFP_NOIO); + usb_submit_urb(dev->urb_intr, GFP_NOIO); =20 spin_lock_irq(&dev->txq.lock); while ((res =3D usb_get_from_anchor(&dev->deferred))) { --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C18D565BBE; Wed, 13 Mar 2024 16:46:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348407; cv=none; b=vCJmyLh/7MbFz5CHY0oPtsHX2S79qV+sfg1Ha/8cC/UH/AtbVbcayeFNrfYKHifTjuKfmOEiI+9JZH6DXLIPgB9Yogqgaf91DAWyYy/IEtHTtN7aVZxU46na7hwKevUUfKVhrmiMlO7VO/XoU2nqN1OYtQ0zg7Inp3I+Luly5gk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348407; c=relaxed/simple; bh=D0Dt+GJn6id+cs409lVpNQItBeOfcwwj/fn3dvP+pw0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=f7D3N2mFkPxTVLoTFeHKnp5An3Xq+Lyp7WJMeYOI15qdVTXXOyax611RWTPSZXQ071AX1+evctqmqjpjjvsAmm4IB9Z1RqP9m4MX7j1bzVL/q+FsR6LhhUtNP+RNimyPLsaOYRAWcRA6vaZv7xQZKg2ok+8eEG4C0LHqOcvOwfQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=uLC6/59e; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="uLC6/59e" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C625CC43394; Wed, 13 Mar 2024 16:46:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348407; bh=D0Dt+GJn6id+cs409lVpNQItBeOfcwwj/fn3dvP+pw0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=uLC6/59er/N+LTCV3dYg9iAgrnyaR3P+lgeDnmpEBhTiC2TQiOBmFgpgOc9qdmQuF Ygye40rdcCBFI7NMcwOj9TJe4/YxH/g1IXZmDg85N96yjK7xXHW/ZyhCSRHHyDEkjm 8BZfgoKDg1n119ctRbxwthbxXdGRKWIe6MmBqxD9dd6MnhiSLOmU0lZHXK5ZUug2eK YzX8Nh9e8glyo4i05pgXiUnx3oWZsKg8cccLP9b6KPegByN/XWxM4zPYEYrhTjSxBh H7SYj9OeGNZt7gTvvPGGiVNXOGzngRlK6yZtS4mhBZ4qrs55v98FwS//oDsTuVjxZ6 TOOhTSyrYi/eQ== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: John Efstathiades , "David S . Miller" , Sasha Levin Subject: [PATCH 5.10 04/73] lan78xx: Add missing return code checks Date: Wed, 13 Mar 2024 12:45:31 -0400 Message-ID: <20240313164640.616049-5-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: John Efstathiades [ Upstream commit 3415f6baaddb9b39d7112247ab39ef3c700f882e ] There are many places in the driver where the return code from a function call is captured but without a subsequent test of the return code and appropriate action taken. This patch adds the missing return code tests and action. In most cases the action is an early exit from the calling function. The function lan78xx_set_suspend() was also updated to make it consistent with lan78xx_suspend(). Signed-off-by: John Efstathiades Signed-off-by: David S. Miller Stable-dep-of: 1eecc7ab82c4 ("net: lan78xx: fix runtime PM count underflow = on link stop") Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- drivers/net/usb/lan78xx.c | 399 +++++++++++++++++++++++++++++++------- 1 file changed, 333 insertions(+), 66 deletions(-) diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c index 00424f3375528..90d6e6c6d0f3f 100644 --- a/drivers/net/usb/lan78xx.c +++ b/drivers/net/usb/lan78xx.c @@ -1165,7 +1165,7 @@ static int lan78xx_link_reset(struct lan78xx_net *dev) /* clear LAN78xx interrupt status */ ret =3D lan78xx_write_reg(dev, INT_STS, INT_STS_PHY_INT_); if (unlikely(ret < 0)) - return -EIO; + return ret; =20 mutex_lock(&phydev->lock); phy_read_status(phydev); @@ -1178,11 +1178,11 @@ static int lan78xx_link_reset(struct lan78xx_net *d= ev) /* reset MAC */ ret =3D lan78xx_read_reg(dev, MAC_CR, &buf); if (unlikely(ret < 0)) - return -EIO; + return ret; buf |=3D MAC_CR_RST_; ret =3D lan78xx_write_reg(dev, MAC_CR, buf); if (unlikely(ret < 0)) - return -EIO; + return ret; =20 del_timer(&dev->stat_monitor); } else if (link && !dev->link_on) { @@ -1194,18 +1194,30 @@ static int lan78xx_link_reset(struct lan78xx_net *d= ev) if (ecmd.base.speed =3D=3D 1000) { /* disable U2 */ ret =3D lan78xx_read_reg(dev, USB_CFG1, &buf); + if (ret < 0) + return ret; buf &=3D ~USB_CFG1_DEV_U2_INIT_EN_; ret =3D lan78xx_write_reg(dev, USB_CFG1, buf); + if (ret < 0) + return ret; /* enable U1 */ ret =3D lan78xx_read_reg(dev, USB_CFG1, &buf); + if (ret < 0) + return ret; buf |=3D USB_CFG1_DEV_U1_INIT_EN_; ret =3D lan78xx_write_reg(dev, USB_CFG1, buf); + if (ret < 0) + return ret; } else { /* enable U1 & U2 */ ret =3D lan78xx_read_reg(dev, USB_CFG1, &buf); + if (ret < 0) + return ret; buf |=3D USB_CFG1_DEV_U2_INIT_EN_; buf |=3D USB_CFG1_DEV_U1_INIT_EN_; ret =3D lan78xx_write_reg(dev, USB_CFG1, buf); + if (ret < 0) + return ret; } } =20 @@ -1223,6 +1235,8 @@ static int lan78xx_link_reset(struct lan78xx_net *dev) =20 ret =3D lan78xx_update_flowcontrol(dev, ecmd.base.duplex, ladv, radv); + if (ret < 0) + return ret; =20 if (!timer_pending(&dev->stat_monitor)) { dev->delta =3D 1; @@ -1233,7 +1247,7 @@ static int lan78xx_link_reset(struct lan78xx_net *dev) tasklet_schedule(&dev->bh); } =20 - return ret; + return 0; } =20 /* some work can't be done in tasklets, so we use keventd @@ -2426,23 +2440,33 @@ static void lan78xx_init_ltm(struct lan78xx_net *de= v) static int lan78xx_reset(struct lan78xx_net *dev) { struct lan78xx_priv *pdata =3D (struct lan78xx_priv *)(dev->data[0]); - u32 buf; - int ret =3D 0; unsigned long timeout; + int ret; + u32 buf; u8 sig; =20 ret =3D lan78xx_read_reg(dev, HW_CFG, &buf); + if (ret < 0) + return ret; + buf |=3D HW_CFG_LRST_; + ret =3D lan78xx_write_reg(dev, HW_CFG, buf); + if (ret < 0) + return ret; =20 timeout =3D jiffies + HZ; do { mdelay(1); ret =3D lan78xx_read_reg(dev, HW_CFG, &buf); + if (ret < 0) + return ret; + if (time_after(jiffies, timeout)) { netdev_warn(dev->net, "timeout on completion of LiteReset"); - return -EIO; + ret =3D -ETIMEDOUT; + return ret; } } while (buf & HW_CFG_LRST_); =20 @@ -2450,13 +2474,22 @@ static int lan78xx_reset(struct lan78xx_net *dev) =20 /* save DEVID for later usage */ ret =3D lan78xx_read_reg(dev, ID_REV, &buf); + if (ret < 0) + return ret; + dev->chipid =3D (buf & ID_REV_CHIP_ID_MASK_) >> 16; dev->chiprev =3D buf & ID_REV_CHIP_REV_MASK_; =20 /* Respond to the IN token with a NAK */ ret =3D lan78xx_read_reg(dev, USB_CFG0, &buf); + if (ret < 0) + return ret; + buf |=3D USB_CFG_BIR_; + ret =3D lan78xx_write_reg(dev, USB_CFG0, buf); + if (ret < 0) + return ret; =20 /* Init LTM */ lan78xx_init_ltm(dev); @@ -2479,53 +2512,105 @@ static int lan78xx_reset(struct lan78xx_net *dev) } =20 ret =3D lan78xx_write_reg(dev, BURST_CAP, buf); + if (ret < 0) + return ret; + ret =3D lan78xx_write_reg(dev, BULK_IN_DLY, DEFAULT_BULK_IN_DELAY); + if (ret < 0) + return ret; =20 ret =3D lan78xx_read_reg(dev, HW_CFG, &buf); + if (ret < 0) + return ret; + buf |=3D HW_CFG_MEF_; + ret =3D lan78xx_write_reg(dev, HW_CFG, buf); + if (ret < 0) + return ret; =20 ret =3D lan78xx_read_reg(dev, USB_CFG0, &buf); + if (ret < 0) + return ret; + buf |=3D USB_CFG_BCE_; + ret =3D lan78xx_write_reg(dev, USB_CFG0, buf); + if (ret < 0) + return ret; =20 /* set FIFO sizes */ buf =3D (MAX_RX_FIFO_SIZE - 512) / 512; + ret =3D lan78xx_write_reg(dev, FCT_RX_FIFO_END, buf); + if (ret < 0) + return ret; =20 buf =3D (MAX_TX_FIFO_SIZE - 512) / 512; + ret =3D lan78xx_write_reg(dev, FCT_TX_FIFO_END, buf); + if (ret < 0) + return ret; =20 ret =3D lan78xx_write_reg(dev, INT_STS, INT_STS_CLEAR_ALL_); + if (ret < 0) + return ret; + ret =3D lan78xx_write_reg(dev, FLOW, 0); + if (ret < 0) + return ret; + ret =3D lan78xx_write_reg(dev, FCT_FLOW, 0); + if (ret < 0) + return ret; =20 /* Don't need rfe_ctl_lock during initialisation */ ret =3D lan78xx_read_reg(dev, RFE_CTL, &pdata->rfe_ctl); + if (ret < 0) + return ret; + pdata->rfe_ctl |=3D RFE_CTL_BCAST_EN_ | RFE_CTL_DA_PERFECT_; + ret =3D lan78xx_write_reg(dev, RFE_CTL, pdata->rfe_ctl); + if (ret < 0) + return ret; =20 /* Enable or disable checksum offload engines */ - lan78xx_set_features(dev->net, dev->net->features); + ret =3D lan78xx_set_features(dev->net, dev->net->features); + if (ret < 0) + return ret; =20 lan78xx_set_multicast(dev->net); =20 /* reset PHY */ ret =3D lan78xx_read_reg(dev, PMT_CTL, &buf); + if (ret < 0) + return ret; + buf |=3D PMT_CTL_PHY_RST_; + ret =3D lan78xx_write_reg(dev, PMT_CTL, buf); + if (ret < 0) + return ret; =20 timeout =3D jiffies + HZ; do { mdelay(1); ret =3D lan78xx_read_reg(dev, PMT_CTL, &buf); + if (ret < 0) + return ret; + if (time_after(jiffies, timeout)) { netdev_warn(dev->net, "timeout waiting for PHY Reset"); - return -EIO; + ret =3D -ETIMEDOUT; + return ret; } } while ((buf & PMT_CTL_PHY_RST_) || !(buf & PMT_CTL_READY_)); =20 ret =3D lan78xx_read_reg(dev, MAC_CR, &buf); + if (ret < 0) + return ret; + /* LAN7801 only has RGMII mode */ if (dev->chipid =3D=3D ID_REV_CHIP_ID_7801_) buf &=3D ~MAC_CR_GMII_EN_; @@ -2540,25 +2625,53 @@ static int lan78xx_reset(struct lan78xx_net *dev) } } ret =3D lan78xx_write_reg(dev, MAC_CR, buf); + if (ret < 0) + return ret; =20 ret =3D lan78xx_read_reg(dev, MAC_TX, &buf); + if (ret < 0) + return ret; + buf |=3D MAC_TX_TXEN_; + ret =3D lan78xx_write_reg(dev, MAC_TX, buf); + if (ret < 0) + return ret; =20 ret =3D lan78xx_read_reg(dev, FCT_TX_CTL, &buf); + if (ret < 0) + return ret; + buf |=3D FCT_TX_CTL_EN_; + ret =3D lan78xx_write_reg(dev, FCT_TX_CTL, buf); + if (ret < 0) + return ret; =20 ret =3D lan78xx_set_rx_max_frame_length(dev, dev->net->mtu + VLAN_ETH_HLEN); + if (ret < 0) + return ret; =20 ret =3D lan78xx_read_reg(dev, MAC_RX, &buf); + if (ret < 0) + return ret; + buf |=3D MAC_RX_RXEN_; + ret =3D lan78xx_write_reg(dev, MAC_RX, buf); + if (ret < 0) + return ret; =20 ret =3D lan78xx_read_reg(dev, FCT_RX_CTL, &buf); + if (ret < 0) + return ret; + buf |=3D FCT_RX_CTL_EN_; + ret =3D lan78xx_write_reg(dev, FCT_RX_CTL, buf); + if (ret < 0) + return ret; =20 return 0; } @@ -2596,7 +2709,7 @@ static int lan78xx_open(struct net_device *net) =20 ret =3D usb_autopm_get_interface(dev->intf); if (ret < 0) - goto out; + return ret; =20 phy_start(net->phydev); =20 @@ -2624,7 +2737,6 @@ static int lan78xx_open(struct net_device *net) done: usb_autopm_put_interface(dev->intf); =20 -out: return ret; } =20 @@ -3788,35 +3900,62 @@ static u16 lan78xx_wakeframe_crc16(const u8 *buf, i= nt len) =20 static int lan78xx_set_suspend(struct lan78xx_net *dev, u32 wol) { - u32 buf; - int mask_index; - u16 crc; - u32 temp_wucsr; - u32 temp_pmt_ctl; const u8 ipv4_multicast[3] =3D { 0x01, 0x00, 0x5E }; const u8 ipv6_multicast[3] =3D { 0x33, 0x33 }; const u8 arp_type[2] =3D { 0x08, 0x06 }; + u32 temp_pmt_ctl; + int mask_index; + u32 temp_wucsr; + u32 buf; + u16 crc; + int ret; + + ret =3D lan78xx_read_reg(dev, MAC_TX, &buf); + if (ret < 0) + return ret; =20 - lan78xx_read_reg(dev, MAC_TX, &buf); buf &=3D ~MAC_TX_TXEN_; - lan78xx_write_reg(dev, MAC_TX, buf); - lan78xx_read_reg(dev, MAC_RX, &buf); + + ret =3D lan78xx_write_reg(dev, MAC_TX, buf); + if (ret < 0) + return ret; + + ret =3D lan78xx_read_reg(dev, MAC_RX, &buf); + if (ret < 0) + return ret; + buf &=3D ~MAC_RX_RXEN_; - lan78xx_write_reg(dev, MAC_RX, buf); =20 - lan78xx_write_reg(dev, WUCSR, 0); - lan78xx_write_reg(dev, WUCSR2, 0); - lan78xx_write_reg(dev, WK_SRC, 0xFFF1FF1FUL); + ret =3D lan78xx_write_reg(dev, MAC_RX, buf); + if (ret < 0) + return ret; + + ret =3D lan78xx_write_reg(dev, WUCSR, 0); + if (ret < 0) + return ret; + ret =3D lan78xx_write_reg(dev, WUCSR2, 0); + if (ret < 0) + return ret; + ret =3D lan78xx_write_reg(dev, WK_SRC, 0xFFF1FF1FUL); + if (ret < 0) + return ret; =20 temp_wucsr =3D 0; =20 temp_pmt_ctl =3D 0; - lan78xx_read_reg(dev, PMT_CTL, &temp_pmt_ctl); + + ret =3D lan78xx_read_reg(dev, PMT_CTL, &temp_pmt_ctl); + if (ret < 0) + return ret; + temp_pmt_ctl &=3D ~PMT_CTL_RES_CLR_WKP_EN_; temp_pmt_ctl |=3D PMT_CTL_RES_CLR_WKP_STS_; =20 - for (mask_index =3D 0; mask_index < NUM_OF_WUF_CFG; mask_index++) - lan78xx_write_reg(dev, WUF_CFG(mask_index), 0); + for (mask_index =3D 0; mask_index < NUM_OF_WUF_CFG; mask_index++) { + ret =3D lan78xx_write_reg(dev, WUF_CFG(mask_index), 0); + if (ret < 0) + return ret; + } =20 mask_index =3D 0; if (wol & WAKE_PHY) { @@ -3845,30 +3984,52 @@ static int lan78xx_set_suspend(struct lan78xx_net *= dev, u32 wol) =20 /* set WUF_CFG & WUF_MASK for IPv4 Multicast */ crc =3D lan78xx_wakeframe_crc16(ipv4_multicast, 3); - lan78xx_write_reg(dev, WUF_CFG(mask_index), - WUF_CFGX_EN_ | - WUF_CFGX_TYPE_MCAST_ | - (0 << WUF_CFGX_OFFSET_SHIFT_) | - (crc & WUF_CFGX_CRC16_MASK_)); - - lan78xx_write_reg(dev, WUF_MASK0(mask_index), 7); - lan78xx_write_reg(dev, WUF_MASK1(mask_index), 0); - lan78xx_write_reg(dev, WUF_MASK2(mask_index), 0); - lan78xx_write_reg(dev, WUF_MASK3(mask_index), 0); + ret =3D lan78xx_write_reg(dev, WUF_CFG(mask_index), + WUF_CFGX_EN_ | + WUF_CFGX_TYPE_MCAST_ | + (0 << WUF_CFGX_OFFSET_SHIFT_) | + (crc & WUF_CFGX_CRC16_MASK_)); + if (ret < 0) + return ret; + + ret =3D lan78xx_write_reg(dev, WUF_MASK0(mask_index), 7); + if (ret < 0) + return ret; + ret =3D lan78xx_write_reg(dev, WUF_MASK1(mask_index), 0); + if (ret < 0) + return ret; + ret =3D lan78xx_write_reg(dev, WUF_MASK2(mask_index), 0); + if (ret < 0) + return ret; + ret =3D lan78xx_write_reg(dev, WUF_MASK3(mask_index), 0); + if (ret < 0) + return ret; + mask_index++; =20 /* for IPv6 Multicast */ crc =3D lan78xx_wakeframe_crc16(ipv6_multicast, 2); - lan78xx_write_reg(dev, WUF_CFG(mask_index), - WUF_CFGX_EN_ | - WUF_CFGX_TYPE_MCAST_ | - (0 << WUF_CFGX_OFFSET_SHIFT_) | - (crc & WUF_CFGX_CRC16_MASK_)); - - lan78xx_write_reg(dev, WUF_MASK0(mask_index), 3); - lan78xx_write_reg(dev, WUF_MASK1(mask_index), 0); - lan78xx_write_reg(dev, WUF_MASK2(mask_index), 0); - lan78xx_write_reg(dev, WUF_MASK3(mask_index), 0); + ret =3D lan78xx_write_reg(dev, WUF_CFG(mask_index), + WUF_CFGX_EN_ | + WUF_CFGX_TYPE_MCAST_ | + (0 << WUF_CFGX_OFFSET_SHIFT_) | + (crc & WUF_CFGX_CRC16_MASK_)); + if (ret < 0) + return ret; + + ret =3D lan78xx_write_reg(dev, WUF_MASK0(mask_index), 3); + if (ret < 0) + return ret; + ret =3D lan78xx_write_reg(dev, WUF_MASK1(mask_index), 0); + if (ret < 0) + return ret; + ret =3D lan78xx_write_reg(dev, WUF_MASK2(mask_index), 0); + if (ret < 0) + return ret; + ret =3D lan78xx_write_reg(dev, WUF_MASK3(mask_index), 0); + if (ret < 0) + return ret; + mask_index++; =20 temp_pmt_ctl |=3D PMT_CTL_WOL_EN_; @@ -3889,16 +4050,27 @@ static int lan78xx_set_suspend(struct lan78xx_net *= dev, u32 wol) * for packettype (offset 12,13) =3D ARP (0x0806) */ crc =3D lan78xx_wakeframe_crc16(arp_type, 2); - lan78xx_write_reg(dev, WUF_CFG(mask_index), - WUF_CFGX_EN_ | - WUF_CFGX_TYPE_ALL_ | - (0 << WUF_CFGX_OFFSET_SHIFT_) | - (crc & WUF_CFGX_CRC16_MASK_)); - - lan78xx_write_reg(dev, WUF_MASK0(mask_index), 0x3000); - lan78xx_write_reg(dev, WUF_MASK1(mask_index), 0); - lan78xx_write_reg(dev, WUF_MASK2(mask_index), 0); - lan78xx_write_reg(dev, WUF_MASK3(mask_index), 0); + ret =3D lan78xx_write_reg(dev, WUF_CFG(mask_index), + WUF_CFGX_EN_ | + WUF_CFGX_TYPE_ALL_ | + (0 << WUF_CFGX_OFFSET_SHIFT_) | + (crc & WUF_CFGX_CRC16_MASK_)); + if (ret < 0) + return ret; + + ret =3D lan78xx_write_reg(dev, WUF_MASK0(mask_index), 0x3000); + if (ret < 0) + return ret; + ret =3D lan78xx_write_reg(dev, WUF_MASK1(mask_index), 0); + if (ret < 0) + return ret; + ret =3D lan78xx_write_reg(dev, WUF_MASK2(mask_index), 0); + if (ret < 0) + return ret; + ret =3D lan78xx_write_reg(dev, WUF_MASK3(mask_index), 0); + if (ret < 0) + return ret; + mask_index++; =20 temp_pmt_ctl |=3D PMT_CTL_WOL_EN_; @@ -3906,7 +4078,9 @@ static int lan78xx_set_suspend(struct lan78xx_net *de= v, u32 wol) temp_pmt_ctl |=3D PMT_CTL_SUS_MODE_0_; } =20 - lan78xx_write_reg(dev, WUCSR, temp_wucsr); + ret =3D lan78xx_write_reg(dev, WUCSR, temp_wucsr); + if (ret < 0) + return ret; =20 /* when multiple WOL bits are set */ if (hweight_long((unsigned long)wol) > 1) { @@ -3914,16 +4088,30 @@ static int lan78xx_set_suspend(struct lan78xx_net *= dev, u32 wol) temp_pmt_ctl &=3D ~PMT_CTL_SUS_MODE_MASK_; temp_pmt_ctl |=3D PMT_CTL_SUS_MODE_0_; } - lan78xx_write_reg(dev, PMT_CTL, temp_pmt_ctl); + ret =3D lan78xx_write_reg(dev, PMT_CTL, temp_pmt_ctl); + if (ret < 0) + return ret; =20 /* clear WUPS */ - lan78xx_read_reg(dev, PMT_CTL, &buf); + ret =3D lan78xx_read_reg(dev, PMT_CTL, &buf); + if (ret < 0) + return ret; + buf |=3D PMT_CTL_WUPS_MASK_; - lan78xx_write_reg(dev, PMT_CTL, buf); + + ret =3D lan78xx_write_reg(dev, PMT_CTL, buf); + if (ret < 0) + return ret; =20 lan78xx_read_reg(dev, MAC_RX, &buf); + if (ret < 0) + return ret; + buf |=3D MAC_RX_RXEN_; + lan78xx_write_reg(dev, MAC_RX, buf); + if (ret < 0) + return ret; =20 return 0; } @@ -3931,7 +4119,6 @@ static int lan78xx_set_suspend(struct lan78xx_net *de= v, u32 wol) static int lan78xx_suspend(struct usb_interface *intf, pm_message_t messag= e) { struct lan78xx_net *dev =3D usb_get_intfdata(intf); - struct lan78xx_priv *pdata =3D (struct lan78xx_priv *)(dev->data[0]); u32 buf; int ret; =20 @@ -3951,11 +4138,24 @@ static int lan78xx_suspend(struct usb_interface *in= tf, pm_message_t message) =20 /* stop TX & RX */ ret =3D lan78xx_read_reg(dev, MAC_TX, &buf); + if (ret < 0) + return ret; + buf &=3D ~MAC_TX_TXEN_; + ret =3D lan78xx_write_reg(dev, MAC_TX, buf); + if (ret < 0) + return ret; + ret =3D lan78xx_read_reg(dev, MAC_RX, &buf); + if (ret < 0) + return ret; + buf &=3D ~MAC_RX_RXEN_; + ret =3D lan78xx_write_reg(dev, MAC_RX, buf); + if (ret < 0) + return ret; =20 /* empty out the rx and queues */ netif_device_detach(dev->net); @@ -3972,25 +4172,50 @@ static int lan78xx_suspend(struct usb_interface *in= tf, pm_message_t message) if (PMSG_IS_AUTO(message)) { /* auto suspend (selective suspend) */ ret =3D lan78xx_read_reg(dev, MAC_TX, &buf); + if (ret < 0) + return ret; + buf &=3D ~MAC_TX_TXEN_; + ret =3D lan78xx_write_reg(dev, MAC_TX, buf); + if (ret < 0) + return ret; + ret =3D lan78xx_read_reg(dev, MAC_RX, &buf); + if (ret < 0) + return ret; + buf &=3D ~MAC_RX_RXEN_; + ret =3D lan78xx_write_reg(dev, MAC_RX, buf); + if (ret < 0) + return ret; =20 ret =3D lan78xx_write_reg(dev, WUCSR, 0); + if (ret < 0) + return ret; ret =3D lan78xx_write_reg(dev, WUCSR2, 0); + if (ret < 0) + return ret; ret =3D lan78xx_write_reg(dev, WK_SRC, 0xFFF1FF1FUL); + if (ret < 0) + return ret; =20 /* set goodframe wakeup */ ret =3D lan78xx_read_reg(dev, WUCSR, &buf); + if (ret < 0) + return ret; =20 buf |=3D WUCSR_RFE_WAKE_EN_; buf |=3D WUCSR_STORE_WAKE_; =20 ret =3D lan78xx_write_reg(dev, WUCSR, buf); + if (ret < 0) + return ret; =20 ret =3D lan78xx_read_reg(dev, PMT_CTL, &buf); + if (ret < 0) + return ret; =20 buf &=3D ~PMT_CTL_RES_CLR_WKP_EN_; buf |=3D PMT_CTL_RES_CLR_WKP_STS_; @@ -4001,18 +4226,36 @@ static int lan78xx_suspend(struct usb_interface *in= tf, pm_message_t message) buf |=3D PMT_CTL_SUS_MODE_3_; =20 ret =3D lan78xx_write_reg(dev, PMT_CTL, buf); + if (ret < 0) + return ret; =20 ret =3D lan78xx_read_reg(dev, PMT_CTL, &buf); + if (ret < 0) + return ret; =20 buf |=3D PMT_CTL_WUPS_MASK_; =20 ret =3D lan78xx_write_reg(dev, PMT_CTL, buf); + if (ret < 0) + return ret; =20 ret =3D lan78xx_read_reg(dev, MAC_RX, &buf); + if (ret < 0) + return ret; + buf |=3D MAC_RX_RXEN_; + ret =3D lan78xx_write_reg(dev, MAC_RX, buf); + if (ret < 0) + return ret; } else { - lan78xx_set_suspend(dev, pdata->wol); + struct lan78xx_priv *pdata; + + pdata =3D (struct lan78xx_priv *)(dev->data[0]); + + ret =3D lan78xx_set_suspend(dev, pdata->wol); + if (ret < 0) + return ret; } } =20 @@ -4037,8 +4280,11 @@ static int lan78xx_resume(struct usb_interface *intf) =20 if (!--dev->suspend_count) { /* resume interrupt URBs */ - if (dev->urb_intr && test_bit(EVENT_DEV_OPEN, &dev->flags)) - usb_submit_urb(dev->urb_intr, GFP_NOIO); + if (dev->urb_intr && test_bit(EVENT_DEV_OPEN, &dev->flags)) { + ret =3D usb_submit_urb(dev->urb_intr, GFP_NOIO); + if (ret < 0) + return ret; + } =20 spin_lock_irq(&dev->txq.lock); while ((res =3D usb_get_from_anchor(&dev->deferred))) { @@ -4065,13 +4311,21 @@ static int lan78xx_resume(struct usb_interface *int= f) } =20 ret =3D lan78xx_write_reg(dev, WUCSR2, 0); + if (ret < 0) + return ret; ret =3D lan78xx_write_reg(dev, WUCSR, 0); + if (ret < 0) + return ret; ret =3D lan78xx_write_reg(dev, WK_SRC, 0xFFF1FF1FUL); + if (ret < 0) + return ret; =20 ret =3D lan78xx_write_reg(dev, WUCSR2, WUCSR2_NS_RCD_ | WUCSR2_ARP_RCD_ | WUCSR2_IPV6_TCPSYN_RCD_ | WUCSR2_IPV4_TCPSYN_RCD_); + if (ret < 0) + return ret; =20 ret =3D lan78xx_write_reg(dev, WUCSR, WUCSR_EEE_TX_WAKE_ | WUCSR_EEE_RX_WAKE_ | @@ -4080,10 +4334,18 @@ static int lan78xx_resume(struct usb_interface *int= f) WUCSR_WUFR_ | WUCSR_MPR_ | WUCSR_BCST_FR_); + if (ret < 0) + return ret; =20 ret =3D lan78xx_read_reg(dev, MAC_TX, &buf); + if (ret < 0) + return ret; + buf |=3D MAC_TX_TXEN_; + ret =3D lan78xx_write_reg(dev, MAC_TX, buf); + if (ret < 0) + return ret; =20 return 0; } @@ -4091,12 +4353,17 @@ static int lan78xx_resume(struct usb_interface *int= f) static int lan78xx_reset_resume(struct usb_interface *intf) { struct lan78xx_net *dev =3D usb_get_intfdata(intf); + int ret; =20 - lan78xx_reset(dev); + ret =3D lan78xx_reset(dev); + if (ret < 0) + return ret; =20 phy_start(dev->net->phydev); =20 - return lan78xx_resume(intf); + ret =3D lan78xx_resume(intf); + + return ret; } =20 static const struct usb_device_id products[] =3D { --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B8003664CF; Wed, 13 Mar 2024 16:46:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348408; cv=none; b=AqthBcnpKpCNW1L6Yk1Zecv7n9Ih+Em0Yb2Z2wkTRGnsl5c7rvbacy2Tz2xgJpp3JIWi0CuefXnSg8qvz+7FOGzMGFFezynOrf5Q43G2NqsJtNb99RrTodDFTItiEFaG+54RTarjZdNiHbswcYjqbo9QWC5WmOdbgnvIIqeubgw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348408; c=relaxed/simple; bh=vneH4rf9MjHVJAVoI2dr0SaHS3HJhWGOTWajNylg/C8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=h3O+wp3XP3VSEl4BnZ3TqcSgADtlCoslioA69SvHWLiSFbsVUh6r0UvYxcqougtQ77PaCgKoVbA4Q6XtiMx/RabO4e+NYHOlFWwHfrrLMFpR6CJ7SkvdXsTKe4qY+HPZm9pGxMtOGoy8ZE0j/0YhyYegNDlKD7PumW3U7cN7Vfg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=uIoHd9X8; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="uIoHd9X8" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E37FCC41606; Wed, 13 Mar 2024 16:46:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348408; bh=vneH4rf9MjHVJAVoI2dr0SaHS3HJhWGOTWajNylg/C8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=uIoHd9X8DLNJ6QLCsfiFHfdCWWC5zFFp+lhcj9lY5b3lUbiAZvumCMuXyc9KKeqg5 lsMdHxPZnnTWAa+e6J/qbIOgk/nVUA6P4ARcNxWB76fvg2UU6SR1Yu6wDPsuCQoyVE i3JBUHDKZyGkCUFVcpi82uBE8VQZvxU62mwGZbEYEQNtz/6WsgaJzlq036NDr5SE3Z cXdku8qdKvRQ9tNNhmNdDH/0NR6QDYtlIMlVcx3TOHxNGFPsVcRN+RlYDX0Nby1XfU xufiqBQF/tcfEhU3+3Eb0oI7Qnfnf1fX317+6APQ72Byin0WmWBFHphn2FWSqUqUYA 4/YoWjk94xYnQ== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: John Efstathiades , "David S . Miller" , Sasha Levin Subject: [PATCH 5.10 05/73] lan78xx: Fix partial packet errors on suspend/resume Date: Wed, 13 Mar 2024 12:45:32 -0400 Message-ID: <20240313164640.616049-6-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: John Efstathiades [ Upstream commit e1210fe63bf8b080edd0805240e90b81b6b069c1 ] The MAC can get out of step with the internal packet FIFOs if the system goes to sleep when the link is active, especially at high data rates. This can result in partial frames in the packet FIFOs that in result in malformed frames being delivered to the host. This occurs because the driver does not enable/disable the internal packet FIFOs in step with the corresponding MAC data path. The following changes fix this problem. Update code that enables/disables the MAC receiver and transmitter to the more general Rx and Tx data path, where the data path in each direction consists of both the MAC function (Tx or Rx) and the corresponding packet FIFO. In the receive path the packet FIFO must be enabled before the MAC receiver but disabled after the MAC receiver. In the transmit path the opposite is true: the packet FIFO must be enabled after the MAC transmitter but disabled before the MAC transmitter. The packet FIFOs can be flushed safely once the corresponding data path is stopped. Signed-off-by: John Efstathiades Signed-off-by: David S. Miller Stable-dep-of: 1eecc7ab82c4 ("net: lan78xx: fix runtime PM count underflow = on link stop") Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- drivers/net/usb/lan78xx.c | 303 +++++++++++++++++++++++++------------- 1 file changed, 197 insertions(+), 106 deletions(-) diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c index 90d6e6c6d0f3f..18269651e84c2 100644 --- a/drivers/net/usb/lan78xx.c +++ b/drivers/net/usb/lan78xx.c @@ -90,6 +90,12 @@ /* statistic update interval (mSec) */ #define STAT_UPDATE_TIMER (1 * 1000) =20 +/* time to wait for MAC or FCT to stop (jiffies) */ +#define HW_DISABLE_TIMEOUT (HZ / 10) + +/* time to wait between polling MAC or FCT state (ms) */ +#define HW_DISABLE_DELAY_MS 1 + /* defines interrupts from interrupt EP */ #define MAX_INT_EP (32) #define INT_EP_INTEP (31) @@ -479,6 +485,26 @@ static int lan78xx_write_reg(struct lan78xx_net *dev, = u32 index, u32 data) return ret; } =20 +static int lan78xx_update_reg(struct lan78xx_net *dev, u32 reg, u32 mask, + u32 data) +{ + int ret; + u32 buf; + + ret =3D lan78xx_read_reg(dev, reg, &buf); + if (ret < 0) + return ret; + + buf &=3D ~mask; + buf |=3D (mask & data); + + ret =3D lan78xx_write_reg(dev, reg, buf); + if (ret < 0) + return ret; + + return 0; +} + static int lan78xx_read_stats(struct lan78xx_net *dev, struct lan78xx_statstage *data) { @@ -2437,6 +2463,156 @@ static void lan78xx_init_ltm(struct lan78xx_net *de= v) lan78xx_write_reg(dev, LTM_INACTIVE1, regs[5]); } =20 +static int lan78xx_start_hw(struct lan78xx_net *dev, u32 reg, u32 hw_enabl= e) +{ + return lan78xx_update_reg(dev, reg, hw_enable, hw_enable); +} + +static int lan78xx_stop_hw(struct lan78xx_net *dev, u32 reg, u32 hw_enable= d, + u32 hw_disabled) +{ + unsigned long timeout; + bool stopped =3D true; + int ret; + u32 buf; + + /* Stop the h/w block (if not already stopped) */ + + ret =3D lan78xx_read_reg(dev, reg, &buf); + if (ret < 0) + return ret; + + if (buf & hw_enabled) { + buf &=3D ~hw_enabled; + + ret =3D lan78xx_write_reg(dev, reg, buf); + if (ret < 0) + return ret; + + stopped =3D false; + timeout =3D jiffies + HW_DISABLE_TIMEOUT; + do { + ret =3D lan78xx_read_reg(dev, reg, &buf); + if (ret < 0) + return ret; + + if (buf & hw_disabled) + stopped =3D true; + else + msleep(HW_DISABLE_DELAY_MS); + } while (!stopped && !time_after(jiffies, timeout)); + } + + ret =3D stopped ? 0 : -ETIME; + + return ret; +} + +static int lan78xx_flush_fifo(struct lan78xx_net *dev, u32 reg, u32 fifo_f= lush) +{ + return lan78xx_update_reg(dev, reg, fifo_flush, fifo_flush); +} + +static int lan78xx_start_tx_path(struct lan78xx_net *dev) +{ + int ret; + + netif_dbg(dev, drv, dev->net, "start tx path"); + + /* Start the MAC transmitter */ + + ret =3D lan78xx_start_hw(dev, MAC_TX, MAC_TX_TXEN_); + if (ret < 0) + return ret; + + /* Start the Tx FIFO */ + + ret =3D lan78xx_start_hw(dev, FCT_TX_CTL, FCT_TX_CTL_EN_); + if (ret < 0) + return ret; + + return 0; +} + +static int lan78xx_stop_tx_path(struct lan78xx_net *dev) +{ + int ret; + + netif_dbg(dev, drv, dev->net, "stop tx path"); + + /* Stop the Tx FIFO */ + + ret =3D lan78xx_stop_hw(dev, FCT_TX_CTL, FCT_TX_CTL_EN_, FCT_TX_CTL_DIS_); + if (ret < 0) + return ret; + + /* Stop the MAC transmitter */ + + ret =3D lan78xx_stop_hw(dev, MAC_TX, MAC_TX_TXEN_, MAC_TX_TXD_); + if (ret < 0) + return ret; + + return 0; +} + +/* The caller must ensure the Tx path is stopped before calling + * lan78xx_flush_tx_fifo(). + */ +static int lan78xx_flush_tx_fifo(struct lan78xx_net *dev) +{ + return lan78xx_flush_fifo(dev, FCT_TX_CTL, FCT_TX_CTL_RST_); +} + +static int lan78xx_start_rx_path(struct lan78xx_net *dev) +{ + int ret; + + netif_dbg(dev, drv, dev->net, "start rx path"); + + /* Start the Rx FIFO */ + + ret =3D lan78xx_start_hw(dev, FCT_RX_CTL, FCT_RX_CTL_EN_); + if (ret < 0) + return ret; + + /* Start the MAC receiver*/ + + ret =3D lan78xx_start_hw(dev, MAC_RX, MAC_RX_RXEN_); + if (ret < 0) + return ret; + + return 0; +} + +static int lan78xx_stop_rx_path(struct lan78xx_net *dev) +{ + int ret; + + netif_dbg(dev, drv, dev->net, "stop rx path"); + + /* Stop the MAC receiver */ + + ret =3D lan78xx_stop_hw(dev, MAC_RX, MAC_RX_RXEN_, MAC_RX_RXD_); + if (ret < 0) + return ret; + + /* Stop the Rx FIFO */ + + ret =3D lan78xx_stop_hw(dev, FCT_RX_CTL, FCT_RX_CTL_EN_, FCT_RX_CTL_DIS_); + if (ret < 0) + return ret; + + return 0; +} + +/* The caller must ensure the Rx path is stopped before calling + * lan78xx_flush_rx_fifo(). + */ +static int lan78xx_flush_rx_fifo(struct lan78xx_net *dev) +{ + return lan78xx_flush_fifo(dev, FCT_RX_CTL, FCT_RX_CTL_RST_); +} + static int lan78xx_reset(struct lan78xx_net *dev) { struct lan78xx_priv *pdata =3D (struct lan78xx_priv *)(dev->data[0]); @@ -2628,23 +2804,7 @@ static int lan78xx_reset(struct lan78xx_net *dev) if (ret < 0) return ret; =20 - ret =3D lan78xx_read_reg(dev, MAC_TX, &buf); - if (ret < 0) - return ret; - - buf |=3D MAC_TX_TXEN_; - - ret =3D lan78xx_write_reg(dev, MAC_TX, buf); - if (ret < 0) - return ret; - - ret =3D lan78xx_read_reg(dev, FCT_TX_CTL, &buf); - if (ret < 0) - return ret; - - buf |=3D FCT_TX_CTL_EN_; - - ret =3D lan78xx_write_reg(dev, FCT_TX_CTL, buf); + ret =3D lan78xx_start_tx_path(dev); if (ret < 0) return ret; =20 @@ -2653,27 +2813,9 @@ static int lan78xx_reset(struct lan78xx_net *dev) if (ret < 0) return ret; =20 - ret =3D lan78xx_read_reg(dev, MAC_RX, &buf); - if (ret < 0) - return ret; - - buf |=3D MAC_RX_RXEN_; - - ret =3D lan78xx_write_reg(dev, MAC_RX, buf); - if (ret < 0) - return ret; + ret =3D lan78xx_start_rx_path(dev); =20 - ret =3D lan78xx_read_reg(dev, FCT_RX_CTL, &buf); - if (ret < 0) - return ret; - - buf |=3D FCT_RX_CTL_EN_; - - ret =3D lan78xx_write_reg(dev, FCT_RX_CTL, buf); - if (ret < 0) - return ret; - - return 0; + return ret; } =20 static void lan78xx_init_stats(struct lan78xx_net *dev) @@ -3910,23 +4052,10 @@ static int lan78xx_set_suspend(struct lan78xx_net *= dev, u32 wol) u16 crc; int ret; =20 - ret =3D lan78xx_read_reg(dev, MAC_TX, &buf); + ret =3D lan78xx_stop_tx_path(dev); if (ret < 0) return ret; - - buf &=3D ~MAC_TX_TXEN_; - - ret =3D lan78xx_write_reg(dev, MAC_TX, buf); - if (ret < 0) - return ret; - - ret =3D lan78xx_read_reg(dev, MAC_RX, &buf); - if (ret < 0) - return ret; - - buf &=3D ~MAC_RX_RXEN_; - - ret =3D lan78xx_write_reg(dev, MAC_RX, buf); + ret =3D lan78xx_stop_rx_path(dev); if (ret < 0) return ret; =20 @@ -4103,17 +4232,9 @@ static int lan78xx_set_suspend(struct lan78xx_net *d= ev, u32 wol) if (ret < 0) return ret; =20 - lan78xx_read_reg(dev, MAC_RX, &buf); - if (ret < 0) - return ret; + ret =3D lan78xx_start_rx_path(dev); =20 - buf |=3D MAC_RX_RXEN_; - - lan78xx_write_reg(dev, MAC_RX, buf); - if (ret < 0) - return ret; - - return 0; + return ret; } =20 static int lan78xx_suspend(struct usb_interface *intf, pm_message_t messag= e) @@ -4136,24 +4257,17 @@ static int lan78xx_suspend(struct usb_interface *in= tf, pm_message_t message) spin_unlock_irq(&dev->txq.lock); } =20 - /* stop TX & RX */ - ret =3D lan78xx_read_reg(dev, MAC_TX, &buf); + /* stop RX */ + ret =3D lan78xx_stop_rx_path(dev); if (ret < 0) return ret; =20 - buf &=3D ~MAC_TX_TXEN_; - - ret =3D lan78xx_write_reg(dev, MAC_TX, buf); + ret =3D lan78xx_flush_rx_fifo(dev); if (ret < 0) return ret; =20 - ret =3D lan78xx_read_reg(dev, MAC_RX, &buf); - if (ret < 0) - return ret; - - buf &=3D ~MAC_RX_RXEN_; - - ret =3D lan78xx_write_reg(dev, MAC_RX, buf); + /* stop Tx */ + ret =3D lan78xx_stop_tx_path(dev); if (ret < 0) return ret; =20 @@ -4171,23 +4285,11 @@ static int lan78xx_suspend(struct usb_interface *in= tf, pm_message_t message) =20 if (PMSG_IS_AUTO(message)) { /* auto suspend (selective suspend) */ - ret =3D lan78xx_read_reg(dev, MAC_TX, &buf); - if (ret < 0) - return ret; - - buf &=3D ~MAC_TX_TXEN_; - - ret =3D lan78xx_write_reg(dev, MAC_TX, buf); - if (ret < 0) - return ret; - - ret =3D lan78xx_read_reg(dev, MAC_RX, &buf); + ret =3D lan78xx_stop_tx_path(dev); if (ret < 0) return ret; =20 - buf &=3D ~MAC_RX_RXEN_; - - ret =3D lan78xx_write_reg(dev, MAC_RX, buf); + ret =3D lan78xx_stop_rx_path(dev); if (ret < 0) return ret; =20 @@ -4239,13 +4341,7 @@ static int lan78xx_suspend(struct usb_interface *int= f, pm_message_t message) if (ret < 0) return ret; =20 - ret =3D lan78xx_read_reg(dev, MAC_RX, &buf); - if (ret < 0) - return ret; - - buf |=3D MAC_RX_RXEN_; - - ret =3D lan78xx_write_reg(dev, MAC_RX, buf); + ret =3D lan78xx_start_rx_path(dev); if (ret < 0) return ret; } else { @@ -4270,7 +4366,6 @@ static int lan78xx_resume(struct usb_interface *intf) struct sk_buff *skb; struct urb *res; int ret; - u32 buf; =20 if (!timer_pending(&dev->stat_monitor)) { dev->delta =3D 1; @@ -4278,6 +4373,10 @@ static int lan78xx_resume(struct usb_interface *intf) jiffies + STAT_UPDATE_TIMER); } =20 + ret =3D lan78xx_flush_tx_fifo(dev); + if (ret < 0) + return ret; + if (!--dev->suspend_count) { /* resume interrupt URBs */ if (dev->urb_intr && test_bit(EVENT_DEV_OPEN, &dev->flags)) { @@ -4337,17 +4436,9 @@ static int lan78xx_resume(struct usb_interface *intf) if (ret < 0) return ret; =20 - ret =3D lan78xx_read_reg(dev, MAC_TX, &buf); - if (ret < 0) - return ret; - - buf |=3D MAC_TX_TXEN_; + ret =3D lan78xx_start_tx_path(dev); =20 - ret =3D lan78xx_write_reg(dev, MAC_TX, buf); - if (ret < 0) - return ret; - - return 0; + return ret; } =20 static int lan78xx_reset_resume(struct usb_interface *intf) --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2430F66B54; Wed, 13 Mar 2024 16:46:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348410; cv=none; b=PDfM81NA67HGsw8fCTv3bwbd4E+3qXpcg8JPvJnsiPt6JemoH2aANDTVredktqMcy2S7TaC7vmVG0KzD2IehA3kOiJ4yX2cL+GnBJrnGg7qZ9nz/XxWVEicNr2zAm8xvknPwVC77WRNS3PMSzarMDHA19J1aXZlAQHVANArZVbc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348410; c=relaxed/simple; bh=j2DzykhZ4zcK7TWRICGF0aipK4bZl0tQ9MBKMMLhLxI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Ile9UPLjQTN82fCpvwbSx5Re+gy6772y48zqoaRYABR70wReH9VHHB9GLgyPQ3YyPsJC0CDSx61tb6PjDIybd++tCwD23ftp3a4WE7F06bs8WfA1gRdJIkPyDBr1kvadyQs4WOyFnKqjAUs0D0V+YQCnktHc/OXbPLCzTZ8xclQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=o71Emngt; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="o71Emngt" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E1051C3278E; Wed, 13 Mar 2024 16:46:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348409; bh=j2DzykhZ4zcK7TWRICGF0aipK4bZl0tQ9MBKMMLhLxI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=o71EmngtV6No1vln2Ty1QhT6baHD9+HO7E6HHOdWOdctMnAPPzonjuobflSvsuUTZ XrY69zv1X6SZEpV4HWsqUf49pZhS8awy305Cccwtq/UqhImhfZItDMWxyqAtcc5AiT TeB9fABJCPWEpAe6lT7mRX6d46HqZKURsSAO4KfNvIRSBEzKvLRUH+gdypzmHdxy2m mm5i802v8F3bXLX8T7lfS15CE61faRf0pmQab6rmFLem0PQYKAmu4u6LOqC2HTu1CP jGwU72XAeQF9hD0ezgwDsDU4ph248VFrr1kxeG3xS4cogEQTe4PVuwFO4gmj7oy6ik xi+hPIhHjwwPw== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: John Efstathiades , "David S . Miller" , Sasha Levin Subject: [PATCH 5.10 06/73] lan78xx: Fix race conditions in suspend/resume handling Date: Wed, 13 Mar 2024 12:45:33 -0400 Message-ID: <20240313164640.616049-7-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: John Efstathiades [ Upstream commit 5f4cc6e25148cc141f97afb41b4dfe9eb1cce613 ] If the interface is given an IP address while the device is suspended (as a result of an auto-suspend event) there is a race between lan78xx_resume() and lan78xx_open() that can result in an exception or failure to handle incoming packets. The following changes fix this problem. Introduce a mutex to serialise operations in the network interface open and stop entry points with respect to the USB driver suspend and resume entry points. Move Tx and Rx data path start/stop to lan78xx_start() and lan78xx_stop() respectively and flush the packet FIFOs before starting the Tx and Rx data paths. This prevents the MAC and FIFOs getting out of step and delivery of malformed packets to the network stack. Stop processing of received packets before disconnecting the PHY from the MAC to prevent a kernel exception caused by handling packets after the PHY device has been removed. Refactor device auto-suspend code to make it consistent with the the system suspend code and make the suspend handler easier to read. Add new code to stop wake-on-lan packets or PHY events resuming the host or device from suspend if the device has not been opened (typically after an IP address is assigned). This patch is dependent on changes to lan78xx_suspend() and lan78xx_resume() introduced in the previous patch of this patch set. Signed-off-by: John Efstathiades Signed-off-by: David S. Miller Stable-dep-of: 1eecc7ab82c4 ("net: lan78xx: fix runtime PM count underflow = on link stop") Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- drivers/net/usb/lan78xx.c | 419 ++++++++++++++++++++++++++------------ 1 file changed, 284 insertions(+), 135 deletions(-) diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c index 18269651e84c2..c177a8676199a 100644 --- a/drivers/net/usb/lan78xx.c +++ b/drivers/net/usb/lan78xx.c @@ -390,6 +390,7 @@ struct lan78xx_net { struct urb *urb_intr; struct usb_anchor deferred; =20 + struct mutex dev_mutex; /* serialise open/stop wrt suspend/resume */ struct mutex phy_mutex; /* for phy access */ unsigned int pipe_in, pipe_out, pipe_intr; =20 @@ -2287,11 +2288,16 @@ static int lan78xx_change_mtu(struct net_device *ne= tdev, int new_mtu) int ll_mtu =3D new_mtu + netdev->hard_header_len; int old_hard_mtu =3D dev->hard_mtu; int old_rx_urb_size =3D dev->rx_urb_size; + int ret; =20 /* no second zero-length packet read wanted after mtu-sized packets */ if ((ll_mtu % dev->maxpacket) =3D=3D 0) return -EDOM; =20 + ret =3D usb_autopm_get_interface(dev->intf); + if (ret < 0) + return ret; + lan78xx_set_rx_max_frame_length(dev, new_mtu + VLAN_ETH_HLEN); =20 netdev->mtu =3D new_mtu; @@ -2307,6 +2313,8 @@ static int lan78xx_change_mtu(struct net_device *netd= ev, int new_mtu) } } =20 + usb_autopm_put_interface(dev->intf); + return 0; } =20 @@ -2804,16 +2812,8 @@ static int lan78xx_reset(struct lan78xx_net *dev) if (ret < 0) return ret; =20 - ret =3D lan78xx_start_tx_path(dev); - if (ret < 0) - return ret; - ret =3D lan78xx_set_rx_max_frame_length(dev, dev->net->mtu + VLAN_ETH_HLEN); - if (ret < 0) - return ret; - - ret =3D lan78xx_start_rx_path(dev); =20 return ret; } @@ -2849,10 +2849,14 @@ static int lan78xx_open(struct net_device *net) struct lan78xx_net *dev =3D netdev_priv(net); int ret; =20 + netif_dbg(dev, ifup, dev->net, "open device"); + ret =3D usb_autopm_get_interface(dev->intf); if (ret < 0) return ret; =20 + mutex_lock(&dev->dev_mutex); + phy_start(net->phydev); =20 netif_dbg(dev, ifup, dev->net, "phy initialised successfully"); @@ -2867,6 +2871,20 @@ static int lan78xx_open(struct net_device *net) } } =20 + ret =3D lan78xx_flush_rx_fifo(dev); + if (ret < 0) + goto done; + ret =3D lan78xx_flush_tx_fifo(dev); + if (ret < 0) + goto done; + + ret =3D lan78xx_start_tx_path(dev); + if (ret < 0) + goto done; + ret =3D lan78xx_start_rx_path(dev); + if (ret < 0) + goto done; + lan78xx_init_stats(dev); =20 set_bit(EVENT_DEV_OPEN, &dev->flags); @@ -2877,6 +2895,8 @@ static int lan78xx_open(struct net_device *net) =20 lan78xx_defer_kevent(dev, EVENT_LINK_RESET); done: + mutex_unlock(&dev->dev_mutex); + usb_autopm_put_interface(dev->intf); =20 return ret; @@ -2895,38 +2915,56 @@ static void lan78xx_terminate_urbs(struct lan78xx_n= et *dev) temp =3D unlink_urbs(dev, &dev->txq) + unlink_urbs(dev, &dev->rxq); =20 /* maybe wait for deletions to finish. */ - while (!skb_queue_empty(&dev->rxq) && - !skb_queue_empty(&dev->txq) && - !skb_queue_empty(&dev->done)) { + while (!skb_queue_empty(&dev->rxq) || + !skb_queue_empty(&dev->txq)) { schedule_timeout(msecs_to_jiffies(UNLINK_TIMEOUT_MS)); set_current_state(TASK_UNINTERRUPTIBLE); netif_dbg(dev, ifdown, dev->net, - "waited for %d urb completions\n", temp); + "waited for %d urb completions", temp); } set_current_state(TASK_RUNNING); dev->wait =3D NULL; remove_wait_queue(&unlink_wakeup, &wait); + + while (!skb_queue_empty(&dev->done)) { + struct skb_data *entry; + struct sk_buff *skb; + + skb =3D skb_dequeue(&dev->done); + entry =3D (struct skb_data *)(skb->cb); + usb_free_urb(entry->urb); + dev_kfree_skb(skb); + } } =20 static int lan78xx_stop(struct net_device *net) { struct lan78xx_net *dev =3D netdev_priv(net); =20 + netif_dbg(dev, ifup, dev->net, "stop device"); + + mutex_lock(&dev->dev_mutex); + if (timer_pending(&dev->stat_monitor)) del_timer_sync(&dev->stat_monitor); =20 - if (net->phydev) - phy_stop(net->phydev); - clear_bit(EVENT_DEV_OPEN, &dev->flags); netif_stop_queue(net); + tasklet_kill(&dev->bh); + + lan78xx_terminate_urbs(dev); =20 netif_info(dev, ifdown, dev->net, "stop stats: rx/tx %lu/%lu, errs %lu/%lu\n", net->stats.rx_packets, net->stats.tx_packets, net->stats.rx_errors, net->stats.tx_errors); =20 - lan78xx_terminate_urbs(dev); + /* ignore errors that occur stopping the Tx and Rx data paths */ + lan78xx_stop_tx_path(dev); + lan78xx_stop_rx_path(dev); + + if (net->phydev) + phy_stop(net->phydev); =20 usb_kill_urb(dev->urb_intr); =20 @@ -2936,12 +2974,17 @@ static int lan78xx_stop(struct net_device *net) * can't flush_scheduled_work() until we drop rtnl (later), * else workers could deadlock; so make workers a NOP. */ - dev->flags =3D 0; + clear_bit(EVENT_TX_HALT, &dev->flags); + clear_bit(EVENT_RX_HALT, &dev->flags); + clear_bit(EVENT_LINK_RESET, &dev->flags); + clear_bit(EVENT_STAT_UPDATE, &dev->flags); + cancel_delayed_work_sync(&dev->wq); - tasklet_kill(&dev->bh); =20 usb_autopm_put_interface(dev->intf); =20 + mutex_unlock(&dev->dev_mutex); + return 0; } =20 @@ -3064,6 +3107,9 @@ lan78xx_start_xmit(struct sk_buff *skb, struct net_de= vice *net) struct lan78xx_net *dev =3D netdev_priv(net); struct sk_buff *skb2 =3D NULL; =20 + if (test_bit(EVENT_DEV_ASLEEP, &dev->flags)) + schedule_delayed_work(&dev->wq, 0); + if (skb) { skb_tx_timestamp(skb); skb2 =3D lan78xx_tx_prep(dev, skb, GFP_ATOMIC); @@ -3670,18 +3716,17 @@ static void lan78xx_delayedwork(struct work_struct = *work) =20 dev =3D container_of(work, struct lan78xx_net, wq.work); =20 + if (usb_autopm_get_interface(dev->intf) < 0) + return; + if (test_bit(EVENT_TX_HALT, &dev->flags)) { unlink_urbs(dev, &dev->txq); - status =3D usb_autopm_get_interface(dev->intf); - if (status < 0) - goto fail_pipe; + status =3D usb_clear_halt(dev->udev, dev->pipe_out); - usb_autopm_put_interface(dev->intf); if (status < 0 && status !=3D -EPIPE && status !=3D -ESHUTDOWN) { if (netif_msg_tx_err(dev)) -fail_pipe: netdev_err(dev->net, "can't clear tx halt, status %d\n", status); @@ -3691,18 +3736,14 @@ static void lan78xx_delayedwork(struct work_struct = *work) netif_wake_queue(dev->net); } } + if (test_bit(EVENT_RX_HALT, &dev->flags)) { unlink_urbs(dev, &dev->rxq); - status =3D usb_autopm_get_interface(dev->intf); - if (status < 0) - goto fail_halt; status =3D usb_clear_halt(dev->udev, dev->pipe_in); - usb_autopm_put_interface(dev->intf); if (status < 0 && status !=3D -EPIPE && status !=3D -ESHUTDOWN) { if (netif_msg_rx_err(dev)) -fail_halt: netdev_err(dev->net, "can't clear rx halt, status %d\n", status); @@ -3716,16 +3757,9 @@ static void lan78xx_delayedwork(struct work_struct *= work) int ret =3D 0; =20 clear_bit(EVENT_LINK_RESET, &dev->flags); - status =3D usb_autopm_get_interface(dev->intf); - if (status < 0) - goto skip_reset; if (lan78xx_link_reset(dev) < 0) { - usb_autopm_put_interface(dev->intf); -skip_reset: netdev_info(dev->net, "link reset failed (%d)\n", ret); - } else { - usb_autopm_put_interface(dev->intf); } } =20 @@ -3739,6 +3773,8 @@ static void lan78xx_delayedwork(struct work_struct *w= ork) =20 dev->delta =3D min((dev->delta * 2), 50); } + + usb_autopm_put_interface(dev->intf); } =20 static void intr_complete(struct urb *urb) @@ -3898,6 +3934,7 @@ static int lan78xx_probe(struct usb_interface *intf, skb_queue_head_init(&dev->rxq_pause); skb_queue_head_init(&dev->txq_pend); mutex_init(&dev->phy_mutex); + mutex_init(&dev->dev_mutex); =20 tasklet_init(&dev->bh, lan78xx_bh, (unsigned long)dev); INIT_DELAYED_WORK(&dev->wq, lan78xx_delayedwork); @@ -4040,6 +4077,74 @@ static u16 lan78xx_wakeframe_crc16(const u8 *buf, in= t len) return crc; } =20 +static int lan78xx_set_auto_suspend(struct lan78xx_net *dev) +{ + u32 buf; + int ret; + + ret =3D lan78xx_stop_tx_path(dev); + if (ret < 0) + return ret; + + ret =3D lan78xx_stop_rx_path(dev); + if (ret < 0) + return ret; + + /* auto suspend (selective suspend) */ + + ret =3D lan78xx_write_reg(dev, WUCSR, 0); + if (ret < 0) + return ret; + ret =3D lan78xx_write_reg(dev, WUCSR2, 0); + if (ret < 0) + return ret; + ret =3D lan78xx_write_reg(dev, WK_SRC, 0xFFF1FF1FUL); + if (ret < 0) + return ret; + + /* set goodframe wakeup */ + + ret =3D lan78xx_read_reg(dev, WUCSR, &buf); + if (ret < 0) + return ret; + + buf |=3D WUCSR_RFE_WAKE_EN_; + buf |=3D WUCSR_STORE_WAKE_; + + ret =3D lan78xx_write_reg(dev, WUCSR, buf); + if (ret < 0) + return ret; + + ret =3D lan78xx_read_reg(dev, PMT_CTL, &buf); + if (ret < 0) + return ret; + + buf &=3D ~PMT_CTL_RES_CLR_WKP_EN_; + buf |=3D PMT_CTL_RES_CLR_WKP_STS_; + buf |=3D PMT_CTL_PHY_WAKE_EN_; + buf |=3D PMT_CTL_WOL_EN_; + buf &=3D ~PMT_CTL_SUS_MODE_MASK_; + buf |=3D PMT_CTL_SUS_MODE_3_; + + ret =3D lan78xx_write_reg(dev, PMT_CTL, buf); + if (ret < 0) + return ret; + + ret =3D lan78xx_read_reg(dev, PMT_CTL, &buf); + if (ret < 0) + return ret; + + buf |=3D PMT_CTL_WUPS_MASK_; + + ret =3D lan78xx_write_reg(dev, PMT_CTL, buf); + if (ret < 0) + return ret; + + ret =3D lan78xx_start_rx_path(dev); + + return ret; +} + static int lan78xx_set_suspend(struct lan78xx_net *dev, u32 wol) { const u8 ipv4_multicast[3] =3D { 0x01, 0x00, 0x5E }; @@ -4240,15 +4345,22 @@ static int lan78xx_set_suspend(struct lan78xx_net *= dev, u32 wol) static int lan78xx_suspend(struct usb_interface *intf, pm_message_t messag= e) { struct lan78xx_net *dev =3D usb_get_intfdata(intf); - u32 buf; + bool dev_open; int ret; =20 - if (!dev->suspend_count++) { + mutex_lock(&dev->dev_mutex); + + netif_dbg(dev, ifdown, dev->net, + "suspending: pm event %#x", message.event); + + dev_open =3D test_bit(EVENT_DEV_OPEN, &dev->flags); + + if (dev_open) { spin_lock_irq(&dev->txq.lock); /* don't autosuspend while transmitting */ if ((skb_queue_len(&dev->txq) || skb_queue_len(&dev->txq_pend)) && - PMSG_IS_AUTO(message)) { + PMSG_IS_AUTO(message)) { spin_unlock_irq(&dev->txq.lock); ret =3D -EBUSY; goto out; @@ -4260,171 +4372,204 @@ static int lan78xx_suspend(struct usb_interface *= intf, pm_message_t message) /* stop RX */ ret =3D lan78xx_stop_rx_path(dev); if (ret < 0) - return ret; + goto out; =20 ret =3D lan78xx_flush_rx_fifo(dev); if (ret < 0) - return ret; + goto out; =20 /* stop Tx */ ret =3D lan78xx_stop_tx_path(dev); if (ret < 0) - return ret; + goto out; =20 - /* empty out the rx and queues */ + /* empty out the Rx and Tx queues */ netif_device_detach(dev->net); lan78xx_terminate_urbs(dev); usb_kill_urb(dev->urb_intr); =20 /* reattach */ netif_device_attach(dev->net); - } =20 - if (test_bit(EVENT_DEV_ASLEEP, &dev->flags)) { del_timer(&dev->stat_monitor); =20 if (PMSG_IS_AUTO(message)) { - /* auto suspend (selective suspend) */ - ret =3D lan78xx_stop_tx_path(dev); + ret =3D lan78xx_set_auto_suspend(dev); if (ret < 0) - return ret; + goto out; + } else { + struct lan78xx_priv *pdata; =20 - ret =3D lan78xx_stop_rx_path(dev); + pdata =3D (struct lan78xx_priv *)(dev->data[0]); + netif_carrier_off(dev->net); + ret =3D lan78xx_set_suspend(dev, pdata->wol); if (ret < 0) - return ret; + goto out; + } + } else { + /* Interface is down; don't allow WOL and PHY + * events to wake up the host + */ + u32 buf; =20 - ret =3D lan78xx_write_reg(dev, WUCSR, 0); - if (ret < 0) - return ret; - ret =3D lan78xx_write_reg(dev, WUCSR2, 0); - if (ret < 0) - return ret; - ret =3D lan78xx_write_reg(dev, WK_SRC, 0xFFF1FF1FUL); - if (ret < 0) - return ret; + set_bit(EVENT_DEV_ASLEEP, &dev->flags); =20 - /* set goodframe wakeup */ - ret =3D lan78xx_read_reg(dev, WUCSR, &buf); - if (ret < 0) - return ret; + ret =3D lan78xx_write_reg(dev, WUCSR, 0); + if (ret < 0) + goto out; + ret =3D lan78xx_write_reg(dev, WUCSR2, 0); + if (ret < 0) + goto out; =20 - buf |=3D WUCSR_RFE_WAKE_EN_; - buf |=3D WUCSR_STORE_WAKE_; + ret =3D lan78xx_read_reg(dev, PMT_CTL, &buf); + if (ret < 0) + goto out; =20 - ret =3D lan78xx_write_reg(dev, WUCSR, buf); - if (ret < 0) - return ret; + buf &=3D ~PMT_CTL_RES_CLR_WKP_EN_; + buf |=3D PMT_CTL_RES_CLR_WKP_STS_; + buf &=3D ~PMT_CTL_SUS_MODE_MASK_; + buf |=3D PMT_CTL_SUS_MODE_3_; =20 - ret =3D lan78xx_read_reg(dev, PMT_CTL, &buf); - if (ret < 0) - return ret; + ret =3D lan78xx_write_reg(dev, PMT_CTL, buf); + if (ret < 0) + goto out; =20 - buf &=3D ~PMT_CTL_RES_CLR_WKP_EN_; - buf |=3D PMT_CTL_RES_CLR_WKP_STS_; + ret =3D lan78xx_read_reg(dev, PMT_CTL, &buf); + if (ret < 0) + goto out; =20 - buf |=3D PMT_CTL_PHY_WAKE_EN_; - buf |=3D PMT_CTL_WOL_EN_; - buf &=3D ~PMT_CTL_SUS_MODE_MASK_; - buf |=3D PMT_CTL_SUS_MODE_3_; + buf |=3D PMT_CTL_WUPS_MASK_; =20 - ret =3D lan78xx_write_reg(dev, PMT_CTL, buf); - if (ret < 0) - return ret; + ret =3D lan78xx_write_reg(dev, PMT_CTL, buf); + if (ret < 0) + goto out; + } =20 - ret =3D lan78xx_read_reg(dev, PMT_CTL, &buf); - if (ret < 0) - return ret; + ret =3D 0; +out: + mutex_unlock(&dev->dev_mutex); =20 - buf |=3D PMT_CTL_WUPS_MASK_; + return ret; +} =20 - ret =3D lan78xx_write_reg(dev, PMT_CTL, buf); - if (ret < 0) - return ret; +static bool lan78xx_submit_deferred_urbs(struct lan78xx_net *dev) +{ + bool pipe_halted =3D false; + struct urb *urb; =20 - ret =3D lan78xx_start_rx_path(dev); - if (ret < 0) - return ret; - } else { - struct lan78xx_priv *pdata; + while ((urb =3D usb_get_from_anchor(&dev->deferred))) { + struct sk_buff *skb =3D urb->context; + int ret; =20 - pdata =3D (struct lan78xx_priv *)(dev->data[0]); + if (!netif_device_present(dev->net) || + !netif_carrier_ok(dev->net) || + pipe_halted) { + usb_free_urb(urb); + dev_kfree_skb(skb); + continue; + } =20 - ret =3D lan78xx_set_suspend(dev, pdata->wol); - if (ret < 0) - return ret; + ret =3D usb_submit_urb(urb, GFP_ATOMIC); + + if (ret =3D=3D 0) { + netif_trans_update(dev->net); + lan78xx_queue_skb(&dev->txq, skb, tx_start); + } else { + usb_free_urb(urb); + dev_kfree_skb(skb); + + if (ret =3D=3D -EPIPE) { + netif_stop_queue(dev->net); + pipe_halted =3D true; + } else if (ret =3D=3D -ENODEV) { + netif_device_detach(dev->net); + } } } =20 - ret =3D 0; -out: - return ret; + return pipe_halted; } =20 static int lan78xx_resume(struct usb_interface *intf) { struct lan78xx_net *dev =3D usb_get_intfdata(intf); - struct sk_buff *skb; - struct urb *res; + bool dev_open; int ret; =20 - if (!timer_pending(&dev->stat_monitor)) { - dev->delta =3D 1; - mod_timer(&dev->stat_monitor, - jiffies + STAT_UPDATE_TIMER); - } + mutex_lock(&dev->dev_mutex); =20 - ret =3D lan78xx_flush_tx_fifo(dev); - if (ret < 0) - return ret; + netif_dbg(dev, ifup, dev->net, "resuming device"); =20 - if (!--dev->suspend_count) { - /* resume interrupt URBs */ - if (dev->urb_intr && test_bit(EVENT_DEV_OPEN, &dev->flags)) { - ret =3D usb_submit_urb(dev->urb_intr, GFP_NOIO); - if (ret < 0) - return ret; - } + dev_open =3D test_bit(EVENT_DEV_OPEN, &dev->flags); + + if (dev_open) { + bool pipe_halted =3D false; + + ret =3D lan78xx_flush_tx_fifo(dev); + if (ret < 0) + goto out; + + if (dev->urb_intr) { + int ret =3D usb_submit_urb(dev->urb_intr, GFP_KERNEL); =20 - spin_lock_irq(&dev->txq.lock); - while ((res =3D usb_get_from_anchor(&dev->deferred))) { - skb =3D (struct sk_buff *)res->context; - ret =3D usb_submit_urb(res, GFP_ATOMIC); if (ret < 0) { - dev_kfree_skb_any(skb); - usb_free_urb(res); - usb_autopm_put_interface_async(dev->intf); - } else { - netif_trans_update(dev->net); - lan78xx_queue_skb(&dev->txq, skb, tx_start); + if (ret =3D=3D -ENODEV) + netif_device_detach(dev->net); + + netdev_warn(dev->net, "Failed to submit intr URB"); } } =20 + spin_lock_irq(&dev->txq.lock); + + if (netif_device_present(dev->net)) { + pipe_halted =3D lan78xx_submit_deferred_urbs(dev); + + if (pipe_halted) + lan78xx_defer_kevent(dev, EVENT_TX_HALT); + } + clear_bit(EVENT_DEV_ASLEEP, &dev->flags); + spin_unlock_irq(&dev->txq.lock); =20 - if (test_bit(EVENT_DEV_OPEN, &dev->flags)) { - if (!(skb_queue_len(&dev->txq) >=3D dev->tx_qlen)) - netif_start_queue(dev->net); - tasklet_schedule(&dev->bh); + if (!pipe_halted && + netif_device_present(dev->net) && + (skb_queue_len(&dev->txq) < dev->tx_qlen)) + netif_start_queue(dev->net); + + ret =3D lan78xx_start_tx_path(dev); + if (ret < 0) + goto out; + + tasklet_schedule(&dev->bh); + + if (!timer_pending(&dev->stat_monitor)) { + dev->delta =3D 1; + mod_timer(&dev->stat_monitor, + jiffies + STAT_UPDATE_TIMER); } + + } else { + clear_bit(EVENT_DEV_ASLEEP, &dev->flags); } =20 ret =3D lan78xx_write_reg(dev, WUCSR2, 0); if (ret < 0) - return ret; + goto out; ret =3D lan78xx_write_reg(dev, WUCSR, 0); if (ret < 0) - return ret; + goto out; ret =3D lan78xx_write_reg(dev, WK_SRC, 0xFFF1FF1FUL); if (ret < 0) - return ret; + goto out; =20 ret =3D lan78xx_write_reg(dev, WUCSR2, WUCSR2_NS_RCD_ | WUCSR2_ARP_RCD_ | WUCSR2_IPV6_TCPSYN_RCD_ | WUCSR2_IPV4_TCPSYN_RCD_); if (ret < 0) - return ret; + goto out; =20 ret =3D lan78xx_write_reg(dev, WUCSR, WUCSR_EEE_TX_WAKE_ | WUCSR_EEE_RX_WAKE_ | @@ -4434,9 +4579,11 @@ static int lan78xx_resume(struct usb_interface *intf) WUCSR_MPR_ | WUCSR_BCST_FR_); if (ret < 0) - return ret; + goto out; =20 - ret =3D lan78xx_start_tx_path(dev); + ret =3D 0; +out: + mutex_unlock(&dev->dev_mutex); =20 return ret; } @@ -4446,6 +4593,8 @@ static int lan78xx_reset_resume(struct usb_interface = *intf) struct lan78xx_net *dev =3D usb_get_intfdata(intf); int ret; =20 + netif_dbg(dev, ifup, dev->net, "(reset) resuming device"); + ret =3D lan78xx_reset(dev); if (ret < 0) return ret; --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1F9DC67754; Wed, 13 Mar 2024 16:46:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348411; cv=none; b=co4Wq3qfuuN6apaVomvn7p7tbtRRFOwYGc3kUBr/6SEjS4mrBNJ8QgkxWdGE1M9NghCBSUNFelpIikDo1tmycoFW16Gou4zji3sxgSUq34hqplbXjg2hWzRURSB13THy7e2Wh0gzW3FUAUBmLH2SyjoxPdwQ8f4CCy3QT6o75qU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348411; c=relaxed/simple; bh=A0GB0o0Zf7AF2xnffGhuanuAWjWaPkc81sGoJGnWE0c=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hoyyBiOLSYAdnwLBGxNKrFg8SEBpZcfPM7uiWLsPqTFk9ViziTTf0bDbyfyZRlWDsTyZd6bT3giRQgMf2/UfMlA2keOu0plEs4G2BjAi9B8FsmDwUZUtF6YyuIZ5lCko1ImMLlpb3iYtY3RGP5r7oDTd1gxPhVpZYYXqQIQYAvI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=RU5tHiUj; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="RU5tHiUj" Received: by smtp.kernel.org (Postfix) with ESMTPSA id DF052C43390; Wed, 13 Mar 2024 16:46:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348410; bh=A0GB0o0Zf7AF2xnffGhuanuAWjWaPkc81sGoJGnWE0c=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=RU5tHiUjhYKphBotvRW28ZURzm/I6AIWieQuJ29gnpRfbUAZxz5zlGGV6+yUy+sbO z+xyYCDfliQQaWMOsTeA3CHcdVSQyeUrvq66THTymvJbHK+TyvXgoyAfeVa67SkxX5 hNLW+qRBCSAEQPfoQFhgF0J0Ngk7F2JbG/Hg9yJ/jFR/B726FkD7rmzwolg4SOdWsz olpkRNrDV0h4eZzGGvjbqPNSVX4qi4odJFXaYv9R7n7gMhwyx8PeBBd8sDBNHc3nn7 7Z/tvi/kzSWP29QjksZjAjJZk9bL+flSyHUTDFAgSAH4L9+u4S0yoLe3e6PqkOuOHr 1H0I3cq7qog9w== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Oleksij Rempel , Jiri Pirko , "David S . Miller" , Sasha Levin Subject: [PATCH 5.10 07/73] net: lan78xx: fix runtime PM count underflow on link stop Date: Wed, 13 Mar 2024 12:45:34 -0400 Message-ID: <20240313164640.616049-8-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Oleksij Rempel [ Upstream commit 1eecc7ab82c42133b748e1895275942a054a7f67 ] Current driver has some asymmetry in the runtime PM calls. On lan78xx_open() it will call usb_autopm_get() and unconditionally usb_autopm_put(). And on lan78xx_stop() it will call only usb_autopm_put(). So far, it was working only because this driver do not activate autosuspend by default, so it was visible only by warning "Runtime PM usage count underflow!". Since, with current driver, we can't use runtime PM with active link, execute lan78xx_open()->usb_autopm_put() only in error case. Otherwise, keep ref counting high as long as interface is open. Fixes: 55d7de9de6c3 ("Microchip's LAN7800 family USB 2/3 to 10/100/1000 Eth= ernet device driver") Signed-off-by: Oleksij Rempel Reviewed-by: Jiri Pirko Signed-off-by: David S. Miller Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- drivers/net/usb/lan78xx.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c index c177a8676199a..96d3d0bd248bc 100644 --- a/drivers/net/usb/lan78xx.c +++ b/drivers/net/usb/lan78xx.c @@ -2897,7 +2897,8 @@ static int lan78xx_open(struct net_device *net) done: mutex_unlock(&dev->dev_mutex); =20 - usb_autopm_put_interface(dev->intf); + if (ret < 0) + usb_autopm_put_interface(dev->intf); =20 return ret; } --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 32EB767A12; Wed, 13 Mar 2024 16:46:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348412; cv=none; b=W7v6fzzBq80OKhQ+1wimmqK22zNz0Z6NMw7lFba55GiJYvA8sjuV4BDt+e4FXy3PF0CPTwQ1K/jdGOThPWj6Z+9ir0x5zWADJkObQgXUFRGwe6i2aXsDDKXAcVLxGXFwXAetKh1okP88jRtBbkDPo7F1Wd4EuRdCx8Tbw1thUIQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348412; c=relaxed/simple; bh=2qIOP+mIMziKVTG/sY6v8n7h17Tczgn5igYdDCbNxuM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Rzk+OUBACh7Zb+oajIb+nO9eUIpo5YQP+W/WLWxUMTlAaPcj4AY4N5SRnfDpQoJUx52ZhfAF2qrY7nUsFP+Y5VqbLbSb3dJDpSmrzIG8EJOMEHpxTvgJjzey9OaLsf2jYjMvKHbxGx6nVfTIT7ISF/sMPoEppmS9v5yG3uD5l5I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=t+BWWnFA; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="t+BWWnFA" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 02450C43399; Wed, 13 Mar 2024 16:46:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348412; bh=2qIOP+mIMziKVTG/sY6v8n7h17Tczgn5igYdDCbNxuM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=t+BWWnFAYoxQtlVPvwgX7FOEhxDRnhop93bSbSXC1dw6JCwBP7HF/keWhL4i89lK5 N4lyNcHc+7EgGcVe+DjkujttxBICm/iKf9qz7sGJV1jMSiSxqmqbGsfbWL1W0xEftU 49hub2Kce+TtrVJVEiksXvHqVVrszASy6q4CWHCpI03ITapHiZJqajGdk0W0+q+mJ0 9DuVjBjKoMnY7FzC5pDTf8hKTSmynWtLbW5lVYs0I5DhrJnVylJpa95jdWHsXU/MA7 3rrF9VxSxvrIryArjPEzgeTXhMXseC5ZdU7mJYeQKHf5EWbJ5QeyurkCToTKeOAshB DoL605tzxWohw== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Maciej Fijalkowski , Pavel Vazharov , Magnus Karlsson , Chandan Kumar Rout , Tony Nguyen , Sasha Levin Subject: [PATCH 5.10 08/73] ixgbe: {dis, en}able irqs in ixgbe_txrx_ring_{dis, en}able Date: Wed, 13 Mar 2024 12:45:35 -0400 Message-ID: <20240313164640.616049-9-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Maciej Fijalkowski [ Upstream commit cbf996f52c4e658b3fb4349a869a62fd2d4c3c1c ] Currently routines that are supposed to toggle state of ring pair do not take care of associated interrupt with queue vector that these rings belong to. This causes funky issues such as dead interface due to irq misconfiguration, as per Pavel's report from Closes: tag. Add a function responsible for disabling single IRQ in EIMC register and call this as a very first thing when disabling ring pair during xsk_pool setup. For enable let's reuse ixgbe_irq_enable_queues(). Besides this, disable/enable NAPI as first/last thing when dealing with closing or opening ring pair that xsk_pool is being configured on. Reported-by: Pavel Vazharov Closes: https://lore.kernel.org/netdev/CAJEV1ijxNyPTwASJER1bcZzS9nMoZJqfR86= nu_3jFFVXzZQ4NA@mail.gmail.com/ Fixes: 024aa5800f32 ("ixgbe: added Rx/Tx ring disable/enable functions") Signed-off-by: Maciej Fijalkowski Acked-by: Magnus Karlsson Tested-by: Chandan Kumar Rout (A Contingent Worke= r at Intel) Signed-off-by: Tony Nguyen Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 56 ++++++++++++++++--- 1 file changed, 49 insertions(+), 7 deletions(-) diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/et= hernet/intel/ixgbe/ixgbe_main.c index b16cb2365d960..b7672200dc624 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c @@ -2949,8 +2949,8 @@ static void ixgbe_check_lsc(struct ixgbe_adapter *ada= pter) static inline void ixgbe_irq_enable_queues(struct ixgbe_adapter *adapter, u64 qmask) { - u32 mask; struct ixgbe_hw *hw =3D &adapter->hw; + u32 mask; =20 switch (hw->mac.type) { case ixgbe_mac_82598EB: @@ -10394,6 +10394,44 @@ static void ixgbe_reset_rxr_stats(struct ixgbe_rin= g *rx_ring) memset(&rx_ring->rx_stats, 0, sizeof(rx_ring->rx_stats)); } =20 +/** + * ixgbe_irq_disable_single - Disable single IRQ vector + * @adapter: adapter structure + * @ring: ring index + **/ +static void ixgbe_irq_disable_single(struct ixgbe_adapter *adapter, u32 ri= ng) +{ + struct ixgbe_hw *hw =3D &adapter->hw; + u64 qmask =3D BIT_ULL(ring); + u32 mask; + + switch (adapter->hw.mac.type) { + case ixgbe_mac_82598EB: + mask =3D qmask & IXGBE_EIMC_RTX_QUEUE; + IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, mask); + break; + case ixgbe_mac_82599EB: + case ixgbe_mac_X540: + case ixgbe_mac_X550: + case ixgbe_mac_X550EM_x: + case ixgbe_mac_x550em_a: + mask =3D (qmask & 0xFFFFFFFF); + if (mask) + IXGBE_WRITE_REG(hw, IXGBE_EIMS_EX(0), mask); + mask =3D (qmask >> 32); + if (mask) + IXGBE_WRITE_REG(hw, IXGBE_EIMS_EX(1), mask); + break; + default: + break; + } + IXGBE_WRITE_FLUSH(&adapter->hw); + if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) + synchronize_irq(adapter->msix_entries[ring].vector); + else + synchronize_irq(adapter->pdev->irq); +} + /** * ixgbe_txrx_ring_disable - Disable Rx/Tx/XDP Tx rings * @adapter: adapter structure @@ -10410,6 +10448,11 @@ void ixgbe_txrx_ring_disable(struct ixgbe_adapter = *adapter, int ring) tx_ring =3D adapter->tx_ring[ring]; xdp_ring =3D adapter->xdp_ring[ring]; =20 + ixgbe_irq_disable_single(adapter, ring); + + /* Rx/Tx/XDP Tx share the same napi context. */ + napi_disable(&rx_ring->q_vector->napi); + ixgbe_disable_txr(adapter, tx_ring); if (xdp_ring) ixgbe_disable_txr(adapter, xdp_ring); @@ -10418,9 +10461,6 @@ void ixgbe_txrx_ring_disable(struct ixgbe_adapter *= adapter, int ring) if (xdp_ring) synchronize_rcu(); =20 - /* Rx/Tx/XDP Tx share the same napi context. */ - napi_disable(&rx_ring->q_vector->napi); - ixgbe_clean_tx_ring(tx_ring); if (xdp_ring) ixgbe_clean_tx_ring(xdp_ring); @@ -10448,9 +10488,6 @@ void ixgbe_txrx_ring_enable(struct ixgbe_adapter *a= dapter, int ring) tx_ring =3D adapter->tx_ring[ring]; xdp_ring =3D adapter->xdp_ring[ring]; =20 - /* Rx/Tx/XDP Tx share the same napi context. */ - napi_enable(&rx_ring->q_vector->napi); - ixgbe_configure_tx_ring(adapter, tx_ring); if (xdp_ring) ixgbe_configure_tx_ring(adapter, xdp_ring); @@ -10459,6 +10496,11 @@ void ixgbe_txrx_ring_enable(struct ixgbe_adapter *= adapter, int ring) clear_bit(__IXGBE_TX_DISABLED, &tx_ring->state); if (xdp_ring) clear_bit(__IXGBE_TX_DISABLED, &xdp_ring->state); + + /* Rx/Tx/XDP Tx share the same napi context. */ + napi_enable(&rx_ring->q_vector->napi); + ixgbe_irq_enable_queues(adapter, BIT_ULL(ring)); + IXGBE_WRITE_FLUSH(&adapter->hw); } =20 /** --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 58BD767C69; Wed, 13 Mar 2024 16:46:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348413; cv=none; b=KjbqC15IWgkqVhnhPWvXYG8pwGsXS8inKBzHdHK5kiZcp6Tcfk5RWQh+Fkcg/UYQEdtq2hB2EMaNNvFXA+Ffy+etE8izoW6u+PjRN2TsORyE65HXclXdC8g/n545llo1T2wZBt/OJkoOcK1FU+2hL5OdqQunBvWkftjZnOJ+F9g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348413; c=relaxed/simple; bh=JuUzgWLjbmAIbnZtPpwLIN0qTxIT2Lp4qIMEXgEOX1Y=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=LgqWHwTVH5a2leWJ/UmXKvpA6zHaaQLiwk9lNvT+rc4sEgQ/KvOxkAA93I409Bvy9HUJKYsh4HZmUrqhpAZuNtDux1n9XLF7AOY9O/VQLHm9pmPlZ1w8WbkcEN3dJ7N3SiyWyfdnS0eOAy2ncBZZon24BpYQjpoe2fuIXcTvK38= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=NRWLkwlF; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="NRWLkwlF" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 57B38C433C7; Wed, 13 Mar 2024 16:46:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348413; bh=JuUzgWLjbmAIbnZtPpwLIN0qTxIT2Lp4qIMEXgEOX1Y=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=NRWLkwlFm97TN163cmPIUUgx6qQvS31hP2BAmTMFTGRK1PtPpvh95Bs/sG/2krNZ6 Q1YScPA+nr+Ub6NpTN/FyTL7ek0JYxBAAgqC6Yx9NKHrHrxxHon6a4tE6JkpOUaDeZ yczUUmD/Tkjp0j8vOVdLRiynjF65T+meIhMnvF6j82tXIkqaUtwHMABC1Laul1eCEa mhrk/Ea59/yZD/OXU1fxS7AWnYTlo+SySxDPcM1vJCph6FYJH4gBF83s4BqK8f8Pg+ Os27cR7GtHVikH8an1RU3l2EN84Rnhz0+fWQE2FXxHhElXeNt95FZ3tFm8J7Ju8Z9u M9RG8RjZVKD6w== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Maciej Fijalkowski , Chandan Kumar Rout , Magnus Karlsson , Tony Nguyen , Sasha Levin Subject: [PATCH 5.10 09/73] i40e: disable NAPI right after disabling irqs when handling xsk_pool Date: Wed, 13 Mar 2024 12:45:36 -0400 Message-ID: <20240313164640.616049-10-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Maciej Fijalkowski [ Upstream commit d562b11c1eac7d73f4c778b4cbe5468f86b1f20d ] Disable NAPI before shutting down queues that this particular NAPI contains so that the order of actions in i40e_queue_pair_disable() mirrors what we do in i40e_queue_pair_enable(). Fixes: 123cecd427b6 ("i40e: added queue pair disable/enable functions") Signed-off-by: Maciej Fijalkowski Tested-by: Chandan Kumar Rout (A Contingent Worke= r at Intel) Acked-by: Magnus Karlsson Signed-off-by: Tony Nguyen Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- drivers/net/ethernet/intel/i40e/i40e_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethe= rnet/intel/i40e/i40e_main.c index 135acd74497f3..58c87d79c1261 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_main.c +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c @@ -12944,9 +12944,9 @@ int i40e_queue_pair_disable(struct i40e_vsi *vsi, i= nt queue_pair) return err; =20 i40e_queue_pair_disable_irq(vsi, queue_pair); + i40e_queue_pair_toggle_napi(vsi, queue_pair, false /* off */); err =3D i40e_queue_pair_toggle_rings(vsi, queue_pair, false /* off */); i40e_clean_rx_ring(vsi->rx_rings[queue_pair]); - i40e_queue_pair_toggle_napi(vsi, queue_pair, false /* off */); i40e_queue_pair_clean_rings(vsi, queue_pair); i40e_queue_pair_reset_stats(vsi, queue_pair); =20 --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 75B641504F8; Wed, 13 Mar 2024 16:46:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348414; cv=none; b=mv3JWW/+c1MXwMhO2+Ix5tL5Se959ZCXF+0bd0RtC6jXRrxNr/i+TmhMVqTmj5mEfdq+g8zb3Tgvi2r58meUGFhVlDzedRiiWHjBCtfRXLlOzRPsRhcgmkhumFch2qQk7tE7K8WZHr/nWtclXCOf5CdwqrX0VBLlYqH/lIo5nF4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348414; c=relaxed/simple; bh=omi08HlZB7RPci6HACpNcDwsfJMHYTb4HMrBrSZf9Cw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=cBx5jV2vnoRnLKxSfusuTRbilzLwfLLgWVwV+JcmBv0vha82L5kY5KLdfanxaLRb46NJ1iVw4LfqAoORtef7ZauIaxCgjgIZdThEn3xhgnOmviVnHEMEPdaZe8tlYOom4jb+rZWABvZT2HuABUq7sOz57LfSuX+4vcsY5RzXgGo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=eYQ8MvJz; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="eYQ8MvJz" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 84219C43394; Wed, 13 Mar 2024 16:46:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348414; bh=omi08HlZB7RPci6HACpNcDwsfJMHYTb4HMrBrSZf9Cw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=eYQ8MvJzCLOkOhj6oabegtSZcnAE3u49on1+xq3vlXEsLjX+luSUQ19MrajbChHpY VTJ44Ag6VlFdBDO01vLcc3vyW/rb8rfoTDundxhRAAObjhs/OeWWY7hKJx/PxI+wcV 9qjutpylDBSLyZQ/0pC6zbGiYrwZZvLgBYpVGWw/f/dDw+phPdzdBToRhPag9VmyNa CC7YpC3dFyuCYMMCSIND4CG3cbQLymqHu5KgxQRXI+lzVcS3bNba48fU5hS9ZIiZae mAL//C80dPCehOZ71cKL7m89VtmNvMmyVdh4tMxWtLwegc0TU+nOzQbzWclyFLbzHz sBmCxbzg8YtfA== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: "Steven Rostedt (Google)" , Jamal Hadi Salim , "David S . Miller" , Sasha Levin Subject: [PATCH 5.10 10/73] tracing/net_sched: Fix tracepoints that save qdisc_dev() as a string Date: Wed, 13 Mar 2024 12:45:37 -0400 Message-ID: <20240313164640.616049-11-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable From: "Steven Rostedt (Google)" [ Upstream commit 51270d573a8d9dd5afdc7934de97d66c0e14b5fd ] I'm updating __assign_str() and will be removing the second parameter. To make sure that it does not break anything, I make sure that it matches the __string() field, as that is where the string is actually going to be saved in. To make sure there's nothing that breaks, I added a WARN_ON() to make sure that what was used in __string() is the same that is used in __assign_str(). In doing this change, an error was triggered as __assign_str() now expects the string passed in to be a char * value. I instead had the following warning: include/trace/events/qdisc.h: In function =E2=80=98trace_event_raw_event_qd= isc_reset=E2=80=99: include/trace/events/qdisc.h:91:35: error: passing argument 1 of 'strcmp' f= rom incompatible pointer type [-Werror=3Dincompatible-pointer-types] 91 | __assign_str(dev, qdisc_dev(q)); That's because the qdisc_enqueue() and qdisc_reset() pass in qdisc_dev(q) to __assign_str() and to __string(). But that function returns a pointer to struct net_device and not a string. It appears that these events are just saving the pointer as a string and then reading it as a string as well. Use qdisc_dev(q)->name to save the device instead. Fixes: a34dac0b90552 ("net_sched: add tracepoints for qdisc_reset() and qdi= sc_destroy()") Signed-off-by: Steven Rostedt (Google) Reviewed-by: Jamal Hadi Salim Signed-off-by: David S. Miller Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- include/trace/events/qdisc.h | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/include/trace/events/qdisc.h b/include/trace/events/qdisc.h index 330d32d84485b..a50df41634c58 100644 --- a/include/trace/events/qdisc.h +++ b/include/trace/events/qdisc.h @@ -53,14 +53,14 @@ TRACE_EVENT(qdisc_reset, TP_ARGS(q), =20 TP_STRUCT__entry( - __string( dev, qdisc_dev(q) ) - __string( kind, q->ops->id ) - __field( u32, parent ) - __field( u32, handle ) + __string( dev, qdisc_dev(q)->name ) + __string( kind, q->ops->id ) + __field( u32, parent ) + __field( u32, handle ) ), =20 TP_fast_assign( - __assign_str(dev, qdisc_dev(q)); + __assign_str(dev, qdisc_dev(q)->name); __assign_str(kind, q->ops->id); __entry->parent =3D q->parent; __entry->handle =3D q->handle; @@ -78,14 +78,14 @@ TRACE_EVENT(qdisc_destroy, TP_ARGS(q), =20 TP_STRUCT__entry( - __string( dev, qdisc_dev(q) ) - __string( kind, q->ops->id ) - __field( u32, parent ) - __field( u32, handle ) + __string( dev, qdisc_dev(q)->name ) + __string( kind, q->ops->id ) + __field( u32, parent ) + __field( u32, handle ) ), =20 TP_fast_assign( - __assign_str(dev, qdisc_dev(q)); + __assign_str(dev, qdisc_dev(q)->name); __assign_str(kind, q->ops->id); __entry->parent =3D q->parent; __entry->handle =3D q->handle; --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9BDF515099B; Wed, 13 Mar 2024 16:46:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348415; cv=none; b=YzpTjxh6aUMiYaFHXEWL1kEOrkHAT7yVycXENfb+RHTxYBg69BIC0dyXPxyVuQ6pA0qZazNNq6W+JSy56NLJ2KxnfnqKgXzyyX0dh36MCU84Jm9TBXNcTwjDIXzxrQ0rsqFr8OTxX+iqpt5LDnupCpMR+fhCIEyOK8ZaKYWu1xk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348415; c=relaxed/simple; bh=ikYP7GgT1Knk2KrrqCDL8WCKM7IMr/UR89wnWQF8slA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mZmNp3sVZeArA7d+dCqlqvU9oDStx2jeiGpnqSFPvygfxZQDvpFc8iTuwZnwRMBBp081vC1mGh0kCG5lDbAYKS1XnOWOlZ8hgiSck9AbNCzGnIcQdJz04/9dOVDK7W1HYVej2oHySK7ockl06Ja3dGze2VvW67WPhrixfYPML3k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=mIMaSn75; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="mIMaSn75" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 974B1C433C7; Wed, 13 Mar 2024 16:46:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348415; bh=ikYP7GgT1Knk2KrrqCDL8WCKM7IMr/UR89wnWQF8slA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=mIMaSn75o885/+TsPULMGzC3DIKcRA0zyGh4pqBa+yVVsQfCftdl5Pu0nkUoT0jmR 3oDODNELKyibhfFs0JlJFqLJx9bUIUSPZHkQFK/7gJl5CPBBnCjONso1IKjFejDdaT ye9qblH7e5t1hANZpJ1hhymjCUiFDh0y31x8EeEHCcn6sw9pFCaVJGiP73/ZZcZ5Yr IdGVgFxXjxreHiF/rmQEAAJHjlgmwPehy3ef4IKePQ9ZfXY8NpBSvNPs9Qa6pjlanL 7sKUUwXdA5qqkUyeTlP6+w0rPzI1T1yTTT8McwZBcuRP4JRIQN4JIB07AXcOsbsE41 e+7q1TKZT39VA== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Eric Dumazet , syzbot+6a1423ff3f97159aae64@syzkaller.appspotmail.com, Jiri Pirko , "David S . Miller" , Sasha Levin Subject: [PATCH 5.10 11/73] geneve: make sure to pull inner header in geneve_rx() Date: Wed, 13 Mar 2024 12:45:38 -0400 Message-ID: <20240313164640.616049-12-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Eric Dumazet [ Upstream commit 1ca1ba465e55b9460e4e75dec9fff31e708fec74 ] syzbot triggered a bug in geneve_rx() [1] Issue is similar to the one I fixed in commit 8d975c15c0cd ("ip6_tunnel: make sure to pull inner header in __ip6_tnl_rcv()") We have to save skb->network_header in a temporary variable in order to be able to recompute the network_header pointer after a pskb_inet_may_pull() call. pskb_inet_may_pull() makes sure the needed headers are in skb->head. [1] BUG: KMSAN: uninit-value in IP_ECN_decapsulate include/net/inet_ecn.h:302 [= inline] BUG: KMSAN: uninit-value in geneve_rx drivers/net/geneve.c:279 [inline] BUG: KMSAN: uninit-value in geneve_udp_encap_recv+0x36f9/0x3c10 drivers/ne= t/geneve.c:391 IP_ECN_decapsulate include/net/inet_ecn.h:302 [inline] geneve_rx drivers/net/geneve.c:279 [inline] geneve_udp_encap_recv+0x36f9/0x3c10 drivers/net/geneve.c:391 udp_queue_rcv_one_skb+0x1d39/0x1f20 net/ipv4/udp.c:2108 udp_queue_rcv_skb+0x6ae/0x6e0 net/ipv4/udp.c:2186 udp_unicast_rcv_skb+0x184/0x4b0 net/ipv4/udp.c:2346 __udp4_lib_rcv+0x1c6b/0x3010 net/ipv4/udp.c:2422 udp_rcv+0x7d/0xa0 net/ipv4/udp.c:2604 ip_protocol_deliver_rcu+0x264/0x1300 net/ipv4/ip_input.c:205 ip_local_deliver_finish+0x2b8/0x440 net/ipv4/ip_input.c:233 NF_HOOK include/linux/netfilter.h:314 [inline] ip_local_deliver+0x21f/0x490 net/ipv4/ip_input.c:254 dst_input include/net/dst.h:461 [inline] ip_rcv_finish net/ipv4/ip_input.c:449 [inline] NF_HOOK include/linux/netfilter.h:314 [inline] ip_rcv+0x46f/0x760 net/ipv4/ip_input.c:569 __netif_receive_skb_one_core net/core/dev.c:5534 [inline] __netif_receive_skb+0x1a6/0x5a0 net/core/dev.c:5648 process_backlog+0x480/0x8b0 net/core/dev.c:5976 __napi_poll+0xe3/0x980 net/core/dev.c:6576 napi_poll net/core/dev.c:6645 [inline] net_rx_action+0x8b8/0x1870 net/core/dev.c:6778 __do_softirq+0x1b7/0x7c5 kernel/softirq.c:553 do_softirq+0x9a/0xf0 kernel/softirq.c:454 __local_bh_enable_ip+0x9b/0xa0 kernel/softirq.c:381 local_bh_enable include/linux/bottom_half.h:33 [inline] rcu_read_unlock_bh include/linux/rcupdate.h:820 [inline] __dev_queue_xmit+0x2768/0x51c0 net/core/dev.c:4378 dev_queue_xmit include/linux/netdevice.h:3171 [inline] packet_xmit+0x9c/0x6b0 net/packet/af_packet.c:276 packet_snd net/packet/af_packet.c:3081 [inline] packet_sendmsg+0x8aef/0x9f10 net/packet/af_packet.c:3113 sock_sendmsg_nosec net/socket.c:730 [inline] __sock_sendmsg net/socket.c:745 [inline] __sys_sendto+0x735/0xa10 net/socket.c:2191 __do_sys_sendto net/socket.c:2203 [inline] __se_sys_sendto net/socket.c:2199 [inline] __x64_sys_sendto+0x125/0x1c0 net/socket.c:2199 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xcf/0x1e0 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x63/0x6b Uninit was created at: slab_post_alloc_hook mm/slub.c:3819 [inline] slab_alloc_node mm/slub.c:3860 [inline] kmem_cache_alloc_node+0x5cb/0xbc0 mm/slub.c:3903 kmalloc_reserve+0x13d/0x4a0 net/core/skbuff.c:560 __alloc_skb+0x352/0x790 net/core/skbuff.c:651 alloc_skb include/linux/skbuff.h:1296 [inline] alloc_skb_with_frags+0xc8/0xbd0 net/core/skbuff.c:6394 sock_alloc_send_pskb+0xa80/0xbf0 net/core/sock.c:2783 packet_alloc_skb net/packet/af_packet.c:2930 [inline] packet_snd net/packet/af_packet.c:3024 [inline] packet_sendmsg+0x70c2/0x9f10 net/packet/af_packet.c:3113 sock_sendmsg_nosec net/socket.c:730 [inline] __sock_sendmsg net/socket.c:745 [inline] __sys_sendto+0x735/0xa10 net/socket.c:2191 __do_sys_sendto net/socket.c:2203 [inline] __se_sys_sendto net/socket.c:2199 [inline] __x64_sys_sendto+0x125/0x1c0 net/socket.c:2199 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xcf/0x1e0 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x63/0x6b Fixes: 2d07dc79fe04 ("geneve: add initial netdev driver for GENEVE tunnels") Reported-and-tested-by: syzbot+6a1423ff3f97159aae64@syzkaller.appspotmail.c= om Signed-off-by: Eric Dumazet Reviewed-by: Jiri Pirko Signed-off-by: David S. Miller Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- drivers/net/geneve.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c index 081939cb420b0..2bb9820c66641 100644 --- a/drivers/net/geneve.c +++ b/drivers/net/geneve.c @@ -218,7 +218,7 @@ static void geneve_rx(struct geneve_dev *geneve, struct= geneve_sock *gs, struct genevehdr *gnvh =3D geneve_hdr(skb); struct metadata_dst *tun_dst =3D NULL; unsigned int len; - int err =3D 0; + int nh, err =3D 0; void *oiph; =20 if (ip_tunnel_collect_metadata() || gs->collect_md) { @@ -262,9 +262,23 @@ static void geneve_rx(struct geneve_dev *geneve, struc= t geneve_sock *gs, goto drop; } =20 - oiph =3D skb_network_header(skb); + /* Save offset of outer header relative to skb->head, + * because we are going to reset the network header to the inner header + * and might change skb->head. + */ + nh =3D skb_network_header(skb) - skb->head; + skb_reset_network_header(skb); =20 + if (!pskb_inet_may_pull(skb)) { + DEV_STATS_INC(geneve->dev, rx_length_errors); + DEV_STATS_INC(geneve->dev, rx_errors); + goto drop; + } + + /* Get the outer header. */ + oiph =3D skb->head + nh; + if (geneve_get_sk_family(gs) =3D=3D AF_INET) err =3D IP_ECN_decapsulate(oiph, skb); #if IS_ENABLED(CONFIG_IPV6) --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B29A21509BC; Wed, 13 Mar 2024 16:46:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348416; cv=none; b=Kty7SsTPFuT/Xz4AfTJYbVXX0QXnVkpfSTYEEsjF85YSiblc9+cpRHB2rcQNNKcqH6HQ6mm3s5nJocoIcwJfwY3o39x3F6X7A2oAiLpQz/vXf44uoFtOpg5vY4s5HiEqge8Ga4JMTTrDqk+80bw51yaBo4cDX5GAZhmrpu1e+to= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348416; c=relaxed/simple; bh=6sZaOpEhDxBzFfUd2Ul0Ib1mehc6KTxJzYSZUj8BI3w=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=A3m4VEjTKWzTTZmNTjkzwoSHg04lWXH2DLKrCoHQywaskrnW9Y3aqMLxGaYwe6Z57/JGZDlWUn/8rn/SQwA109r2HzYxoohL7Ukt7cAaRcr7//EoTvAynqL//bVo4b8utqsnubqmAlXzAIFpC87V21m/tjd4ETZH2815BHvExfQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Yv6dvlTI; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Yv6dvlTI" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C54B1C43399; Wed, 13 Mar 2024 16:46:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348416; bh=6sZaOpEhDxBzFfUd2Ul0Ib1mehc6KTxJzYSZUj8BI3w=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Yv6dvlTIroQLPCICfz6s8KE0veEWIqZH6jiXVWk16y3Mwn+T4HpDdiouWl9RKXfUF FLZq/yCl3apsYsLN9PjJLqEP/yL9QAYf+G7JdgQQp66Oy9y+jxO+mrPVTQpeKvd6OK OBBb68j2j24XZ7kYvYEg2c4B8TO4pi8BvfbkudzZ2DinLk9JVGrm89XjfUr+ssa5fF rN0cByhf27uMqCZvrHZBLhk6BovG4ViEfny9zJ4est1f0g0qT28GTQp0HGdSXoYDpL wdVM68bkL5ryUeyEhU6GkqE5H7RN2jWdTlR6d1xwL24VeswkHl5TdaQisyKFp9/RJ4 D4ElN9ovpqMPQ== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Rand Deeb , Simon Horman , Tony Nguyen , Sasha Levin Subject: [PATCH 5.10 12/73] net: ice: Fix potential NULL pointer dereference in ice_bridge_setlink() Date: Wed, 13 Mar 2024 12:45:39 -0400 Message-ID: <20240313164640.616049-13-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Rand Deeb [ Upstream commit 06e456a05d669ca30b224b8ed962421770c1496c ] The function ice_bridge_setlink() may encounter a NULL pointer dereference if nlmsg_find_attr() returns NULL and br_spec is dereferenced subsequently in nla_for_each_nested(). To address this issue, add a check to ensure that br_spec is not NULL before proceeding with the nested attribute iteration. Fixes: b1edc14a3fbf ("ice: Implement ice_bridge_getlink and ice_bridge_setl= ink") Signed-off-by: Rand Deeb Reviewed-by: Simon Horman Signed-off-by: Tony Nguyen Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- drivers/net/ethernet/intel/ice/ice_main.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethern= et/intel/ice/ice_main.c index 02f72fbec1042..035bc90c81246 100644 --- a/drivers/net/ethernet/intel/ice/ice_main.c +++ b/drivers/net/ethernet/intel/ice/ice_main.c @@ -6546,6 +6546,8 @@ ice_bridge_setlink(struct net_device *dev, struct nlm= sghdr *nlh, pf_sw =3D pf->first_sw; /* find the attribute in the netlink message */ br_spec =3D nlmsg_find_attr(nlh, sizeof(struct ifinfomsg), IFLA_AF_SPEC); + if (!br_spec) + return -EINVAL; =20 nla_for_each_nested(attr, br_spec, rem) { __u16 mode; --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E24E8151760; Wed, 13 Mar 2024 16:46:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348418; cv=none; b=rov53lmRTAODTMW0mREfob9nOi3kc3JRj5SlIyBXfXBMOEd5I3LeJwuH/iHXKwbjxK0dgDTkO1GE7gNp/i9LZRVfzbDK6BLDOnDAbO11twVfFvX1OvEEkQRUFmr1UBlEpavQZVDkV5aw1saopXwbOimU4PCIHhFgR2iL6iHRVrs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348418; c=relaxed/simple; bh=1G+qThIogWoUVcthyjJ7yt9nlLfvMdyUo+woxVVgbYk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=scQWyUd8k8AynVxdKA/0T9HORWb1np1g09clBogTDWpSGTvlrnRYNhsUQqTZgrsqjs7uLG2tP4YhrTBZOUc96DpFaWT3D19EmMSjAFc0dmzBVODks9/cIV3QczcvSHM9XLp89O7JdcQpiLpJ90ge60srEvEQZBBepzSArwuG+zc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=MgQA1rhU; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="MgQA1rhU" Received: by smtp.kernel.org (Postfix) with ESMTPSA id DE8D7C433C7; Wed, 13 Mar 2024 16:46:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348417; bh=1G+qThIogWoUVcthyjJ7yt9nlLfvMdyUo+woxVVgbYk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=MgQA1rhUcUHhhdQDKHxPWEMo3b8i+2w8w9xmxQ2HjQH2VP1IIK9I3iE9hgQKawPHj GNs8d4dtkRdVcgn1ttjIuI+w7kotcvRtpucf+bb9kzImQvhixt3SBUmSs9sUJpvulv fICRaDq8YvbjxIIsuIQhI3IIvVr7UGmmTKovUwBdMzraZTlWIgtno5hqn7SPMTV2l+ oIlsyRyoB8O8fZe6QlrP3wW2eMzX1SXIE00tqXB0BEi6RQPoYD6fGEg6Ed5daXuNM9 G595oRNkjTXcKKDF9Ts6SoabGNb6kSK5xTdLAf0GyhvkSmXkTd7ilLY5fFhnFUPKVc vwb0rWUr6KBMw== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Eric Dumazet , syzbot , David Ahern , Jakub Kicinski , Sasha Levin Subject: [PATCH 5.10 13/73] net/ipv6: avoid possible UAF in ip6_route_mpath_notify() Date: Wed, 13 Mar 2024 12:45:40 -0400 Message-ID: <20240313164640.616049-14-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Eric Dumazet [ Upstream commit 685f7d531264599b3f167f1e94bbd22f120e5fab ] syzbot found another use-after-free in ip6_route_mpath_notify() [1] Commit f7225172f25a ("net/ipv6: prevent use after free in ip6_route_mpath_notify") was not able to fix the root cause. We need to defer the fib6_info_release() calls after ip6_route_mpath_notify(), in the cleanup phase. [1] BUG: KASAN: slab-use-after-free in rt6_fill_node+0x1460/0x1ac0 Read of size 4 at addr ffff88809a07fc64 by task syz-executor.2/23037 CPU: 0 PID: 23037 Comm: syz-executor.2 Not tainted 6.8.0-rc4-syzkaller-0103= 5-gea7f3cfaa588 #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Goo= gle 01/25/2024 Call Trace: __dump_stack lib/dump_stack.c:88 [inline] dump_stack_lvl+0x1e7/0x2e0 lib/dump_stack.c:106 print_address_description mm/kasan/report.c:377 [inline] print_report+0x167/0x540 mm/kasan/report.c:488 kasan_report+0x142/0x180 mm/kasan/report.c:601 rt6_fill_node+0x1460/0x1ac0 inet6_rt_notify+0x13b/0x290 net/ipv6/route.c:6184 ip6_route_mpath_notify net/ipv6/route.c:5198 [inline] ip6_route_multipath_add net/ipv6/route.c:5404 [inline] inet6_rtm_newroute+0x1d0f/0x2300 net/ipv6/route.c:5517 rtnetlink_rcv_msg+0x885/0x1040 net/core/rtnetlink.c:6597 netlink_rcv_skb+0x1e3/0x430 net/netlink/af_netlink.c:2543 netlink_unicast_kernel net/netlink/af_netlink.c:1341 [inline] netlink_unicast+0x7ea/0x980 net/netlink/af_netlink.c:1367 netlink_sendmsg+0xa3b/0xd70 net/netlink/af_netlink.c:1908 sock_sendmsg_nosec net/socket.c:730 [inline] __sock_sendmsg+0x221/0x270 net/socket.c:745 ____sys_sendmsg+0x525/0x7d0 net/socket.c:2584 ___sys_sendmsg net/socket.c:2638 [inline] __sys_sendmsg+0x2b0/0x3a0 net/socket.c:2667 do_syscall_64+0xf9/0x240 entry_SYSCALL_64_after_hwframe+0x6f/0x77 RIP: 0033:0x7f73dd87dda9 Code: 28 00 00 00 75 05 48 83 c4 28 c3 e8 e1 20 00 00 90 48 89 f8 48 89 f7 = 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff f= f 73 01 c3 48 c7 c1 b0 ff ff ff f7 d8 64 89 01 48 RSP: 002b:00007f73de6550c8 EFLAGS: 00000246 ORIG_RAX: 000000000000002e RAX: ffffffffffffffda RBX: 00007f73dd9ac050 RCX: 00007f73dd87dda9 RDX: 0000000000000000 RSI: 0000000020000140 RDI: 0000000000000005 RBP: 00007f73dd8ca47a R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000 R13: 000000000000006e R14: 00007f73dd9ac050 R15: 00007ffdbdeb7858 Allocated by task 23037: kasan_save_stack mm/kasan/common.c:47 [inline] kasan_save_track+0x3f/0x80 mm/kasan/common.c:68 poison_kmalloc_redzone mm/kasan/common.c:372 [inline] __kasan_kmalloc+0x98/0xb0 mm/kasan/common.c:389 kasan_kmalloc include/linux/kasan.h:211 [inline] __do_kmalloc_node mm/slub.c:3981 [inline] __kmalloc+0x22e/0x490 mm/slub.c:3994 kmalloc include/linux/slab.h:594 [inline] kzalloc include/linux/slab.h:711 [inline] fib6_info_alloc+0x2e/0xf0 net/ipv6/ip6_fib.c:155 ip6_route_info_create+0x445/0x12b0 net/ipv6/route.c:3758 ip6_route_multipath_add net/ipv6/route.c:5298 [inline] inet6_rtm_newroute+0x744/0x2300 net/ipv6/route.c:5517 rtnetlink_rcv_msg+0x885/0x1040 net/core/rtnetlink.c:6597 netlink_rcv_skb+0x1e3/0x430 net/netlink/af_netlink.c:2543 netlink_unicast_kernel net/netlink/af_netlink.c:1341 [inline] netlink_unicast+0x7ea/0x980 net/netlink/af_netlink.c:1367 netlink_sendmsg+0xa3b/0xd70 net/netlink/af_netlink.c:1908 sock_sendmsg_nosec net/socket.c:730 [inline] __sock_sendmsg+0x221/0x270 net/socket.c:745 ____sys_sendmsg+0x525/0x7d0 net/socket.c:2584 ___sys_sendmsg net/socket.c:2638 [inline] __sys_sendmsg+0x2b0/0x3a0 net/socket.c:2667 do_syscall_64+0xf9/0x240 entry_SYSCALL_64_after_hwframe+0x6f/0x77 Freed by task 16: kasan_save_stack mm/kasan/common.c:47 [inline] kasan_save_track+0x3f/0x80 mm/kasan/common.c:68 kasan_save_free_info+0x4e/0x60 mm/kasan/generic.c:640 poison_slab_object+0xa6/0xe0 mm/kasan/common.c:241 __kasan_slab_free+0x34/0x70 mm/kasan/common.c:257 kasan_slab_free include/linux/kasan.h:184 [inline] slab_free_hook mm/slub.c:2121 [inline] slab_free mm/slub.c:4299 [inline] kfree+0x14a/0x380 mm/slub.c:4409 rcu_do_batch kernel/rcu/tree.c:2190 [inline] rcu_core+0xd76/0x1810 kernel/rcu/tree.c:2465 __do_softirq+0x2bb/0x942 kernel/softirq.c:553 Last potentially related work creation: kasan_save_stack+0x3f/0x60 mm/kasan/common.c:47 __kasan_record_aux_stack+0xae/0x100 mm/kasan/generic.c:586 __call_rcu_common kernel/rcu/tree.c:2715 [inline] call_rcu+0x167/0xa80 kernel/rcu/tree.c:2829 fib6_info_release include/net/ip6_fib.h:341 [inline] ip6_route_multipath_add net/ipv6/route.c:5344 [inline] inet6_rtm_newroute+0x114d/0x2300 net/ipv6/route.c:5517 rtnetlink_rcv_msg+0x885/0x1040 net/core/rtnetlink.c:6597 netlink_rcv_skb+0x1e3/0x430 net/netlink/af_netlink.c:2543 netlink_unicast_kernel net/netlink/af_netlink.c:1341 [inline] netlink_unicast+0x7ea/0x980 net/netlink/af_netlink.c:1367 netlink_sendmsg+0xa3b/0xd70 net/netlink/af_netlink.c:1908 sock_sendmsg_nosec net/socket.c:730 [inline] __sock_sendmsg+0x221/0x270 net/socket.c:745 ____sys_sendmsg+0x525/0x7d0 net/socket.c:2584 ___sys_sendmsg net/socket.c:2638 [inline] __sys_sendmsg+0x2b0/0x3a0 net/socket.c:2667 do_syscall_64+0xf9/0x240 entry_SYSCALL_64_after_hwframe+0x6f/0x77 The buggy address belongs to the object at ffff88809a07fc00 which belongs to the cache kmalloc-512 of size 512 The buggy address is located 100 bytes inside of freed 512-byte region [ffff88809a07fc00, ffff88809a07fe00) The buggy address belongs to the physical page: page:ffffea0002681f00 refcount:1 mapcount:0 mapping:0000000000000000 index:= 0x0 pfn:0x9a07c head:ffffea0002681f00 order:2 entire_mapcount:0 nr_pages_mapped:0 pincount:0 flags: 0xfff00000000840(slab|head|node=3D0|zone=3D1|lastcpupid=3D0x7ff) page_type: 0xffffffff() raw: 00fff00000000840 ffff888014c41c80 dead000000000122 0000000000000000 raw: 0000000000000000 0000000080100010 00000001ffffffff 0000000000000000 page dumped because: kasan: bad access detected page_owner tracks the page as allocated page last allocated via order 2, migratetype Unmovable, gfp_mask 0x1d20c0(_= _GFP_IO|__GFP_FS|__GFP_NOWARN|__GFP_NORETRY|__GFP_COMP|__GFP_NOMEMALLOC|__G= FP_HARDWALL), pid 23028, tgid 23027 (syz-executor.4), ts 2340253595219, fre= e_ts 2339107097036 set_page_owner include/linux/page_owner.h:31 [inline] post_alloc_hook+0x1ea/0x210 mm/page_alloc.c:1533 prep_new_page mm/page_alloc.c:1540 [inline] get_page_from_freelist+0x33ea/0x3580 mm/page_alloc.c:3311 __alloc_pages+0x255/0x680 mm/page_alloc.c:4567 __alloc_pages_node include/linux/gfp.h:238 [inline] alloc_pages_node include/linux/gfp.h:261 [inline] alloc_slab_page+0x5f/0x160 mm/slub.c:2190 allocate_slab mm/slub.c:2354 [inline] new_slab+0x84/0x2f0 mm/slub.c:2407 ___slab_alloc+0xd17/0x13e0 mm/slub.c:3540 __slab_alloc mm/slub.c:3625 [inline] __slab_alloc_node mm/slub.c:3678 [inline] slab_alloc_node mm/slub.c:3850 [inline] __do_kmalloc_node mm/slub.c:3980 [inline] __kmalloc+0x2e0/0x490 mm/slub.c:3994 kmalloc include/linux/slab.h:594 [inline] kzalloc include/linux/slab.h:711 [inline] new_dir fs/proc/proc_sysctl.c:956 [inline] get_subdir fs/proc/proc_sysctl.c:1000 [inline] sysctl_mkdir_p fs/proc/proc_sysctl.c:1295 [inline] __register_sysctl_table+0xb30/0x1440 fs/proc/proc_sysctl.c:1376 neigh_sysctl_register+0x416/0x500 net/core/neighbour.c:3859 devinet_sysctl_register+0xaf/0x1f0 net/ipv4/devinet.c:2644 inetdev_init+0x296/0x4d0 net/ipv4/devinet.c:286 inetdev_event+0x338/0x15c0 net/ipv4/devinet.c:1555 notifier_call_chain+0x18f/0x3b0 kernel/notifier.c:93 call_netdevice_notifiers_extack net/core/dev.c:1987 [inline] call_netdevice_notifiers net/core/dev.c:2001 [inline] register_netdevice+0x15b2/0x1a20 net/core/dev.c:10340 br_dev_newlink+0x27/0x100 net/bridge/br_netlink.c:1563 rtnl_newlink_create net/core/rtnetlink.c:3497 [inline] __rtnl_newlink net/core/rtnetlink.c:3717 [inline] rtnl_newlink+0x158f/0x20a0 net/core/rtnetlink.c:3730 page last free pid 11583 tgid 11583 stack trace: reset_page_owner include/linux/page_owner.h:24 [inline] free_pages_prepare mm/page_alloc.c:1140 [inline] free_unref_page_prepare+0x968/0xa90 mm/page_alloc.c:2346 free_unref_page+0x37/0x3f0 mm/page_alloc.c:2486 kasan_depopulate_vmalloc_pte+0x74/0x90 mm/kasan/shadow.c:415 apply_to_pte_range mm/memory.c:2619 [inline] apply_to_pmd_range mm/memory.c:2663 [inline] apply_to_pud_range mm/memory.c:2699 [inline] apply_to_p4d_range mm/memory.c:2735 [inline] __apply_to_page_range+0x8ec/0xe40 mm/memory.c:2769 kasan_release_vmalloc+0x9a/0xb0 mm/kasan/shadow.c:532 __purge_vmap_area_lazy+0x163f/0x1a10 mm/vmalloc.c:1770 drain_vmap_area_work+0x40/0xd0 mm/vmalloc.c:1804 process_one_work kernel/workqueue.c:2633 [inline] process_scheduled_works+0x913/0x1420 kernel/workqueue.c:2706 worker_thread+0xa5f/0x1000 kernel/workqueue.c:2787 kthread+0x2ef/0x390 kernel/kthread.c:388 ret_from_fork+0x4b/0x80 arch/x86/kernel/process.c:147 ret_from_fork_asm+0x1b/0x30 arch/x86/entry/entry_64.S:242 Memory state around the buggy address: ffff88809a07fb00: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc ffff88809a07fb80: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc >ffff88809a07fc00: fa fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb ^ ffff88809a07fc80: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb ffff88809a07fd00: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb Fixes: 3b1137fe7482 ("net: ipv6: Change notifications for multipath add to = RTA_MULTIPATH") Reported-by: syzbot Signed-off-by: Eric Dumazet Reviewed-by: David Ahern Link: https://lore.kernel.org/r/20240303144801.702646-1-edumazet@google.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- net/ipv6/route.c | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/net/ipv6/route.c b/net/ipv6/route.c index b23e42efb3dff..2d53c362f309e 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c @@ -5235,19 +5235,7 @@ static int ip6_route_multipath_add(struct fib6_confi= g *cfg, err_nh =3D NULL; list_for_each_entry(nh, &rt6_nh_list, next) { err =3D __ip6_ins_rt(nh->fib6_info, info, extack); - fib6_info_release(nh->fib6_info); - - if (!err) { - /* save reference to last route successfully inserted */ - rt_last =3D nh->fib6_info; - - /* save reference to first route for notification */ - if (!rt_notif) - rt_notif =3D nh->fib6_info; - } =20 - /* nh->fib6_info is used or freed at this point, reset to NULL*/ - nh->fib6_info =3D NULL; if (err) { if (replace && nhn) NL_SET_ERR_MSG_MOD(extack, @@ -5255,6 +5243,12 @@ static int ip6_route_multipath_add(struct fib6_confi= g *cfg, err_nh =3D nh; goto add_errout; } + /* save reference to last route successfully inserted */ + rt_last =3D nh->fib6_info; + + /* save reference to first route for notification */ + if (!rt_notif) + rt_notif =3D nh->fib6_info; =20 /* Because each route is added like a single route we remove * these flags after the first nexthop: if there is a collision, @@ -5315,8 +5309,7 @@ static int ip6_route_multipath_add(struct fib6_config= *cfg, =20 cleanup: list_for_each_entry_safe(nh, nh_safe, &rt6_nh_list, next) { - if (nh->fib6_info) - fib6_info_release(nh->fib6_info); + fib6_info_release(nh->fib6_info); list_del(&nh->next); kfree(nh); } --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0BEAA151779; Wed, 13 Mar 2024 16:46:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348419; cv=none; b=ZMOUVUrkz2A7U5RRJ/xP/RHiAN93JoxSmAcxZm5diwQPtRB/kByVyrluEA7EcFg8emm0KXyFlypHxlXmzKtw8aeOj/zqZ9C1bkhwMr6dn+bk/zkdb62KYmAWjkRJCrKeEaYqbwZvMS+7xZYyVWO0Dt0SJGWM4epQwbM+veE/S1Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348419; c=relaxed/simple; bh=zlG8DVa0z/JC9OL++FL1QnHN99NG2yDrykYETr5qrCs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=QISXZb1GDSrj4i3e5mEQO43nn+Bh6kCJ4LLwqdxKSELkGjxz91Fwx/4+UPqB4yCgaBhYZQobWJUfMhQ6QOUC0LsHQlNTmjVKEYRQabY1bifqfV9YIQ7uMmkMUdgDUS9okGAhHz4cPXlKB1CBjK142VpfJmIgUAgUWtIzq/AoEQs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=C9HaoHOs; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="C9HaoHOs" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 17595C433A6; Wed, 13 Mar 2024 16:46:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348418; bh=zlG8DVa0z/JC9OL++FL1QnHN99NG2yDrykYETr5qrCs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=C9HaoHOs8WDHW/WklbsLptRQToHCVxXhc3VE/bIfVrLlvORzeMpS591Y0Z5hZlQRy 9k2G8SMo/vk1sP2wUNs9QcFNRy+6qNW8huB/+CLxNrCXvRBXUSppn+bTUp8rsjVDht OsUXT758P1ANRpTf2oL9a1gKlFZmIVg5GFh8eBJHuS0WHs7+ddxMmgXJaa0gTnREak 57Bnfh+QZuGObwXfN2l25A0Ds6W3jyZy8af9pIN1R9vReF7MLfAkk+CdsJcbcF8Z78 s/5HOOpQg+FWYaxI8/rBb6TFYDlOK2iFTP3ALVqOOqoFX35AVjFVgyDdR+GSnUysFB VzkhoOzlbNq3g== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: =?UTF-8?q?Toke=20H=C3=B8iland-J=C3=B8rgensen?= , =?UTF-8?q?Tobias=20B=C3=B6hm?= , Martin KaFai Lau , Sasha Levin Subject: [PATCH 5.10 14/73] cpumap: Zero-initialise xdp_rxq_info struct before running XDP program Date: Wed, 13 Mar 2024 12:45:41 -0400 Message-ID: <20240313164640.616049-15-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable From: Toke H=C3=B8iland-J=C3=B8rgensen [ Upstream commit 2487007aa3b9fafbd2cb14068f49791ce1d7ede5 ] When running an XDP program that is attached to a cpumap entry, we don't initialise the xdp_rxq_info data structure being used in the xdp_buff that backs the XDP program invocation. Tobias noticed that this leads to random values being returned as the xdp_md->rx_queue_index value for XDP programs running in a cpumap. This means we're basically returning the contents of the uninitialised memory, which is bad. Fix this by zero-initialising the rxq data structure before running the XDP program. Fixes: 9216477449f3 ("bpf: cpumap: Add the possibility to attach an eBPF pr= ogram to cpumap") Reported-by: Tobias B=C3=B6hm Signed-off-by: Toke H=C3=B8iland-J=C3=B8rgensen Link: https://lore.kernel.org/r/20240305213132.11955-1-toke@redhat.com Signed-off-by: Martin KaFai Lau Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- kernel/bpf/cpumap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/bpf/cpumap.c b/kernel/bpf/cpumap.c index c61a23b564aa5..2dcc04b2f330e 100644 --- a/kernel/bpf/cpumap.c +++ b/kernel/bpf/cpumap.c @@ -229,7 +229,7 @@ static int cpu_map_bpf_prog_run_xdp(struct bpf_cpu_map_= entry *rcpu, void **frames, int n, struct xdp_cpumap_stats *stats) { - struct xdp_rxq_info rxq; + struct xdp_rxq_info rxq =3D {}; struct xdp_buff xdp; int i, nframes =3D 0; =20 --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2178D151CD4; Wed, 13 Mar 2024 16:47:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348420; cv=none; b=iYiuJMLH2mpyovqxJnLZ2ttKozrBgokWY8CM1/DmsFndmyK6QWRkgnu5S/jtiXAcLWE/hVCkSHsM2qMGHnim36MLJqtYgw9aTpDMlllGL2oRxNRTfo4iL/67QX8AS/dhllOF+Qu7THDFvaLEvS9mP9+WOT0tB2tB2u333yg80X4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348420; c=relaxed/simple; bh=2X0S2vvszqlOoS3sCZkbGf3s1JKi2aR5XwTcWPgOZXw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=e1+9W3AOp1jXKJg3PwOnTR4ySDWmYRwcRAcDS6kszh3jcvrl6cv/AOAhy2Py/USHZ1vtrHVSNF0kKyiPesB0aZ/n/Kh94xVl1jQO2otgNIyEVRubal2z5dFIILz2ib6rTF+9nWEqWFv0rUryq2U0cawen7k7Q4ZTTBonkXmLL6I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=bhEc8GQ3; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="bhEc8GQ3" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 32484C433C7; Wed, 13 Mar 2024 16:46:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348420; bh=2X0S2vvszqlOoS3sCZkbGf3s1JKi2aR5XwTcWPgOZXw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=bhEc8GQ3ehymbiNKNKPz1bUPkN0NpghO66y8FF6ewfEXv8DHNqfprA4U8RR90v33B /o9+VufgkYUXxjpjgax/eWdKgdNkqux/qiwLYC3R0c5ugk8Q5sdES9ABpH/63DdNzw dVcA7Vh5wZi2otB5VNz/FGF4CejRv+QvB5CvV8n6oDsdZPFH3fTL9L4uBr9Od0xW4O wHpi9CojA8OeW5PzFTpvtAFY2lpSbRnz4sRQXRYOOC2IJNPjFZfi0BIfFc9kfB2GdT X8+klLq09iGYAUnPWLLtcBTxK72qQlkDmKxn1IicLzS7XuIEZSBj0LnJGCJVlZ9471 idu96C2TUfL3w== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Edward Adam Davis , syzbot+d4faee732755bba9838e@syzkaller.appspotmail.com, "David S . Miller" , Sasha Levin Subject: [PATCH 5.10 15/73] net/rds: fix WARNING in rds_conn_connect_if_down Date: Wed, 13 Mar 2024 12:45:42 -0400 Message-ID: <20240313164640.616049-16-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Edward Adam Davis [ Upstream commit c055fc00c07be1f0df7375ab0036cebd1106ed38 ] If connection isn't established yet, get_mr() will fail, trigger connection= after get_mr(). Fixes: 584a8279a44a ("RDS: RDMA: return appropriate error on rdma map failu= res") Reported-and-tested-by: syzbot+d4faee732755bba9838e@syzkaller.appspotmail.c= om Signed-off-by: Edward Adam Davis Signed-off-by: David S. Miller Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- net/rds/rdma.c | 3 +++ net/rds/send.c | 6 +----- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/net/rds/rdma.c b/net/rds/rdma.c index 6f1a50d50d06d..c29c7a59f2053 100644 --- a/net/rds/rdma.c +++ b/net/rds/rdma.c @@ -301,6 +301,9 @@ static int __rds_rdma_map(struct rds_sock *rs, struct r= ds_get_mr_args *args, kfree(sg); } ret =3D PTR_ERR(trans_private); + /* Trigger connection so that its ready for the next retry */ + if (ret =3D=3D -ENODEV) + rds_conn_connect_if_down(cp->cp_conn); goto out; } =20 diff --git a/net/rds/send.c b/net/rds/send.c index 985d0b7713acc..65eeb82cb5de5 100644 --- a/net/rds/send.c +++ b/net/rds/send.c @@ -1314,12 +1314,8 @@ int rds_sendmsg(struct socket *sock, struct msghdr *= msg, size_t payload_len) =20 /* Parse any control messages the user may have included. */ ret =3D rds_cmsg_send(rs, rm, msg, &allocated_mr, &vct); - if (ret) { - /* Trigger connection so that its ready for the next retry */ - if (ret =3D=3D -EAGAIN) - rds_conn_connect_if_down(conn); + if (ret) goto out; - } =20 if (rm->rdma.op_active && !conn->c_trans->xmit_rdma) { printk_ratelimited(KERN_NOTICE "rdma_op %p conn xmit_rdma %p\n", --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 78AD0151CFA; Wed, 13 Mar 2024 16:47:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348421; cv=none; b=b3cEZx+XYxLEQa521WD4ycozIBmuY1btS53RowVcvIXgwAJCBX6fgre02zNkTNX4zzKJdXAYSt6jWErgUAdnhtsynx5OCvOF+5vqT7RaiHowSZcnpSZe/Xt+YMNa8K6LVm3qsSEhGI1a2Kpdz/UBhAh48KeJQH18xSBPyB8ysq0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348421; c=relaxed/simple; bh=npH1Od2uig/VhFoSBdFcsIJP8od1q8NuIXYGucN3FSc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=c+XjGPiKHf9AN8E49m9oN2madIjbn3xV7ccbU+mm1rcWxj8I1S0TyW0/bkAvIV53Ylajm/hOKPoQx3o3VtNfc+uHkk63vdOLJR7aYJllJny5ZpOO/delDcXm2R/lKWzUxF71PjbwxkaMOEXOPieGCSeZ/zix6BaieUT4UMIolYs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=PLOi4ddw; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="PLOi4ddw" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4EAFEC433F1; Wed, 13 Mar 2024 16:47:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348421; bh=npH1Od2uig/VhFoSBdFcsIJP8od1q8NuIXYGucN3FSc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=PLOi4ddw1RlDx/8S38ZXWEhcuLwdiBB3SiBH7/TuDvK/AqQPX1QmC3TCNr57fD7c7 grkXSO86ojnj5co4YMZV1nhf1wPC5LG1qdUSiL7WWXDo5TUPY3zKzR6ZHg1lH/zlkv SygjCdDsrmukxSw7NQwLz7tjGv9VaS5EasiwvREmOyW+k9gqqOnkPkKU6X2xTDj/u0 8ThvqETkgx5OxblXTdbP5JsnREtcD109+0R3+zXjNpWmRX24yQ+xKyPY1khRv5bIXQ LLssd51XgeR4fGdhffp9wv1YfF9zDao90618ESOIlEO9V7wocA6Z99J6RGF1QJiQGs LNht6MIwqRCFA== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Florian Westphal , Pablo Neira Ayuso , Sasha Levin Subject: [PATCH 5.10 16/73] netfilter: nft_ct: fix l3num expectations with inet pseudo family Date: Wed, 13 Mar 2024 12:45:43 -0400 Message-ID: <20240313164640.616049-17-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Florian Westphal [ Upstream commit 99993789966a6eb4f1295193dc543686899892d3 ] Following is rejected but should be allowed: table inet t { ct expectation exp1 { [..] l3proto ip Valid combos are: table ip t, l3proto ip table ip6 t, l3proto ip6 table inet t, l3proto ip OR l3proto ip6 Disallow inet pseudeo family, the l3num must be a on-wire protocol known to conntrack. Retain NFPROTO_INET case to make it clear its rejected intentionally rather as oversight. Fixes: 8059918a1377 ("netfilter: nft_ct: sanitize layer 3 and 4 protocol nu= mber in custom expectations") Signed-off-by: Florian Westphal Signed-off-by: Pablo Neira Ayuso Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- net/netfilter/nft_ct.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/net/netfilter/nft_ct.c b/net/netfilter/nft_ct.c index 2b15dbbca98b3..2a8dfa68f6e20 100644 --- a/net/netfilter/nft_ct.c +++ b/net/netfilter/nft_ct.c @@ -1188,14 +1188,13 @@ static int nft_ct_expect_obj_init(const struct nft_= ctx *ctx, switch (priv->l3num) { case NFPROTO_IPV4: case NFPROTO_IPV6: - if (priv->l3num !=3D ctx->family) - return -EINVAL; + if (priv->l3num =3D=3D ctx->family || ctx->family =3D=3D NFPROTO_INET) + break; =20 - fallthrough; - case NFPROTO_INET: - break; + return -EINVAL; + case NFPROTO_INET: /* tuple.src.l3num supports NFPROTO_IPV4/6 only */ default: - return -EOPNOTSUPP; + return -EAFNOSUPPORT; } =20 priv->l4proto =3D nla_get_u8(tb[NFTA_CT_EXPECT_L4PROTO]); --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5E5E415279C; Wed, 13 Mar 2024 16:47:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348422; cv=none; b=ITX8odb/e8WeRihYdLRYTqhOEw0nEH6pXDy7dDngUiOuvUOkeYloZuM/R1GudI8+pi3EX0A04Tx3MlPWltOa7qVhD6HLLYzUz6P5GAiYImiZWhh3ELAeAWWgSrDhfBjky161uS7lDTZ+xTqRtAeE8kolpL6dnmvB7Sr7fsp0jkg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348422; c=relaxed/simple; bh=3UekCyyDHThKiG9v+4KxnUS74Ovcmcs7JvlE63gLlaQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=P2zlYwxuglnLjW0J0cv9i3f8KaPPG27l4zBhKRMf6N8OceShCAWSUel2HClynwZPgKIF325ZpFpOV6yHb6sgZgqHSBKV1x9y+hlaaP4iBcWV+J2+yZJLTd1UnbR1vvPAgAdoyBvJMkg1hUpbQ7NLfMzPdkdlhm9shat8SKc89xM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=U7ej2pp0; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="U7ej2pp0" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 50545C43390; Wed, 13 Mar 2024 16:47:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348422; bh=3UekCyyDHThKiG9v+4KxnUS74Ovcmcs7JvlE63gLlaQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=U7ej2pp0OkIdITGaPVh2NZszWso8WWKJsZi1wb2CRcxcXRPPzpQNOeY1OSyj7QJUP gYKPr6+0nMZUFxS54Ln/uYQYLilFEQSkoNo0X82VBDKOZ6ILGCNNrQckPOfId1i1uP KzC2kupYE0dUq+zQRKFJPiLPqkS7hVt+qy+gaw8zpUeZR1MMqy2Qn7i4LLqHWWif37 AVtJps+8HQbn6hLLarNa3s6010DgJ8o8OsnHRLPi+v/9FMyD3Ef5u7uUc7L6QhRp25 f2qnv8Y4tPaVJ0EVpUVvJ+ozFgE0LgvqCLjvxXpRPffJbL3YI+JdqEBnO921ko4B/Z 5ZVhSLqHvoV9g== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Lena Wang , Pablo Neira Ayuso , Sasha Levin Subject: [PATCH 5.10 17/73] netfilter: nf_conntrack_h323: Add protection for bmp length out of range Date: Wed, 13 Mar 2024 12:45:44 -0400 Message-ID: <20240313164640.616049-18-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Lena Wang [ Upstream commit 767146637efc528b5e3d31297df115e85a2fd362 ] UBSAN load reports an exception of BRK#5515 SHIFT_ISSUE:Bitwise shifts that are out of bounds for their data type. vmlinux get_bitmap(b=3D75) + 712 vmlinux decode_seq(bs=3D0xFFFFFFD008037000, f=3D0xFFFFFFD008037018, level= =3D134443100) + 1956 vmlinux decode_choice(base=3D0xFFFFFFD0080370F0, level=3D23843636) + 1216 vmlinux decode_seq(f=3D0xFFFFFFD0080371A8, level=3D134443500) + 812 vmlinux decode_choice(base=3D0xFFFFFFD008037280, level=3D0) + 1216 vmlinux DecodeRasMessage() + 304 vmlinux ras_help() + 684 vmlinux nf_confirm() + 188 Due to abnormal data in skb->data, the extension bitmap length exceeds 32 when decoding ras message then uses the length to make a shift operation. It will change into negative after several loop. UBSAN load could detect a negative shift as an undefined behaviour and reports exception. So we add the protection to avoid the length exceeding 32. Or else it will return out of range error and stop decoding. Fixes: 5e35941d9901 ("[NETFILTER]: Add H.323 conntrack/NAT helper") Signed-off-by: Lena Wang Signed-off-by: Pablo Neira Ayuso Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- net/netfilter/nf_conntrack_h323_asn1.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/net/netfilter/nf_conntrack_h323_asn1.c b/net/netfilter/nf_conn= track_h323_asn1.c index e697a824b0018..540d97715bd23 100644 --- a/net/netfilter/nf_conntrack_h323_asn1.c +++ b/net/netfilter/nf_conntrack_h323_asn1.c @@ -533,6 +533,8 @@ static int decode_seq(struct bitstr *bs, const struct f= ield_t *f, /* Get fields bitmap */ if (nf_h323_error_boundary(bs, 0, f->sz)) return H323_ERROR_BOUND; + if (f->sz > 32) + return H323_ERROR_RANGE; bmp =3D get_bitmap(bs, f->sz); if (base) *(unsigned int *)base =3D bmp; @@ -589,6 +591,8 @@ static int decode_seq(struct bitstr *bs, const struct f= ield_t *f, bmp2_len =3D get_bits(bs, 7) + 1; if (nf_h323_error_boundary(bs, 0, bmp2_len)) return H323_ERROR_BOUND; + if (bmp2_len > 32) + return H323_ERROR_RANGE; bmp2 =3D get_bitmap(bs, bmp2_len); bmp |=3D bmp2 >> f->sz; if (base) --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 30984152DE1; Wed, 13 Mar 2024 16:47:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348423; cv=none; b=oF6ACK14vYPdZUpAdjD7VS+luRywe3FCID1KBRB7su9WAVvwGjEdK22QagBdRO7c9OPF9rMIh6V6KywM0ac1QkwyadAY4q4fR/58MPS08npsLZyHmu87KB/C7o8rBhOSAKMmTwU1ssT1YCO+AOA4SyyExEBCBS/VgxfdXETfqTY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348423; c=relaxed/simple; bh=Ao3Ut6Zdwf0dKFuZsDdSVpBan8+koA7bL8+4BXg7rl8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Qb8F+Wok8rufBHVT5CQAZqErcqW1WHH4sq2dl/GuOhtX9TPVuilyIAUSDn5eZu5bAjPDUVFGZmA2V0nkXoaFlf/Hl2knCZtDp31Ic66fLxUwkGoY+Tfdo+F2b5jaxAWYc4SQqSc/vRJdZ0iD7Hfx2AQ0Psasr/zfOQLdaAHxBPU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=pJScZcd/; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="pJScZcd/" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 50333C43394; Wed, 13 Mar 2024 16:47:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348423; bh=Ao3Ut6Zdwf0dKFuZsDdSVpBan8+koA7bL8+4BXg7rl8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=pJScZcd/YNVN9W76kKW7vpa2ts4F9CiaUGa0u0fCLtq53LYxGo6iP5QUi4FKMI0il xc9kfPhrmmwFzNYOAs69paBWHJbiNoNyZ0wZ3vb7JEHqIe3EkC0gMzytQKz56Zx1kY V7xKJI/JITTNruka+Ad9CRq+4LpwVaNx3z5EDhvKQcDrDmdzv73aMi4yo+HvTc7J+A 2c2g5a5wgC6fX0Z3O5VoMPn7v3IoUXywN1uUoGsUNiu1PSTV2RupSN/lkho/pDed02 Ay87BbREv76+PYA6qalr9tx+WwS+nJkFxY3AfRTVc4VLfk39mdOS4/LG75R1zeTmcs fLvKZ4NiCSmMQ== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Jason Xing , Paolo Abeni , Sasha Levin Subject: [PATCH 5.10 18/73] netrom: Fix a data-race around sysctl_netrom_default_path_quality Date: Wed, 13 Mar 2024 12:45:45 -0400 Message-ID: <20240313164640.616049-19-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Jason Xing [ Upstream commit 958d6145a6d9ba9e075c921aead8753fb91c9101 ] We need to protect the reader reading sysctl_netrom_default_path_quality because the value can be changed concurrently. Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Signed-off-by: Jason Xing Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- net/netrom/nr_route.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/netrom/nr_route.c b/net/netrom/nr_route.c index 78da5eab252a0..94c4d4554b9c7 100644 --- a/net/netrom/nr_route.c +++ b/net/netrom/nr_route.c @@ -153,7 +153,7 @@ static int __must_check nr_add_node(ax25_address *nr, c= onst char *mnemonic, nr_neigh->digipeat =3D NULL; nr_neigh->ax25 =3D NULL; nr_neigh->dev =3D dev; - nr_neigh->quality =3D sysctl_netrom_default_path_quality; + nr_neigh->quality =3D READ_ONCE(sysctl_netrom_default_path_quality); nr_neigh->locked =3D 0; nr_neigh->count =3D 0; nr_neigh->number =3D nr_neigh_no++; --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6F4D3152E10; Wed, 13 Mar 2024 16:47:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348424; cv=none; b=qPA2G4ukEKsC1dV7T1OvtZ1gBGALI6QVAO+TRW+AiSArvH/3iXOZVPgfx+oildrahCsQtSZBvCqmhCzk5unP86lXcuEsmzOI5NJp5m0N9UYbZXlhgi+a2W4hnq3VneL3JE2UbNEfeZ03nN320CUmyFx82mn6NAjzVrnIDl4UvZk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348424; c=relaxed/simple; bh=TrmtEXDQsycLad657XlqLSOoc3BGOMFxOoA9VKBrig4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BK7Nn34k6vH3sM3aWaYGtVFswjPvTo3a84xW4d81vpqknQc56xfZf7Fuw8oqDxOdbkZ/dFVMm+uXD5mLspjBBO0IOkOU5MhHW4gx214b5r/ZIyyFNZAzwBYMpmduPEiEK96HHIVN+yEcLiTaULTZ2d8XSC1J/Qocz9VXM7iopvs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=dkUb2R7m; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="dkUb2R7m" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 53569C433F1; Wed, 13 Mar 2024 16:47:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348424; bh=TrmtEXDQsycLad657XlqLSOoc3BGOMFxOoA9VKBrig4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=dkUb2R7mjLyfQ4Bt0EvzyDujS8CFncZHssXdn9x1oGp2lxE5VEfsZ9yEjBCtA3lnB wT50r432VRq+5TWa8URqUO7BKCn8vtphrutoMYOLp0mXicc7rOhaCwPjY8NTZxxeKq 5QnkajgAFHDzcOaW9qPbP2BtUr910N1+3x6RFVNeJn8NeeOIip3RAsT7Tn0STJvhCS 3pTMGW6hov38y2GTRJQyN2yUWqpIaL3ymWGgMTo7TaAUYTVN/J4VuREpgMbgPEQgYr anFPRSr8+C9h3MHbdszSWjvnAnJflMaeqkHXyv8DliT7xOICKG8i493s2a/PofT1qd 9PLUFFoRBnV9w== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Jason Xing , Paolo Abeni , Sasha Levin Subject: [PATCH 5.10 19/73] netrom: Fix a data-race around sysctl_netrom_obsolescence_count_initialiser Date: Wed, 13 Mar 2024 12:45:46 -0400 Message-ID: <20240313164640.616049-20-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Jason Xing [ Upstream commit cfd9f4a740f772298308b2e6070d2c744fb5cf79 ] We need to protect the reader reading the sysctl value because the value can be changed concurrently. Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Signed-off-by: Jason Xing Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- net/netrom/nr_route.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/netrom/nr_route.c b/net/netrom/nr_route.c index 94c4d4554b9c7..8a5375e1dcc77 100644 --- a/net/netrom/nr_route.c +++ b/net/netrom/nr_route.c @@ -763,7 +763,7 @@ int nr_route_frame(struct sk_buff *skb, ax25_cb *ax25) if (ax25 !=3D NULL) { ret =3D nr_add_node(nr_src, "", &ax25->dest_addr, ax25->digipeat, ax25->ax25_dev->dev, 0, - sysctl_netrom_obsolescence_count_initialiser); + READ_ONCE(sysctl_netrom_obsolescence_count_initialiser)); if (ret) return ret; } --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8635D1534EE; Wed, 13 Mar 2024 16:47:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348425; cv=none; b=OE9yGhXNVXqzzzue4+o1SMNOcQR30uXL1Qaengk9NK4dwc2ipChBEtuOYxZ08ujLMq2Wq+IK5NcjtIv7mh2yppHThF11LOTz0cLGKtxxjh6cobCHaq7T+lTyDyaOh+YkCDPS3iq3Y/RxKixMIZrdWLQUj+MrH0o/5zVgpES/blU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348425; c=relaxed/simple; bh=gnQIEhthbcxCrWwdE1rXnIZF674rQKVPTnmEWr6Yt1g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=TsA67NfKVkREgIEU2ZdO8PWMUTIoZcRheHbCu0FfP9Vh4ktviMExRcrLqBINTqi/BWPJGXxm4SqfaQnDB3iGjnSM7rQ14edZgiI3J2YFXU+Xy5dQtqq+zjB2Xac3rfAfGsWIEHJcA2WBQwk6xHb+e0h9KOd9qI5ohyZE5LStaeA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=M2S8iC2N; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="M2S8iC2N" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 573E4C433A6; Wed, 13 Mar 2024 16:47:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348425; bh=gnQIEhthbcxCrWwdE1rXnIZF674rQKVPTnmEWr6Yt1g=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=M2S8iC2Nmuy9jdWhXQfCEc1vT/FUZziCKDJg0cqfgcocjF+vFYT19RGH8hZzygeVO o9V/8PUjoLTMXzfxyqL9OXh3pDCt5nJCJH/qVdbzV7fn/tPNCC8yrGkGpfg9VDFUzz PHyfO/Pr/VSNH4/oxB1OdsATnkl7MLF3ww0a9LFArwlV1klSjhjNhJjJlI8gm+vhOQ 8qBQqDjwWmdXG/9YdMg/Q/fv3b0vhsHs3dHNxbtVHLCIIu2YS2DjSf7by4XWo+IO4k lxAzArOTXUFJAiNVzMLF6yECiknknFU/T7/x1HoBhtHjHo5/0nOceKsk60+MkszimI bfhR0w5A91e7Q== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Jason Xing , Paolo Abeni , Sasha Levin Subject: [PATCH 5.10 20/73] netrom: Fix data-races around sysctl_netrom_network_ttl_initialiser Date: Wed, 13 Mar 2024 12:45:47 -0400 Message-ID: <20240313164640.616049-21-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Jason Xing [ Upstream commit 119cae5ea3f9e35cdada8e572cc067f072fa825a ] We need to protect the reader reading the sysctl value because the value can be changed concurrently. Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Signed-off-by: Jason Xing Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- net/netrom/nr_dev.c | 2 +- net/netrom/nr_out.c | 2 +- net/netrom/nr_subr.c | 5 +++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/net/netrom/nr_dev.c b/net/netrom/nr_dev.c index 29e418c8c6c30..4caee8754b794 100644 --- a/net/netrom/nr_dev.c +++ b/net/netrom/nr_dev.c @@ -81,7 +81,7 @@ static int nr_header(struct sk_buff *skb, struct net_devi= ce *dev, buff[6] |=3D AX25_SSSID_SPARE; buff +=3D AX25_ADDR_LEN; =20 - *buff++ =3D sysctl_netrom_network_ttl_initialiser; + *buff++ =3D READ_ONCE(sysctl_netrom_network_ttl_initialiser); =20 *buff++ =3D NR_PROTO_IP; *buff++ =3D NR_PROTO_IP; diff --git a/net/netrom/nr_out.c b/net/netrom/nr_out.c index 44929657f5b71..5e531394a724b 100644 --- a/net/netrom/nr_out.c +++ b/net/netrom/nr_out.c @@ -204,7 +204,7 @@ void nr_transmit_buffer(struct sock *sk, struct sk_buff= *skb) dptr[6] |=3D AX25_SSSID_SPARE; dptr +=3D AX25_ADDR_LEN; =20 - *dptr++ =3D sysctl_netrom_network_ttl_initialiser; + *dptr++ =3D READ_ONCE(sysctl_netrom_network_ttl_initialiser); =20 if (!nr_route_frame(skb, NULL)) { kfree_skb(skb); diff --git a/net/netrom/nr_subr.c b/net/netrom/nr_subr.c index e2d2af924cff4..c3bbd5880850b 100644 --- a/net/netrom/nr_subr.c +++ b/net/netrom/nr_subr.c @@ -182,7 +182,8 @@ void nr_write_internal(struct sock *sk, int frametype) *dptr++ =3D nr->my_id; *dptr++ =3D frametype; *dptr++ =3D nr->window; - if (nr->bpqext) *dptr++ =3D sysctl_netrom_network_ttl_initialiser; + if (nr->bpqext) + *dptr++ =3D READ_ONCE(sysctl_netrom_network_ttl_initialiser); break; =20 case NR_DISCREQ: @@ -236,7 +237,7 @@ void __nr_transmit_reply(struct sk_buff *skb, int mine,= unsigned char cmdflags) dptr[6] |=3D AX25_SSSID_SPARE; dptr +=3D AX25_ADDR_LEN; =20 - *dptr++ =3D sysctl_netrom_network_ttl_initialiser; + *dptr++ =3D READ_ONCE(sysctl_netrom_network_ttl_initialiser); =20 if (mine) { *dptr++ =3D 0; --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 77E52153509; Wed, 13 Mar 2024 16:47:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348426; cv=none; b=KSpFrvDeJ0aFckV7+cgYrxPxLL3ji08ZDkQyZaaaUqQevGD6wTi1oAksq33hr6j1jDQHv0j7D/aSWIyoqcMrdNn79Bj7rrv2vIYoi6DbnrVDSp14EiGuIIp62E/buZ8nD4ve9kWv8tm8qog1Zu/Ggfs6SD7txKfZ1G47z+nKq9A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348426; c=relaxed/simple; bh=v1F9PhDK0oX3T92o4m74/kx58+E0UmC3jFyT+LVR/fs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BJEYJ9n6bDdr6twA6KfNDHDxs0oUGGa7IQlTC+FIHUgOZrCHnLrOgqjn6LFytXargIcYKLsvYSdvI/LUUWsccqQMn9jYm2xztU4ru6PEKamJ2lmcEKA7OU2ZCuwR7sPEn3KjZW1X/Iw5vQvxzc/mZc+b1eEGNB321t/PuLOEMTM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ctbh4Wle; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="ctbh4Wle" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5C7C4C43390; Wed, 13 Mar 2024 16:47:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348426; bh=v1F9PhDK0oX3T92o4m74/kx58+E0UmC3jFyT+LVR/fs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ctbh4Wleh/ZsDhtrkD/wBVSlbXqDGCUXCkDZMLkaKnBBq/SAYJipljUL69Q7FV4OF kG2QGTSTxfOvCzl0kc4HKhMoewIfGbGdbSMe3XLK7r40rXwwD0+2LZKLLFvxADm7PV Urzj+K+xsRPbnEvMjg/c1p2xF+ksoS0ZbcsiDXFH7uNIeFeSQ55J0Xz3J54mWlXQMr cW6xeqWQOIQy7zQmCE+ssbAhKtmWtTu+p2mZ9c37u4471PzsexLqtt0jNFgpQKymzy mOw/0inckNq2fEC1D2t7gxrRJR/dJNzTtzsa09AICrM0Sk+7cyXQUN0XGKzEPsJkUD 461DdQKQ/WgBQ== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Jason Xing , Paolo Abeni , Sasha Levin Subject: [PATCH 5.10 21/73] netrom: Fix a data-race around sysctl_netrom_transport_timeout Date: Wed, 13 Mar 2024 12:45:48 -0400 Message-ID: <20240313164640.616049-22-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Jason Xing [ Upstream commit 60a7a152abd494ed4f69098cf0f322e6bb140612 ] We need to protect the reader reading the sysctl value because the value can be changed concurrently. Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Signed-off-by: Jason Xing Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- net/netrom/af_netrom.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c index 24747163122bb..6857510967448 100644 --- a/net/netrom/af_netrom.c +++ b/net/netrom/af_netrom.c @@ -453,7 +453,7 @@ static int nr_create(struct net *net, struct socket *so= ck, int protocol, nr_init_timers(sk); =20 nr->t1 =3D - msecs_to_jiffies(sysctl_netrom_transport_timeout); + msecs_to_jiffies(READ_ONCE(sysctl_netrom_transport_timeout)); nr->t2 =3D msecs_to_jiffies(sysctl_netrom_transport_acknowledge_delay); nr->n2 =3D --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2D80C15351B; Wed, 13 Mar 2024 16:47:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348427; cv=none; b=kIcC6nzIEcq36zwBnnHqJQhqgGQGegCYZ9G2gppjtDD8Wl5dh2D5fJrf8aBP2cMdDUD0C63uHTBRGnKNz02vpw6/PufJs616gnM83UIDQNF7DuADEAxSyuykjxNamuaD/qsIcU7sCy6/0FKRF4drJfJc1oo5DYao+GODe2IyAyg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348427; c=relaxed/simple; bh=was6sneh7FZD+9dPqJzYCOv8b8gK1yrXIKN6t46lAZA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=V6X6GE27lxFwOL0lSZZLXbAOu7gm0FZfK5u2QwccUY5DPSitGOFPqUr/Mm187PosJHq0V5zo+E3DUGGRfG2JYaO59av7xQid1TztK4R1uCGB2mgE5V7/f5G9zz8VHgzfmIx8Lz2bqacI7UuVbwbjFJokrihcKVq9yk0QEhduVDQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=CQN4iVWV; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="CQN4iVWV" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 570D3C433F1; Wed, 13 Mar 2024 16:47:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348427; bh=was6sneh7FZD+9dPqJzYCOv8b8gK1yrXIKN6t46lAZA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=CQN4iVWV/Cfc4f+htBgXUGVaur1VWORUigx5VTI1kbiHvsRMfrvawWC6KqUUJmX7p 1Pc02xC7Z9bYnGYvyiwuhRhfc2mYT/qp8AN2/h+/dpMUsUiwl30WIKcvD/wOPyFbrA Je+mIWU8ckcN3aHc/iMb+opUsMhjtT9WvJu9z1qp72H02AS32du5HKiVVDlPegEYpM KMLXxBW4zAXUvW8Zq7SdbCeMhn6wHaZ2bj4BX//j4SZs6DtlweqiEnirUOcaMiE8gN ZJyq/GxTu3zhk3z7VrRMnM2W2TB3llCKyDgg7iLzLBNV8LXpUCi/vwdphs7Pt0B/6M vQgsh69L0EO5g== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Jason Xing , Paolo Abeni , Sasha Levin Subject: [PATCH 5.10 22/73] netrom: Fix a data-race around sysctl_netrom_transport_maximum_tries Date: Wed, 13 Mar 2024 12:45:49 -0400 Message-ID: <20240313164640.616049-23-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Jason Xing [ Upstream commit e799299aafed417cc1f32adccb2a0e5268b3f6d5 ] We need to protect the reader reading the sysctl value because the value can be changed concurrently. Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Signed-off-by: Jason Xing Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- net/netrom/af_netrom.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c index 6857510967448..678a7bbd84bf2 100644 --- a/net/netrom/af_netrom.c +++ b/net/netrom/af_netrom.c @@ -457,7 +457,7 @@ static int nr_create(struct net *net, struct socket *so= ck, int protocol, nr->t2 =3D msecs_to_jiffies(sysctl_netrom_transport_acknowledge_delay); nr->n2 =3D - msecs_to_jiffies(sysctl_netrom_transport_maximum_tries); + msecs_to_jiffies(READ_ONCE(sysctl_netrom_transport_maximum_tries)); nr->t4 =3D msecs_to_jiffies(sysctl_netrom_transport_busy_delay); nr->idle =3D --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 86AB21534F1; Wed, 13 Mar 2024 16:47:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348428; cv=none; b=as2FXuLY8PRTBjPZR4Ho8BZF3NZUHKYsotLUj4cDMYhRAMv8cyv3493AKD2EYkvLNLrXvfUoaFHzDIP57+OcOD7pyDMoAmtyCe0JWJjDaMliHP3TUA/FJ5H0f2cYOwIH5SfqfFNKH7ObIZkVXtVSlH9naTB7ZlYsfqnlK3Fv4C8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348428; c=relaxed/simple; bh=67liw3T/StQ4cXBr9axLBR840ACqH5dgsHUqaBCJwWg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=QiW5Dg7dEAd7HvT4LxXLFYBeeIw20EVa670UYsGbZRw7DqVarHwRSkYJnkz6BFPrEUSOPDcjgF6bDsvDXCN5KHKNJBP3oVow9s6K9U5usHpcRWH28WYiv8lzl/HreSKmbS1TXw29zZjMZf6LabmrymNlGwao+8YTSN00/6MTRdw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Q017PVcm; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Q017PVcm" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 596E3C433C7; Wed, 13 Mar 2024 16:47:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348428; bh=67liw3T/StQ4cXBr9axLBR840ACqH5dgsHUqaBCJwWg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Q017PVcmPg69PTTrybF/umNswuo/WlWcgIwCBhuHiQ/PdSzzea6vXsBUpQ2hS9RZU OMs8CKJatV3zExVs4UU0c0OzoDdNVo558onmZO1JYoacOhHIx44NsRHO8LCAdAD5Ai U9UMiV1zDGFCYLAmk9pfznR3yzvMEwriacleMMpzLBodzs+oXyC4VrbfrZO3FyAn5h PWYaejvBVFU1bBS+m8XkPLhCxQJEhdgVbnyMf0b35ct+p0qII90Rm8KOmEz+tBnGp5 ROXnxM8rMYx4eCS2MvhEUlA0JVGeSG3K8L4oGtbNm+mabS6q60uiciN5jx6siTgdY+ oaQzaKi1t2kxQ== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Jason Xing , Paolo Abeni , Sasha Levin Subject: [PATCH 5.10 23/73] netrom: Fix a data-race around sysctl_netrom_transport_acknowledge_delay Date: Wed, 13 Mar 2024 12:45:50 -0400 Message-ID: <20240313164640.616049-24-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Jason Xing [ Upstream commit 806f462ba9029d41aadf8ec93f2f99c5305deada ] We need to protect the reader reading the sysctl value because the value can be changed concurrently. Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Signed-off-by: Jason Xing Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- net/netrom/af_netrom.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c index 678a7bbd84bf2..5a5cca18ae0c6 100644 --- a/net/netrom/af_netrom.c +++ b/net/netrom/af_netrom.c @@ -455,7 +455,7 @@ static int nr_create(struct net *net, struct socket *so= ck, int protocol, nr->t1 =3D msecs_to_jiffies(READ_ONCE(sysctl_netrom_transport_timeout)); nr->t2 =3D - msecs_to_jiffies(sysctl_netrom_transport_acknowledge_delay); + msecs_to_jiffies(READ_ONCE(sysctl_netrom_transport_acknowledge_delay)); nr->n2 =3D msecs_to_jiffies(READ_ONCE(sysctl_netrom_transport_maximum_tries)); nr->t4 =3D --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3A12E154421; Wed, 13 Mar 2024 16:47:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348429; cv=none; b=O5zlMItr2TjqtizjU4p18oWdk48BGWjdbkX5hKzx/GbG79GUZWDjC9tNxJCPx7FdehHHDTXK2rhp9+dggIP8PDHZdAxqEi5G3MZ7AOfjhr5l+Tanbvdobvn8JSbUGqfr9mYzLr3xzl/hcG1uZT+sgVBwDZnBAE4eHvFRLEpweZI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348429; c=relaxed/simple; bh=JupO535FDJs874LcX2bRQiX9YuUvDP4z5KRR1MTFWag=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NdV97I+LNHRGLppQwryBQo3kuJa4oFIUvPbY8Fvg6nkWvXMVzCT7WhQ7h1YqxNX2301jhhh6KInpevg/l8zKZU4Pqq2Dxuph6ikaOqy40P6zr1Wxu8Wyzws4H3NUqGyJOBNAn1RSajKlv8cbNtnkOS9G76PZB/0hNuEL4LURhXQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=UgNmSR1i; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="UgNmSR1i" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5BD23C433F1; Wed, 13 Mar 2024 16:47:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348429; bh=JupO535FDJs874LcX2bRQiX9YuUvDP4z5KRR1MTFWag=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=UgNmSR1iCAoTr7kcLbJ0/r63BV28vty0uTZEbVDvvqpGWu4znHlvOVarTXNk7alD3 8Ow/3aAxuLqAoIeOEqCFL903xIT1Pok1IZLbUVfOlRh8y3QHQpSysIF1GQUQ/flq9H HwtpjC9ZWiLoHiY80VcMpyhbo8AsUBwDHD8unqlHyJH37gHb6r2EfgiSH4FAA38kNS z8oaSGJl3YFHxt9dEqefw6Hjhc+cU/ARpux82kgRBuNi0FS02Wu1gU0ngFKGwnKEwr wbhKc8sQOJEeKJM9Yx6rRCWJsIX8gMNLAwh9aLvcuD0NBq8Z5uLrtur1WuQtHISnRD R2QLlLCVqM/sw== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Jason Xing , Paolo Abeni , Sasha Levin Subject: [PATCH 5.10 24/73] netrom: Fix a data-race around sysctl_netrom_transport_busy_delay Date: Wed, 13 Mar 2024 12:45:51 -0400 Message-ID: <20240313164640.616049-25-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Jason Xing [ Upstream commit 43547d8699439a67b78d6bb39015113f7aa360fd ] We need to protect the reader reading the sysctl value because the value can be changed concurrently. Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Signed-off-by: Jason Xing Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- net/netrom/af_netrom.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c index 5a5cca18ae0c6..76d66eb0de255 100644 --- a/net/netrom/af_netrom.c +++ b/net/netrom/af_netrom.c @@ -459,7 +459,7 @@ static int nr_create(struct net *net, struct socket *so= ck, int protocol, nr->n2 =3D msecs_to_jiffies(READ_ONCE(sysctl_netrom_transport_maximum_tries)); nr->t4 =3D - msecs_to_jiffies(sysctl_netrom_transport_busy_delay); + msecs_to_jiffies(READ_ONCE(sysctl_netrom_transport_busy_delay)); nr->idle =3D msecs_to_jiffies(sysctl_netrom_transport_no_activity_timeout); nr->window =3D sysctl_netrom_transport_requested_window_size; --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 675E915444D; Wed, 13 Mar 2024 16:47:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348430; cv=none; b=BKqQaXj/iARePecWcPhn/gdML7aL2yGkDQEZlOPfYhl2QIZ+YWJiDNiV8sql4SeYRanMtLGKCi5htexDMp2zw368R1aNYgjuOvPzWyd6iq3dY/Hf/eIs7DFn4X7sxkYLO7gF2cHs/zvel0jpzjGJ3+ZgdA+nNSgVTs4K40Vl9o0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348430; c=relaxed/simple; bh=A45mpmaNrioN7F+79MkqmOhHiGCPFpIHmheKJHJxoKk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rsSIwtXZuq/tllNNlnU+5KSqSKGmWbZ+82XSFPSupKru1Rb30wfdI1o6joVT+vEL5HlqtcXA2XVMr3856cZPo3bZ0G1iInr+cp01Zx2IZC3Pf8wRbmMXHJ5oaQx1mb+guYNrPbHaVVXjLhDVXGoBNfZndAhesmkcgmNJVXjUbjM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=g88jpvLR; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="g88jpvLR" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 59681C43390; Wed, 13 Mar 2024 16:47:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348430; bh=A45mpmaNrioN7F+79MkqmOhHiGCPFpIHmheKJHJxoKk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=g88jpvLR6tKhTBWbGNgFF2hbEGjp4KX2srpjz65cWW/+AwdWa4kvAGavczDW5tkkw GTYhh+KCjEr6e/wU6Yqsd0E49VIYJydLKpgiq+7AxzU5ZEd4c6YiAB35ZE7zqOUIwc R8A0IbluzpJQyvyWia+Cy1pqvcbwMakXrjtxfhfsLEacv3P13KQaAX+ezWPXNLsKzB ANEXAzRT5+z0PJ1b0MD2QpaNvtoKvhQGg1L9oPTDyvJYTNdKzuwT/kLt52LyIheWC8 ah/4pX2l52E/lNkpngep5h1TEWTgIkg/D2MhPpacuJe7Uc5/yUpbs7cKek7JRY6Y7O ntxVORayo2hxg== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Jason Xing , Paolo Abeni , Sasha Levin Subject: [PATCH 5.10 25/73] netrom: Fix a data-race around sysctl_netrom_transport_requested_window_size Date: Wed, 13 Mar 2024 12:45:52 -0400 Message-ID: <20240313164640.616049-26-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Jason Xing [ Upstream commit a2e706841488f474c06e9b33f71afc947fb3bf56 ] We need to protect the reader reading the sysctl value because the value can be changed concurrently. Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Signed-off-by: Jason Xing Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- net/netrom/af_netrom.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c index 76d66eb0de255..d780adf54e19e 100644 --- a/net/netrom/af_netrom.c +++ b/net/netrom/af_netrom.c @@ -462,7 +462,7 @@ static int nr_create(struct net *net, struct socket *so= ck, int protocol, msecs_to_jiffies(READ_ONCE(sysctl_netrom_transport_busy_delay)); nr->idle =3D msecs_to_jiffies(sysctl_netrom_transport_no_activity_timeout); - nr->window =3D sysctl_netrom_transport_requested_window_size; + nr->window =3D READ_ONCE(sysctl_netrom_transport_requested_window_size); =20 nr->bpqext =3D 1; nr->state =3D NR_STATE_0; --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 30C71154BED; Wed, 13 Mar 2024 16:47:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348431; cv=none; b=IDVFwSPy1Q2lb9hcZQvlGa898bGo5oslevUkqELwnzz1qsTGe8ac86Bq1PnVy7R5pEtvdWy9JxX1Cw1gmQdmKzhAsqTPSeOuBpgZJq1n8P3j2oyaSCJlApGCu3+Hjy61ihXON3jSP25VDTIHwN5u+s7jqJEaFx6SO5cGjxjFPuo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348431; c=relaxed/simple; bh=g43Mh+Ckbo7u84Iinkv4s2Oe8nqvUxcd3wBs+YIKlwA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=M7v3i2jAVHu+79e/D7WCP8wSSXkwYn5eyuhAn7KIgNE/AzXe7ZitVfpnx6Ey892HPqvjFCe42/IdXcuA3XhLVk6/tH5JcsGyp3aco5K/XRzjQ84PT+yeLrgjhk/ZFDsZoluVBQgEifMBRsANKKoFi1LSccnPO7ei69mBNfnAaBY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=uGhFUvbf; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="uGhFUvbf" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5687DC433F1; Wed, 13 Mar 2024 16:47:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348431; bh=g43Mh+Ckbo7u84Iinkv4s2Oe8nqvUxcd3wBs+YIKlwA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=uGhFUvbfybczbEAWp97m7+GOQlyrWCj0OqMIuK76QSrg4Q2zCjtV/43eoKxRC8kcM L+m0WQiSI634NFNKVlH67qaWSGlZMq2aL76HJCVP+Y9kchnXWtKf6Y4qGWnJfks1xp Gn8wJ2CJZFl4cLGJvYn+jRSg5vDhuSkVPcUuhjcDU2pLxC+JeT/WT1RWMgJwaMarU5 /fbZOyOGtjUabIjyhlI8DOlWc4bC8/7pkUwaBEWqzr6sBNu3ljw1ZgxxfgxIP7qQh+ 972Hm446gCGAYjPXhqmf9sC43L9f+ol1qsaAvOSJM7QhBVmZmc8VPxg2jWJL5K7emR wAW4F6vD9Ql1w== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Jason Xing , Paolo Abeni , Sasha Levin Subject: [PATCH 5.10 26/73] netrom: Fix a data-race around sysctl_netrom_transport_no_activity_timeout Date: Wed, 13 Mar 2024 12:45:53 -0400 Message-ID: <20240313164640.616049-27-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Jason Xing [ Upstream commit f99b494b40431f0ca416859f2345746199398e2b ] We need to protect the reader reading the sysctl value because the value can be changed concurrently. Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Signed-off-by: Jason Xing Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- net/netrom/af_netrom.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c index d780adf54e19e..376b6af431448 100644 --- a/net/netrom/af_netrom.c +++ b/net/netrom/af_netrom.c @@ -461,7 +461,7 @@ static int nr_create(struct net *net, struct socket *so= ck, int protocol, nr->t4 =3D msecs_to_jiffies(READ_ONCE(sysctl_netrom_transport_busy_delay)); nr->idle =3D - msecs_to_jiffies(sysctl_netrom_transport_no_activity_timeout); + msecs_to_jiffies(READ_ONCE(sysctl_netrom_transport_no_activity_timeout)); nr->window =3D READ_ONCE(sysctl_netrom_transport_requested_window_size); =20 nr->bpqext =3D 1; --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9B2CB154456; Wed, 13 Mar 2024 16:47:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348432; cv=none; b=NekLuWCEamkj0lXc6bfQFxTSaoXnL6hS9/1jSJZyM3xN2Fifn+eNBQZkHgOJi33g500ULq0b3ei6WQbZ8wpp04OpIF9NLiZAaPQ62fXM+U6yVTU9xLhoh5lzEM3/r7x+zbZpSPrPo5tU5XRA7eM9w77ctAtuWINu24zwCCyhMIs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348432; c=relaxed/simple; bh=hVyrczuiZJbLaXd3dR/x2S4Q0HwmjvVXsmFzKXbIcuE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bM5LvjcfdtQY2OU3yqMaKniOFR9Allgs1sz4EbbK1VsBJjY5HH0Ccj7Xm//MIPRNB6nTAd/N7QeFQxpl6YwuDyRysxiwoI2X+o7HvKqNfGVLK88ZaVGgHogS6vFvEM1F5rLLg90m6DlRSJQYhgDKMGHQScFG2a6zVjG/itSapuY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=N0tC3uQo; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="N0tC3uQo" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5698FC433B1; Wed, 13 Mar 2024 16:47:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348432; bh=hVyrczuiZJbLaXd3dR/x2S4Q0HwmjvVXsmFzKXbIcuE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=N0tC3uQo2HdtBMWm1SYSTSpUdeNoEPmyF3nGt9+4Ms4TJUteKcZ96T0D8P94j5pGe 81f3KA5mJ9s/RsbHlwIWp2JV1qFoYZTXGlQ58hvwCA7YPJceCM1LBmzv4RW/FA0A8P j71J1cLibUcEtbC6YbZGhRwUEZcbhNxDHaPyjc9OaGTophiYg2DE72OMy4DgXpVsVu w25NkZhUps4iMoZ9+9qiCOmGSO/1/ovg6IAITiAY9nc1yn5/gNdQpGao2CPwWl3cAB XesDVfqUmgXgaqoOt/127s3UQwZK9MmbNxzj7RVNP9jJY16J6SPYKaeWfHJG8JPaIC ybKqMoLEssPsA== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Jason Xing , Paolo Abeni , Sasha Levin Subject: [PATCH 5.10 27/73] netrom: Fix a data-race around sysctl_netrom_routing_control Date: Wed, 13 Mar 2024 12:45:54 -0400 Message-ID: <20240313164640.616049-28-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Jason Xing [ Upstream commit b5dffcb8f71bdd02a4e5799985b51b12f4eeaf76 ] We need to protect the reader reading the sysctl value because the value can be changed concurrently. Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Signed-off-by: Jason Xing Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- net/netrom/nr_route.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/netrom/nr_route.c b/net/netrom/nr_route.c index 8a5375e1dcc77..88c59bd0f7397 100644 --- a/net/netrom/nr_route.c +++ b/net/netrom/nr_route.c @@ -777,7 +777,7 @@ int nr_route_frame(struct sk_buff *skb, ax25_cb *ax25) return ret; } =20 - if (!sysctl_netrom_routing_control && ax25 !=3D NULL) + if (!READ_ONCE(sysctl_netrom_routing_control) && ax25 !=3D NULL) return 0; =20 /* Its Time-To-Live has expired */ --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7A9741552F7; Wed, 13 Mar 2024 16:47:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348433; cv=none; b=fiRzGkGgjtLY4lCRSMuZiD9WITKThaOwHpyRjV3UMzKs88LpEXQq8ltuGPCpMS9sgSbNBxOu21CtFp12HcOl6sX0TOtUL2UUc2+b1snKTOFKdjLngem2Ef0jbw2whpvNVe/mf2W3cU0qbImhIAV1wYBqK3Q+/upapQQDupyuLpM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348433; c=relaxed/simple; bh=nKbi3WvYJpDkLVr2ny9cBIoQGrlxEb/UoWvrx+M1nTE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fOYQnIdb6sBTA/fnJMocqrcW8MXSquxanEe1qrvnfcgM1fIeCR331usRSOGnfgwe7G9fzh2kbnPeUAk8XGDUllX586LS2kRIbiF81+m5bcV7q9jxYsxK+FYExw3V8eEJQVjFMdE7c5+TjkeFZWCEvmDrWHJMZiqFaGUuEIKcsDM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=vHR0qF0q; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="vHR0qF0q" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 53FDFC433C7; Wed, 13 Mar 2024 16:47:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348433; bh=nKbi3WvYJpDkLVr2ny9cBIoQGrlxEb/UoWvrx+M1nTE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=vHR0qF0q3PQGk3fZgl4eF0eqAkwPAOz31wtCeeYiVlNgzCtuuxcL/L7VHs+TEZper 1Fyx4WeOnGi1SzyLgIN7YBkGhJJXTOpbKEsZAD78ASs9UCvPi25IXRhQ1g0LNmVP8e 2DZ9bsnimLVFBpiJsxhbHJQbTHEaVzt587z41D9VRyEzV6poprXCfdEdlvxgXY82nK bXZ27Wk84FOCXZWJc6s6Eyqg+SbNxjIUp9Dv76jdYSZ2dHkR+3LI8pWpKYl7lZYo1f st0UpNZuRdfaHlxTkk6akcOSwsYeI90QcDn4k8qlsd/oQ7njBPcM4I6SsLOeysLw/l 7Mp6wK6NCN4Iw== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Jason Xing , Paolo Abeni , Sasha Levin Subject: [PATCH 5.10 28/73] netrom: Fix a data-race around sysctl_netrom_link_fails_count Date: Wed, 13 Mar 2024 12:45:55 -0400 Message-ID: <20240313164640.616049-29-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Jason Xing [ Upstream commit bc76645ebdd01be9b9994dac39685a3d0f6f7985 ] We need to protect the reader reading the sysctl value because the value can be changed concurrently. Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Signed-off-by: Jason Xing Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- net/netrom/nr_route.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/netrom/nr_route.c b/net/netrom/nr_route.c index 88c59bd0f7397..895702337c92e 100644 --- a/net/netrom/nr_route.c +++ b/net/netrom/nr_route.c @@ -725,7 +725,7 @@ void nr_link_failed(ax25_cb *ax25, int reason) nr_neigh->ax25 =3D NULL; ax25_cb_put(ax25); =20 - if (++nr_neigh->failed < sysctl_netrom_link_fails_count) { + if (++nr_neigh->failed < READ_ONCE(sysctl_netrom_link_fails_count)) { nr_neigh_put(nr_neigh); return; } --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 313DA15530B; Wed, 13 Mar 2024 16:47:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348434; cv=none; b=NCuhb1QqvrOB+44HcGpZQ5E3S3iZdmnwagAt75LPHX474MkFw+InhMtQwDAaX7GpHVG6RogPGW05uoRKEkGYVYAaaIZVtjiV7AWbXBBhxyzQ2sfrGyrbtDrysmOFeh+ssCb4C0VGG3i9dkIZvJuzfuRa8pY3qCHY8urfocrQG14= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348434; c=relaxed/simple; bh=VOUAc+hS+8LXXjO/8xjaKP/C6ALJcpsGzO3/KKcZsro=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cHhLZQ+lbSjuzz6yLSILVVopCKS8/S/nd9Uv/XxADHD1TROQVnqhh1+Xcaa89SezOe93Remv8612AildYeZN/WkB2NwIXJH1aIN6coQgGJnYs5lh5tZzjdM6Np+W+lsoC4GYvwU5dEJyJ9g8oTf28Hq+V+mmd/4HHvCKva2P260= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=hT3XXRvk; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="hT3XXRvk" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 51087C43390; Wed, 13 Mar 2024 16:47:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348434; bh=VOUAc+hS+8LXXjO/8xjaKP/C6ALJcpsGzO3/KKcZsro=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=hT3XXRvk91gKer0LC4WRjZO538Ah3PUDazs2Ul3oldCfv+f5BnQtScH9v30ESE6ds z7oLwC8bEWcrwhbbWAFrOFYcJ6RAMqQcf5TrmR+uHhvTTaleN9Oc6KqJ4uy26F7HTC NmWUzka1E4Z5t40K35t5/reR0ykVAQKOy1zlnLaayv/GpPv34km7qO4bn0SYSkMPIN 9sXgGa6vwMLFzbM4XKPOI9009m8QnebIWEnQpkzU9LbqGDHn9pU36kA4fGsuQFJ2wD a5QXb5dJrgyIKuSkVRBLZaJgfMFUDMk/svWpAquZBtiTfJMjO+6suZ22AH4gXkf7Lb KE9YLeRXJNCTg== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Jason Xing , Paolo Abeni , Sasha Levin Subject: [PATCH 5.10 29/73] netrom: Fix data-races around sysctl_net_busy_read Date: Wed, 13 Mar 2024 12:45:56 -0400 Message-ID: <20240313164640.616049-30-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Jason Xing [ Upstream commit d380ce70058a4ccddc3e5f5c2063165dc07672c6 ] We need to protect the reader reading the sysctl value because the value can be changed concurrently. Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Signed-off-by: Jason Xing Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- net/netrom/af_netrom.c | 2 +- net/netrom/nr_in.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c index 376b6af431448..37d0bf6cab456 100644 --- a/net/netrom/af_netrom.c +++ b/net/netrom/af_netrom.c @@ -954,7 +954,7 @@ int nr_rx_frame(struct sk_buff *skb, struct net_device = *dev) * G8PZT's Xrouter which is sending packets with command type 7 * as an extension of the protocol. */ - if (sysctl_netrom_reset_circuit && + if (READ_ONCE(sysctl_netrom_reset_circuit) && (frametype !=3D NR_RESET || flags !=3D 0)) nr_transmit_reset(skb, 1); =20 diff --git a/net/netrom/nr_in.c b/net/netrom/nr_in.c index 69e58906c32b1..034f79d11ae11 100644 --- a/net/netrom/nr_in.c +++ b/net/netrom/nr_in.c @@ -97,7 +97,7 @@ static int nr_state1_machine(struct sock *sk, struct sk_b= uff *skb, break; =20 case NR_RESET: - if (sysctl_netrom_reset_circuit) + if (READ_ONCE(sysctl_netrom_reset_circuit)) nr_disconnect(sk, ECONNRESET); break; =20 @@ -128,7 +128,7 @@ static int nr_state2_machine(struct sock *sk, struct sk= _buff *skb, break; =20 case NR_RESET: - if (sysctl_netrom_reset_circuit) + if (READ_ONCE(sysctl_netrom_reset_circuit)) nr_disconnect(sk, ECONNRESET); break; =20 @@ -263,7 +263,7 @@ static int nr_state3_machine(struct sock *sk, struct sk= _buff *skb, int frametype break; =20 case NR_RESET: - if (sysctl_netrom_reset_circuit) + if (READ_ONCE(sysctl_netrom_reset_circuit)) nr_disconnect(sk, ECONNRESET); break; =20 --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 68C7A155A37; Wed, 13 Mar 2024 16:47:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348435; cv=none; b=braYCVwPMYLn1qJdbaZKiCPGIpG7HqXzci07fKX3xWBWWxXONl3UVAR143RwMFl+6CQPI3dusueDnl9Mc2mmWT1J/61YUWqc1sd/htYx6KvKWiEbRh6UYVxEd6MwhadvQ3Lx3E4aSaUZ8vlbpea87dLymRjWXCCPIZzzKiZcVyM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348435; c=relaxed/simple; bh=Fk4VBjoxky/x4vOZ0nYWTRX8O5NSYCQ4esJ/tMM9+K0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VTjtHaqVdx5HU9GItC/II1sFl0fGoo4mLnWGvDEfI2/LZa2IOL1F8HLFi/t7wESE7CSq2eb0KUK6WGUDwIvWV2XyymDjmbqmoy4BWf+HKYpt43P9LRF3ZRAi+5WOj5qIt0sa+EKjGnh65cBo0SnhNAzElcOYvW4HdGwZtdW1GGE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=OR8eiH02; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="OR8eiH02" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5EE33C43394; Wed, 13 Mar 2024 16:47:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348435; bh=Fk4VBjoxky/x4vOZ0nYWTRX8O5NSYCQ4esJ/tMM9+K0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=OR8eiH02rOG4Ri21iqLwApkP6A1SeC9GGKkcQPxNFe0rVNb35ML3s80mOMsdDlmc1 ddu6gBxI9nbqXyiha7ldzDVNypcWmvmd4k9fJfMN+GX5xKC9JFkb1qhuHGVjYq38sy 9dNjAFsPFghcnLNyh8jsKV//NJT/Tv4dFod25Nc2Jg2IrpNToO8Fk3xkK5Hs79dLwv qqcr0X/u7+ON+ivpjXYFbrVqbu2xNliKFnFYcjbsF8/wKIwBDC9KMrNRNfI+rXNsAB CuGHOQN+4TwZtiB+nkN3TyIAaTxxYepQIwaxJdI0WZ8AVCGDZOAA2nWA1ePSCabkA/ obO1UPpmieZSQ== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Muhammad Usama Anjum , Shuah Khan , David Laight , Andrew Morton , Sasha Levin Subject: [PATCH 5.10 30/73] selftests/mm: switch to bash from sh Date: Wed, 13 Mar 2024 12:45:57 -0400 Message-ID: <20240313164640.616049-31-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Muhammad Usama Anjum [ Upstream commit bc29036e1da1cf66e5f8312649aeec2d51ea3d86 ] Running charge_reserved_hugetlb.sh generates errors if sh is set to dash: ./charge_reserved_hugetlb.sh: 9: [[: not found ./charge_reserved_hugetlb.sh: 19: [[: not found ./charge_reserved_hugetlb.sh: 27: [[: not found ./charge_reserved_hugetlb.sh: 37: [[: not found ./charge_reserved_hugetlb.sh: 45: Syntax error: "(" unexpected Switch to using /bin/bash instead of /bin/sh. Make the switch for write_hugetlb_memory.sh as well which is called from charge_reserved_hugetlb.sh. Link: https://lkml.kernel.org/r/20240116090455.3407378-1-usama.anjum@collab= ora.com Signed-off-by: Muhammad Usama Anjum Cc: Muhammad Usama Anjum Cc: Shuah Khan Cc: David Laight Cc: Signed-off-by: Andrew Morton Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- tools/testing/selftests/vm/charge_reserved_hugetlb.sh | 2 +- tools/testing/selftests/vm/write_hugetlb_memory.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/vm/charge_reserved_hugetlb.sh b/tools/= testing/selftests/vm/charge_reserved_hugetlb.sh index 7536ff2f890a1..d0107f8ae6213 100644 --- a/tools/testing/selftests/vm/charge_reserved_hugetlb.sh +++ b/tools/testing/selftests/vm/charge_reserved_hugetlb.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash # SPDX-License-Identifier: GPL-2.0 =20 set -e diff --git a/tools/testing/selftests/vm/write_hugetlb_memory.sh b/tools/tes= ting/selftests/vm/write_hugetlb_memory.sh index 70a02301f4c27..3d2d2eb9d6fff 100644 --- a/tools/testing/selftests/vm/write_hugetlb_memory.sh +++ b/tools/testing/selftests/vm/write_hugetlb_memory.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash # SPDX-License-Identifier: GPL-2.0 =20 set -e --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 36E3415697B; Wed, 13 Mar 2024 16:47:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348437; cv=none; b=R9hpWR2ZTIh5HV+3O86aBFnK5AWLYP2JoQ2EcATkA8cIVMfWDnOZ6saQKuvWHNYuBx6VAAW0DISUV7WVwY6WPkwkvo07R+JzLrj2my2wnht6OhBc3O0qPFwL+fHSkjxGjW65kjE42s+j1fFgJoqxuXMe25s37dByygzGfSV9T0g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348437; c=relaxed/simple; bh=LyeZc5QveyggAQYPY/hrck83W9yX91L3yriLGxrzjlU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cJGGHeOFtW6/H+P3lHwDqOiLFV26f4OYgU4nRj0maf69YCOojK4DeUVoHJcY+DzFmCzEm826M1e3hOVNB9RSGook32hCCrBBKgqv2E/XJLw45o2qrlO9AJTgy27UHp620NeYB4HGjV4WqLmGfcNJzFuQtE/WdaarXdOJHgeAZo8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=PGi+CYOM; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="PGi+CYOM" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9289EC43399; Wed, 13 Mar 2024 16:47:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348436; bh=LyeZc5QveyggAQYPY/hrck83W9yX91L3yriLGxrzjlU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=PGi+CYOM6bmhJO3Nt1Yi1aZ2MiFiToiqpLpcl6mFdf9AFGjwh+WDxep0+xNqIV1Ti 6uTzEKxbodeC5pF7OqrmteTSG8L20dnN5nLI4HU9o7fsHrUhcAT7t7tdTPlXBkVhWU 0FwyF7v212ejYq1Xl64C7j6FNivdKUzZ17wSkxCtSzHKt0KGKYgoFTEDsZCOhF9kJH Y5XzxPl/Le5RrmixbCALe33db+aFuushywUEfhb0+mZYyDUNiuIKxu6T2kSXS5gQUg 2D+rLrSDGILgdFKEGjmOjuwGse/LN2k6fTvnj36q4SFEWTiwl0K6qAXbjIm16RLMJU TBFnqakPCcawQ== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Nico Pache , Donet Tom , Shuah Khan , Christophe Leroy , Michael Ellerman , Andrew Morton , Sasha Levin Subject: [PATCH 5.10 31/73] selftests: mm: fix map_hugetlb failure on 64K page size systems Date: Wed, 13 Mar 2024 12:45:58 -0400 Message-ID: <20240313164640.616049-32-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Nico Pache [ Upstream commit 91b80cc5b39f00399e8e2d17527cad2c7fa535e2 ] On systems with 64k page size and 512M huge page sizes, the allocation and test succeeds but errors out at the munmap. As the comment states, munmap will failure if its not HUGEPAGE aligned. This is due to the length of the mapping being 1/2 the size of the hugepage causing the munmap to not be hugepage aligned. Fix this by making the mapping length the full hugepage if the hugepage is larger than the length of the mapping. Link: https://lkml.kernel.org/r/20240119131429.172448-1-npache@redhat.com Signed-off-by: Nico Pache Cc: Donet Tom Cc: Shuah Khan Cc: Christophe Leroy Cc: Michael Ellerman Cc: Signed-off-by: Andrew Morton Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- tools/testing/selftests/vm/map_hugetlb.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tools/testing/selftests/vm/map_hugetlb.c b/tools/testing/selft= ests/vm/map_hugetlb.c index 312889edb84ab..c65c55b7a789f 100644 --- a/tools/testing/selftests/vm/map_hugetlb.c +++ b/tools/testing/selftests/vm/map_hugetlb.c @@ -15,6 +15,7 @@ #include #include #include +#include "vm_util.h" =20 #define LENGTH (256UL*1024*1024) #define PROTECTION (PROT_READ | PROT_WRITE) @@ -70,10 +71,16 @@ int main(int argc, char **argv) { void *addr; int ret; + size_t hugepage_size; size_t length =3D LENGTH; int flags =3D FLAGS; int shift =3D 0; =20 + hugepage_size =3D default_huge_page_size(); + /* munmap with fail if the length is not page aligned */ + if (hugepage_size > length) + length =3D hugepage_size; + if (argc > 1) length =3D atol(argv[1]) << 20; if (argc > 2) { --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CC4CB15698F; Wed, 13 Mar 2024 16:47:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348437; cv=none; b=mqJDoWfXIjX7X4lE+OHGkcusM1ST3d0+qxCNoczWnefMgsutIo1zwMOLbYC/RpOq98yk8rLL55azYuR+F9aLmD4a72nph/DYyVtHHvpJVVPUm16/sg8/mfOCMrBwCHfD4LKOELl+iqvztDxZ3AUDd3NZ2xo5c7iZ4pdb309/lfA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348437; c=relaxed/simple; bh=aIRckklprcjrKa5eh6He5Pc9CpbUWiX2S4adw6PMp1c=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NRxoU8g2skXPTCjilMCwXDPRnFYRiLZYgbeuCgh1RhHWL4vVBoukzj/6UgBhImAybFKxcjyP56kxC/9tLnekC1qDSrrBvjeLp9j8briMlg785VexISAwIVOeIFGf4And2G69pQU5Yr4lsNw50mpzERS2NRuF6HdjfB2BrlAgMwQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=J8B0EHMd; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="J8B0EHMd" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 05D68C433F1; Wed, 13 Mar 2024 16:47:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348437; bh=aIRckklprcjrKa5eh6He5Pc9CpbUWiX2S4adw6PMp1c=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=J8B0EHMdRVN63TkS0UXeYyQ3tXYIh3sqRspNenZYobT73dr9gw0l3+p3/nvUxmrgd PxDCh1qiYqbyST+LUg0JNf2qUnFe1p+YW42pVuXTXi7HNjAOGqs95rJPvy2yLb3V/a +7nun26jG6aNz0Y69QDQocap/HlDOo6ixr6SO3rh7RNOG9dK/6TZo4dCptp8AQtG/w zuldxPo11C7/M/j173bkKjzZo4x2YCzcYSlsZC8GRdqQVMKuUPWNcptl6BglQ/wiH1 /dZ1LFewWofG1qbfSxbohvxJLqyC9GexH9+OZd/Mc+9e6sgyckeI7//JAyalzBYCxI FM0WIC4U78LeA== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Johannes Berg , Richard Weinberger , Sasha Levin Subject: [PATCH 5.10 32/73] um: allow not setting extra rpaths in the linux binary Date: Wed, 13 Mar 2024 12:45:59 -0400 Message-ID: <20240313164640.616049-33-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Johannes Berg [ Upstream commit 386093c68ba3e8bcfe7f46deba901e0e80713c29 ] There doesn't seem to be any reason for the rpath being set in the binaries, at on systems that I tested on. On the other hand, setting rpath is actually harming binaries in some cases, e.g. if using nix-based compilation environments where /lib & /lib64 are not part of the actual environment. Add a new Kconfig option (under EXPERT, for less user confusion) that allows disabling the rpath additions. Signed-off-by: Johannes Berg Signed-off-by: Richard Weinberger Stable-dep-of: 846cfbeed09b ("um: Fix adding '-no-pie' for clang") Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- arch/um/Kconfig | 13 +++++++++++++ arch/um/Makefile | 3 ++- arch/x86/Makefile.um | 2 +- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/arch/um/Kconfig b/arch/um/Kconfig index eb1c6880bde49..20264b47dcffc 100644 --- a/arch/um/Kconfig +++ b/arch/um/Kconfig @@ -92,6 +92,19 @@ config LD_SCRIPT_DYN depends on !LD_SCRIPT_STATIC select MODULE_REL_CRCS if MODVERSIONS =20 +config LD_SCRIPT_DYN_RPATH + bool "set rpath in the binary" if EXPERT + default y + depends on LD_SCRIPT_DYN + help + Add /lib (and /lib64 for 64-bit) to the linux binary's rpath + explicitly. + + You may need to turn this off if compiling for nix systems + that have their libraries in random /nix directories and + might otherwise unexpected use libraries from /lib or /lib64 + instead of the desired ones. + config HOSTFS tristate "Host filesystem" help diff --git a/arch/um/Makefile b/arch/um/Makefile index 56e5320da7624..4211e23a2f68f 100644 --- a/arch/um/Makefile +++ b/arch/um/Makefile @@ -118,7 +118,8 @@ archprepare: $(Q)$(MAKE) $(build)=3D$(HOST_DIR)/um include/generated/user_constants.h =20 LINK-$(CONFIG_LD_SCRIPT_STATIC) +=3D -static -LINK-$(CONFIG_LD_SCRIPT_DYN) +=3D -Wl,-rpath,/lib $(call cc-option, -no-pi= e) +LINK-$(CONFIG_LD_SCRIPT_DYN) +=3D $(call cc-option, -no-pie) +LINK-$(CONFIG_LD_SCRIPT_DYN_RPATH) +=3D -Wl,-rpath,/lib =20 CFLAGS_NO_HARDENING :=3D $(call cc-option, -fno-PIC,) $(call cc-option, -f= no-pic,) \ -fno-stack-protector $(call cc-option, -fno-stack-protector-all) diff --git a/arch/x86/Makefile.um b/arch/x86/Makefile.um index 1db7913795f51..b3c1ae084180d 100644 --- a/arch/x86/Makefile.um +++ b/arch/x86/Makefile.um @@ -44,7 +44,7 @@ ELF_FORMAT :=3D elf64-x86-64 =20 # Not on all 64-bit distros /lib is a symlink to /lib64. PLD is an example. =20 -LINK-$(CONFIG_LD_SCRIPT_DYN) +=3D -Wl,-rpath,/lib64 +LINK-$(CONFIG_LD_SCRIPT_DYN_RPATH) +=3D -Wl,-rpath,/lib64 LINK-y +=3D -m64 =20 endif --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2476B157E63; Wed, 13 Mar 2024 16:47:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348439; cv=none; b=nJz8FRebA/Y4ikloQiIN6NHdU+9Fy65pvrie1pcJQ0/yQcDCMlI6khhAT6tY4HG3zBk1ALZwlG4h89sTmPtkmp3tfNTPY7f2N6KzXGFE3OeOJNGHHAolqKFmW5/hzjoa0tzIsrxI5eGw4I/J/V4Gsv3W1L2/CZkKcK9KqmFlo84= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348439; c=relaxed/simple; bh=RIVemwWILV1Ivhuy6i7UoQRPSNXn4l1ZvxG6KdWc4Ik=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=XR+08yDgWZP8rCGOdHJsOMpt4LMDuRek2ZUbe2jNKVXZhVjSw+HHNnBi8vtJq0b7EWxzpYQnQVBSW4sb6cuSaMvpP1A3X79fJAX7XaHEsQraC4iiMCGnVRtjmjzjvjdWpDfBtOJ9LPd+T4QAaPSNDeebNde0RsfYCxq4tZ7cD/I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=FaKQHxp0; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="FaKQHxp0" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 05867C433B1; Wed, 13 Mar 2024 16:47:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348438; bh=RIVemwWILV1Ivhuy6i7UoQRPSNXn4l1ZvxG6KdWc4Ik=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=FaKQHxp09dNWfWgSrVpxraTs37MFws+aJN24AJ8Cb+/tZ5XBqy+hJ6t9pOZ8SupFi KCY6k6qEXTs2vhaRtTB4VQwoKP4M3zWZ6An2Tn5jpz0iAHnfhoGPpjYIF4uOIfpkSM u8nX/xYSYwc4aFw6SkMoxU3e6AJuFz4ULEDG9RbwscPqksczNSHb9ZJg9h1/Zzf7xZ NJHlDbfBq0Tuig786P0uCsa792ZBtFYT5eL78q0LcqVSh9/QSAJJBnJpkYvnXPzuav sbL5vHGBseTrHXVpGhoXOTXESXMN5QDQgbsTEvZMmV5C/XuylrdXA3zgdJ93/czrYn AJKVsEPJDHavw== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Mathias Nyman , Greg Kroah-Hartman , Sasha Levin Subject: [PATCH 5.10 33/73] xhci: remove extra loop in interrupt context Date: Wed, 13 Mar 2024 12:46:00 -0400 Message-ID: <20240313164640.616049-34-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Mathias Nyman [ Upstream commit 55f6153d8cc8eff0852d108f80087fdf41dc2169 ] When finishing a TD we walk the endpoint dequeue trb pointer until it matches the last TRB of the TD. TDs can contain over 100 TRBs, meaning we call a function 100 times, do a few comparisons and increase a couple values for each of these calls, all in interrupt context. This can all be avoided by adding a pointer to the last TRB segment, and a number of TRBs in the TD. So instead of walking through each TRB just set the new dequeue segment, pointer, and number of free TRBs directly. Getting rid of the while loop also reduces the risk of getting stuck in a infinite loop in the interrupt handler. Loop relied on valid matching dequeue and last_trb values to break. Signed-off-by: Mathias Nyman Link: https://lore.kernel.org/r/20210129130044.206855-12-mathias.nyman@linu= x.intel.com Signed-off-by: Greg Kroah-Hartman Stable-dep-of: 5372c65e1311 ("xhci: process isoc TD properly when there was= a transaction error mid TD.") Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- drivers/usb/host/xhci-ring.c | 21 ++++++++++++++------- drivers/usb/host/xhci.h | 2 ++ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index eb70f07e3623a..b814dc07116da 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c @@ -2099,8 +2099,9 @@ static int finish_td(struct xhci_hcd *xhci, struct xh= ci_td *td, EP_HARD_RESET); } else { /* Update ring dequeue pointer */ - while (ep_ring->dequeue !=3D td->last_trb) - inc_deq(xhci, ep_ring); + ep_ring->dequeue =3D td->last_trb; + ep_ring->deq_seg =3D td->last_trb_seg; + ep_ring->num_trbs_free +=3D td->num_trbs - 1; inc_deq(xhci, ep_ring); } =20 @@ -2321,8 +2322,9 @@ static int skip_isoc_td(struct xhci_hcd *xhci, struct= xhci_td *td, frame->actual_length =3D 0; =20 /* Update ring dequeue pointer */ - while (ep->ring->dequeue !=3D td->last_trb) - inc_deq(xhci, ep->ring); + ep->ring->dequeue =3D td->last_trb; + ep->ring->deq_seg =3D td->last_trb_seg; + ep->ring->num_trbs_free +=3D td->num_trbs - 1; inc_deq(xhci, ep->ring); =20 return xhci_td_cleanup(xhci, td, ep->ring, status); @@ -3487,7 +3489,7 @@ int xhci_queue_bulk_tx(struct xhci_hcd *xhci, gfp_t m= em_flags, field |=3D TRB_IOC; more_trbs_coming =3D false; td->last_trb =3D ring->enqueue; - + td->last_trb_seg =3D ring->enq_seg; if (xhci_urb_suitable_for_idt(urb)) { memcpy(&send_addr, urb->transfer_buffer, trb_buff_len); @@ -3513,7 +3515,7 @@ int xhci_queue_bulk_tx(struct xhci_hcd *xhci, gfp_t m= em_flags, upper_32_bits(send_addr), length_field, field); - + td->num_trbs++; addr +=3D trb_buff_len; sent_len =3D trb_buff_len; =20 @@ -3537,8 +3539,10 @@ int xhci_queue_bulk_tx(struct xhci_hcd *xhci, gfp_t = mem_flags, ep_index, urb->stream_id, 1, urb, 1, mem_flags); urb_priv->td[1].last_trb =3D ring->enqueue; + urb_priv->td[1].last_trb_seg =3D ring->enq_seg; field =3D TRB_TYPE(TRB_NORMAL) | ring->cycle_state | TRB_IOC; queue_trb(xhci, ring, 0, 0, 0, TRB_INTR_TARGET(0), field); + urb_priv->td[1].num_trbs++; } =20 check_trb_math(urb, enqd_len); @@ -3589,6 +3593,7 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *xhci, gfp_t m= em_flags, =20 urb_priv =3D urb->hcpriv; td =3D &urb_priv->td[0]; + td->num_trbs =3D num_trbs; =20 /* * Don't give the first TRB to the hardware (by toggling the cycle bit) @@ -3661,6 +3666,7 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *xhci, gfp_t m= em_flags, =20 /* Save the DMA address of the last TRB in the TD */ td->last_trb =3D ep_ring->enqueue; + td->last_trb_seg =3D ep_ring->enq_seg; =20 /* Queue status TRB - see Table 7 and sections 4.11.2.2 and 6.4.1.2.3 */ /* If the device sent data, the status stage is an OUT transfer */ @@ -3905,7 +3911,7 @@ static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, = gfp_t mem_flags, goto cleanup; } td =3D &urb_priv->td[i]; - + td->num_trbs =3D trbs_per_td; /* use SIA as default, if frame id is used overwrite it */ sia_frame_id =3D TRB_SIA; if (!(urb->transfer_flags & URB_ISO_ASAP) && @@ -3948,6 +3954,7 @@ static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, = gfp_t mem_flags, } else { more_trbs_coming =3D false; td->last_trb =3D ep_ring->enqueue; + td->last_trb_seg =3D ep_ring->enq_seg; field |=3D TRB_IOC; if (trb_block_event_intr(xhci, num_tds, i)) field |=3D TRB_BEI; diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h index bb3c362a194b2..85ab213c7940a 100644 --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h @@ -1550,9 +1550,11 @@ struct xhci_td { struct xhci_segment *start_seg; union xhci_trb *first_trb; union xhci_trb *last_trb; + struct xhci_segment *last_trb_seg; struct xhci_segment *bounce_seg; /* actual_length of the URB has already been set */ bool urb_length_set; + unsigned int num_trbs; }; =20 /* xHCI command default timeout value */ --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 02534157E8D; Wed, 13 Mar 2024 16:47:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348440; cv=none; b=EduJa9Vo1ymUFlcCmRWuXBOwDQqPDjeexJfjCT42rtMugyQj/GD4kxIepSJ4tj8LBZxJVbd+d5CB/Ep97oAqRs18PFulfKsVkzDWmMC087bnn2H3NXk9zxdWstgaYHZgyYaToFDVAWHEdkMtpaqVQMCV5rKEuyMmEbrY8Kdamls= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348440; c=relaxed/simple; bh=aZXsDham/VRQJbUEVliVBpNZ6KlZ1VS3RCIQK+Epswc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=MivJw+OJXuEHeNfsfNXVlGaGeskPBWR4YkRaMhnLBvFVtKRmwaI6yKnxAPvoTygusC7zo8PpSBKHtbtLCrEDLHZUhz4hoAa9yMVTu8yBS+d22QazfqGCCQ0I5pVrlWA0tcQCd1+DZbSkPZjas35/SxN+95Kma6KEQaL5QNFgPQs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=oFO8i0T3; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="oFO8i0T3" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1A18FC433C7; Wed, 13 Mar 2024 16:47:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348439; bh=aZXsDham/VRQJbUEVliVBpNZ6KlZ1VS3RCIQK+Epswc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=oFO8i0T3R+pBLREOmE+hei4N+BT+ZlwEA5KpcBGDH4fU4SeX3WAjoVXA2aMrs2iP4 9LQYa1ahQklvcDc1v6tYZ6JD/8hhD12r49nU9AnUSkFH4Zm/qOHVUcYpfzwQ3rHCIc LmW/CHSX6cRdfLNMkZeLrHWpTbpi0Oz19H16dMr/OLPA9J5ey6o3CxVZ6TU2D1gRVX rrVCenSyjyRKRQP78OHgKHJkAOEcAYgZnL3PHOrIZy+eAwjTgUVPvU7R7LEHJGamVe qlTnIZRhhUzRhnYHTzR6Inpns17oj+pvy+QW+sqDI1x/Q3QrOh8cRCWjMvyWqzIRRY 5uUSbZ3Kqk0yw== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Mathias Nyman , Greg Kroah-Hartman , Sasha Levin Subject: [PATCH 5.10 34/73] xhci: prevent double-fetch of transfer and transfer event TRBs Date: Wed, 13 Mar 2024 12:46:01 -0400 Message-ID: <20240313164640.616049-35-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Mathias Nyman [ Upstream commit e9fcb07704fcef6fa6d0333fd2b3a62442eaf45b ] The same values are parsed several times from transfer and event TRBs by different functions in the same call path, all while processing one transfer event. As the TRBs are in DMA memory and can be accessed by the xHC host we want to avoid this to prevent double-fetch issues. To resolve this pass the already parsed values to the different functions in the path of parsing a transfer event Signed-off-by: Mathias Nyman Link: https://lore.kernel.org/r/20210406070208.3406266-5-mathias.nyman@linu= x.intel.com Signed-off-by: Greg Kroah-Hartman Stable-dep-of: 5372c65e1311 ("xhci: process isoc TD properly when there was= a transaction error mid TD.") Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- drivers/usb/host/xhci-ring.c | 42 ++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index b814dc07116da..62d92da7016e7 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c @@ -2059,16 +2059,13 @@ int xhci_is_vendor_info_code(struct xhci_hcd *xhci,= unsigned int trb_comp_code) return 0; } =20 -static int finish_td(struct xhci_hcd *xhci, struct xhci_td *td, - struct xhci_transfer_event *event, struct xhci_virt_ep *ep) +static int finish_td(struct xhci_hcd *xhci, struct xhci_virt_ep *ep, + struct xhci_ring *ep_ring, struct xhci_td *td, + u32 trb_comp_code) { struct xhci_ep_ctx *ep_ctx; - struct xhci_ring *ep_ring; - u32 trb_comp_code; =20 - ep_ring =3D xhci_dma_to_transfer_ring(ep, le64_to_cpu(event->buffer)); ep_ctx =3D xhci_get_ep_ctx(xhci, ep->vdev->out_ctx, ep->ep_index); - trb_comp_code =3D GET_COMP_CODE(le32_to_cpu(event->transfer_len)); =20 if (trb_comp_code =3D=3D COMP_STOPPED_LENGTH_INVALID || trb_comp_code =3D=3D COMP_STOPPED || @@ -2126,9 +2123,9 @@ static int sum_trb_lengths(struct xhci_hcd *xhci, str= uct xhci_ring *ring, /* * Process control tds, update urb status and actual_length. */ -static int process_ctrl_td(struct xhci_hcd *xhci, struct xhci_td *td, - union xhci_trb *ep_trb, struct xhci_transfer_event *event, - struct xhci_virt_ep *ep) +static int process_ctrl_td(struct xhci_hcd *xhci, struct xhci_virt_ep *ep, + struct xhci_ring *ep_ring, struct xhci_td *td, + union xhci_trb *ep_trb, struct xhci_transfer_event *event) { struct xhci_ep_ctx *ep_ctx; u32 trb_comp_code; @@ -2216,15 +2213,15 @@ static int process_ctrl_td(struct xhci_hcd *xhci, s= truct xhci_td *td, td->urb->actual_length =3D requested; =20 finish_td: - return finish_td(xhci, td, event, ep); + return finish_td(xhci, ep, ep_ring, td, trb_comp_code); } =20 /* * Process isochronous tds, update urb packet status and actual_length. */ -static int process_isoc_td(struct xhci_hcd *xhci, struct xhci_td *td, - union xhci_trb *ep_trb, struct xhci_transfer_event *event, - struct xhci_virt_ep *ep) +static int process_isoc_td(struct xhci_hcd *xhci, struct xhci_virt_ep *ep, + struct xhci_ring *ep_ring, struct xhci_td *td, + union xhci_trb *ep_trb, struct xhci_transfer_event *event) { struct urb_priv *urb_priv; int idx; @@ -2301,7 +2298,7 @@ static int process_isoc_td(struct xhci_hcd *xhci, str= uct xhci_td *td, =20 td->urb->actual_length +=3D frame->actual_length; =20 - return finish_td(xhci, td, event, ep); + return finish_td(xhci, ep, ep_ring, td, trb_comp_code); } =20 static int skip_isoc_td(struct xhci_hcd *xhci, struct xhci_td *td, @@ -2333,17 +2330,15 @@ static int skip_isoc_td(struct xhci_hcd *xhci, stru= ct xhci_td *td, /* * Process bulk and interrupt tds, update urb status and actual_length. */ -static int process_bulk_intr_td(struct xhci_hcd *xhci, struct xhci_td *td, - union xhci_trb *ep_trb, struct xhci_transfer_event *event, - struct xhci_virt_ep *ep) +static int process_bulk_intr_td(struct xhci_hcd *xhci, struct xhci_virt_ep= *ep, + struct xhci_ring *ep_ring, struct xhci_td *td, + union xhci_trb *ep_trb, struct xhci_transfer_event *event) { struct xhci_slot_ctx *slot_ctx; - struct xhci_ring *ep_ring; u32 trb_comp_code; u32 remaining, requested, ep_trb_len; =20 slot_ctx =3D xhci_get_slot_ctx(xhci, ep->vdev->out_ctx); - ep_ring =3D xhci_dma_to_transfer_ring(ep, le64_to_cpu(event->buffer)); trb_comp_code =3D GET_COMP_CODE(le32_to_cpu(event->transfer_len)); remaining =3D EVENT_TRB_LEN(le32_to_cpu(event->transfer_len)); ep_trb_len =3D TRB_LEN(le32_to_cpu(ep_trb->generic.field[2])); @@ -2403,7 +2398,8 @@ static int process_bulk_intr_td(struct xhci_hcd *xhci= , struct xhci_td *td, remaining); td->urb->actual_length =3D 0; } - return finish_td(xhci, td, event, ep); + + return finish_td(xhci, ep, ep_ring, td, trb_comp_code); } =20 /* @@ -2754,11 +2750,11 @@ static int handle_tx_event(struct xhci_hcd *xhci, =20 /* update the urb's actual_length and give back to the core */ if (usb_endpoint_xfer_control(&td->urb->ep->desc)) - process_ctrl_td(xhci, td, ep_trb, event, ep); + process_ctrl_td(xhci, ep, ep_ring, td, ep_trb, event); else if (usb_endpoint_xfer_isoc(&td->urb->ep->desc)) - process_isoc_td(xhci, td, ep_trb, event, ep); + process_isoc_td(xhci, ep, ep_ring, td, ep_trb, event); else - process_bulk_intr_td(xhci, td, ep_trb, event, ep); + process_bulk_intr_td(xhci, ep, ep_ring, td, ep_trb, event); cleanup: handling_skipped_tds =3D ep->skip && trb_comp_code !=3D COMP_MISSED_SERVICE_ERROR && --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 860861586D5; Wed, 13 Mar 2024 16:47:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348441; cv=none; b=LJ/YKBd+Au/zFJcnQPCKsOqNWJrzXKgubKux0DrVF5WZEmaGhQPipZmIbu6dB780lZVfi0M8JJSnRfkeKh15n+mKzQ4Ayv3CxIqdqhlkH3dro0GMxKoQSZzN/+bY7/uOtY2wKFKVO3NsgqAiX/+XYQ3yb93S5CMCR2HKmYDHKds= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348441; c=relaxed/simple; bh=YA9Ft6bl28bLy63KaXUuZC8DvGOBxcJ5mO6uDn/RKqw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=gv1l3qN+hzL0xfnGEslxadykC66kJIhFscJqScFK6Xoay+/UWo9cj98YYvx5vXQBhYM/BO9GYD4axIOOukYhnYVVyXnAlRPFTZ1JBslRjyXiuZYFCTu4wvv4/BwV0rJCNE5aeFyWC/hqojObXk5sOKALnf6JP7nVBzsEbDnnUEk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=oqSsMawi; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="oqSsMawi" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 317BFC43390; Wed, 13 Mar 2024 16:47:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348441; bh=YA9Ft6bl28bLy63KaXUuZC8DvGOBxcJ5mO6uDn/RKqw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=oqSsMawipQUZERsQnRP8AMvgLSmOnR9HuARb+E6/c6sNUsg+xAKTGma2qgcEhknDv r9ZvMRIIA7/COxMlWff9PnSn3NfpgXdY4UbooBv9lKTuJP/1tMbmMpC3HPa06mApP8 VZ1ko0DIl48Bt4suMkORqqnAvVcNaq9bIhbm0bogyefeycyHzVmS8RMcAbkuGCez+I +XZw40i/SgS3xGaeWCBjaHeuquQP5mNd4wKylKYlyTxef74KNvLB0L0LBWiLQkBM6k bXeEZaXOWSDa4k99+2LFO5Y6VdcyEsQrE6/kY3A9hpdk4jimHhBVfuLpPcmZftq3PV Pc7Ql/5l1zn9g== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Mathias Nyman , =?UTF-8?q?Micha=C5=82=20Pecio?= , Greg Kroah-Hartman , Sasha Levin Subject: [PATCH 5.10 35/73] xhci: process isoc TD properly when there was a transaction error mid TD. Date: Wed, 13 Mar 2024 12:46:02 -0400 Message-ID: <20240313164640.616049-36-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable From: Mathias Nyman [ Upstream commit 5372c65e1311a16351ef03dd096ff576e6477674 ] The last TRB of a isoc TD might not trigger an event if there was an error event for a TRB mid TD. This is seen on a NEC Corporation uPD720200 USB 3.0 Host After an error mid a multi-TRB TD the xHC should according to xhci 4.9.1 generate events for passed TRBs with IOC flag set if it proceeds to the next TD. This event is either a copy of the original error, or a "success" transfer event. If that event is missing then the driver and xHC host get out of sync as the driver is still expecting a transfer event for that first TD, while xHC host is already sending events for the next TD in the list. This leads to "Transfer event TRB DMA ptr not part of current TD" messages. As a solution we tag the isoc TDs that get error events mid TD. If an event doesn't match the first TD, then check if the tag is set, and event points to the next TD. In that case give back the fist TD and process the next TD normally Make sure TD status and transferred length stay valid in both cases with and without final TD completion event. Reported-by: Micha=C5=82 Pecio Closes: https://lore.kernel.org/linux-usb/20240112235205.1259f60c@foxbook/ Tested-by: Micha=C5=82 Pecio Cc: stable@vger.kernel.org Signed-off-by: Mathias Nyman Link: https://lore.kernel.org/r/20240125152737.2983959-4-mathias.nyman@linu= x.intel.com Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- drivers/usb/host/xhci-ring.c | 74 +++++++++++++++++++++++++++++------- drivers/usb/host/xhci.h | 1 + 2 files changed, 61 insertions(+), 14 deletions(-) diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index 62d92da7016e7..883cf477a70b9 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c @@ -2244,6 +2244,9 @@ static int process_isoc_td(struct xhci_hcd *xhci, str= uct xhci_virt_ep *ep, /* handle completion code */ switch (trb_comp_code) { case COMP_SUCCESS: + /* Don't overwrite status if TD had an error, see xHCI 4.9.1 */ + if (td->error_mid_td) + break; if (remaining) { frame->status =3D short_framestatus; if (xhci->quirks & XHCI_TRUST_TX_LENGTH) @@ -2269,8 +2272,9 @@ static int process_isoc_td(struct xhci_hcd *xhci, str= uct xhci_virt_ep *ep, break; case COMP_USB_TRANSACTION_ERROR: frame->status =3D -EPROTO; + sum_trbs_for_length =3D true; if (ep_trb !=3D td->last_trb) - return 0; + td->error_mid_td =3D true; break; case COMP_STOPPED: sum_trbs_for_length =3D true; @@ -2290,6 +2294,9 @@ static int process_isoc_td(struct xhci_hcd *xhci, str= uct xhci_virt_ep *ep, break; } =20 + if (td->urb_length_set) + goto finish_td; + if (sum_trbs_for_length) frame->actual_length =3D sum_trb_lengths(xhci, ep->ring, ep_trb) + ep_trb_len - remaining; @@ -2298,6 +2305,14 @@ static int process_isoc_td(struct xhci_hcd *xhci, st= ruct xhci_virt_ep *ep, =20 td->urb->actual_length +=3D frame->actual_length; =20 +finish_td: + /* Don't give back TD yet if we encountered an error mid TD */ + if (td->error_mid_td && ep_trb !=3D td->last_trb) { + xhci_dbg(xhci, "Error mid isoc TD, wait for final completion event\n"); + td->urb_length_set =3D true; + return 0; + } + return finish_td(xhci, ep, ep_ring, td, trb_comp_code); } =20 @@ -2684,17 +2699,51 @@ static int handle_tx_event(struct xhci_hcd *xhci, } =20 if (!ep_seg) { - if (!ep->skip || - !usb_endpoint_xfer_isoc(&td->urb->ep->desc)) { - /* Some host controllers give a spurious - * successful event after a short transfer. - * Ignore it. - */ - if ((xhci->quirks & XHCI_SPURIOUS_SUCCESS) && - ep_ring->last_td_was_short) { - ep_ring->last_td_was_short =3D false; - goto cleanup; + + if (ep->skip && usb_endpoint_xfer_isoc(&td->urb->ep->desc)) { + skip_isoc_td(xhci, td, ep, status); + goto cleanup; + } + + /* + * Some hosts give a spurious success event after a short + * transfer. Ignore it. + */ + if ((xhci->quirks & XHCI_SPURIOUS_SUCCESS) && + ep_ring->last_td_was_short) { + ep_ring->last_td_was_short =3D false; + goto cleanup; + } + + /* + * xhci 4.10.2 states isoc endpoints should continue + * processing the next TD if there was an error mid TD. + * So host like NEC don't generate an event for the last + * isoc TRB even if the IOC flag is set. + * xhci 4.9.1 states that if there are errors in mult-TRB + * TDs xHC should generate an error for that TRB, and if xHC + * proceeds to the next TD it should genete an event for + * any TRB with IOC flag on the way. Other host follow this. + * So this event might be for the next TD. + */ + if (td->error_mid_td && + !list_is_last(&td->td_list, &ep_ring->td_list)) { + struct xhci_td *td_next =3D list_next_entry(td, td_list); + + ep_seg =3D trb_in_td(xhci, td_next->start_seg, td_next->first_trb, + td_next->last_trb, ep_trb_dma, false); + if (ep_seg) { + /* give back previous TD, start handling new */ + xhci_dbg(xhci, "Missing TD completion event after mid TD error\n"); + ep_ring->dequeue =3D td->last_trb; + ep_ring->deq_seg =3D td->last_trb_seg; + inc_deq(xhci, ep_ring); + xhci_td_cleanup(xhci, td, ep_ring, td->status); + td =3D td_next; } + } + + if (!ep_seg) { /* HC is busted, give up! */ xhci_err(xhci, "ERROR Transfer event TRB DMA ptr not " @@ -2706,9 +2755,6 @@ static int handle_tx_event(struct xhci_hcd *xhci, ep_trb_dma, true); return -ESHUTDOWN; } - - skip_isoc_td(xhci, td, ep, status); - goto cleanup; } if (trb_comp_code =3D=3D COMP_SHORT_PACKET) ep_ring->last_td_was_short =3D true; diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h index 85ab213c7940a..5a8443f6ed703 100644 --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h @@ -1554,6 +1554,7 @@ struct xhci_td { struct xhci_segment *bounce_seg; /* actual_length of the URB has already been set */ bool urb_length_set; + bool error_mid_td; unsigned int num_trbs; }; =20 --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8D8321586F4; Wed, 13 Mar 2024 16:47:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348442; cv=none; b=sXp+N8uzDurLfAjJsvMds6gOfhAVl7Ltckq6dlCj7BEmT/CwIV6HGAU8ArwTBoL3WUZCKAZk86HclDP+1wMxxnsJgA3XIDPh4G9SpfB0+j6ZDjcFFFUBE5104yQ2Dr73Q+2iRmKoRqfG2uNENKkkNOvaPyuAQwKvWtQW0cugaQI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348442; c=relaxed/simple; bh=BIM2AE8RAX0nv489/q+jkksa4sAawMGwrIiGDzfIUqE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=O7/YuRPYfoHj+vDKcHxKMW8HB3Z491nnO/If/XGKCQWje8pOVw+/GfgGkOlAz9UPWcQdGYqwLjKQHzDEiGlkC6uHLqLevwL/Q5Qom74mvMVDk/a7aI6wgRYuNwpHAvawFj7n8A9c211aK0lY2nRepvqJL3RAfwhJ4OjKryPW95E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=EDe0zf+z; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="EDe0zf+z" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5A148C43394; Wed, 13 Mar 2024 16:47:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348442; bh=BIM2AE8RAX0nv489/q+jkksa4sAawMGwrIiGDzfIUqE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=EDe0zf+zyBQTOELTbSqlk4czSITlKYbP8Js+jZI+Jo+/j0tVv0//7J0hhT3EpzP4w SxUmckpfoxNTssW0vLzUt1dknNxyXecZ0p/y6fmiwehuxKJ8xKmzIDBUf6N1PPVkK/ wuCl2U/XlKaTkDLQIZTpxidKsrtoewc7zBcHYz19oXIhVyw2UKNCTRteN9OvSWiM1c zrYnmzZQ2BkZ8XnyxUPSPvccmWQfYfqIejw8iCK2velI1IyivjTwLwBMdxsXXIKMBq yX9StxgjMYz2AX6pqpko5q6U3MporZe8moErwURxmamo7gnfpDAgcKzGemlwdUI5gZ IxZ1jzGlsqtAA== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Michal Pecio , Mathias Nyman , Greg Kroah-Hartman , Sasha Levin Subject: [PATCH 5.10 36/73] xhci: handle isoc Babble and Buffer Overrun events properly Date: Wed, 13 Mar 2024 12:46:03 -0400 Message-ID: <20240313164640.616049-37-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Michal Pecio [ Upstream commit 7c4650ded49e5b88929ecbbb631efb8b0838e811 ] xHCI 4.9 explicitly forbids assuming that the xHC has released its ownership of a multi-TRB TD when it reports an error on one of the early TRBs. Yet the driver makes such assumption and releases the TD, allowing the remaining TRBs to be freed or overwritten by new TDs. The xHC should also report completion of the final TRB due to its IOC flag being set by us, regardless of prior errors. This event cannot be recognized if the TD has already been freed earlier, resulting in "Transfer event TRB DMA ptr not part of current TD" error message. Fix this by reusing the logic for processing isoc Transaction Errors. This also handles hosts which fail to report the final completion. Fix transfer length reporting on Babble errors. They may be caused by device malfunction, no guarantee that the buffer has been filled. Signed-off-by: Michal Pecio Cc: stable@vger.kernel.org Signed-off-by: Mathias Nyman Link: https://lore.kernel.org/r/20240125152737.2983959-5-mathias.nyman@linu= x.intel.com Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- drivers/usb/host/xhci-ring.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index 883cf477a70b9..4fa387e447f08 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c @@ -2262,9 +2262,13 @@ static int process_isoc_td(struct xhci_hcd *xhci, st= ruct xhci_virt_ep *ep, case COMP_BANDWIDTH_OVERRUN_ERROR: frame->status =3D -ECOMM; break; - case COMP_ISOCH_BUFFER_OVERRUN: case COMP_BABBLE_DETECTED_ERROR: + sum_trbs_for_length =3D true; + fallthrough; + case COMP_ISOCH_BUFFER_OVERRUN: frame->status =3D -EOVERFLOW; + if (ep_trb !=3D td->last_trb) + td->error_mid_td =3D true; break; case COMP_INCOMPATIBLE_DEVICE_ERROR: case COMP_STALL_ERROR: --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9530A158D75; Wed, 13 Mar 2024 16:47:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348443; cv=none; b=CWdDJkHwqdUlb+P+/576OX7ithJA7w96lepquigPLzeO3Gp/Se+yCWa6+hSYZBZs4vhmIee7eNOhEoI+ALYXUWe3FitWMaDP+FxtU4SoN7DUv0FLcWgT1xpvJT6jVm1hcnar/TgTxopx0xfolmw4zzLAbGM+rrELm7zoEs/Y7tg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348443; c=relaxed/simple; bh=EwYFc6u/vRmEQVBhKndW0cFn92ioVA9ZTpiDm23xcUs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=AOeXlBgnHaeoXDZ0CedvioxXRu1cDBVKzweTXrmwbUui3ZwjpQN7am+WeTDJJKkun1ueQx5fLKRS+NnQfJTaeKKu1Mn3bqvf6chfklAAHBjpL5CluutaO9Bv4IATzVlr1kvq0LDw3fbO8Y4a8fitUKGSzPz3OqM+IljNw8Qq1dI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=P4ahr/5C; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="P4ahr/5C" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7251BC433C7; Wed, 13 Mar 2024 16:47:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348443; bh=EwYFc6u/vRmEQVBhKndW0cFn92ioVA9ZTpiDm23xcUs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=P4ahr/5CoXYxhBzevLiigzC95ArZnJEWrxE960QIfn1E8oulRCDfdat1oga0AiOcB o7APPzCkmgaggf8aSpA0HrwDMnO23UbeppxY82MSz2CjcMQWA9HZqXFCNdHGd3SM80 nAgedQ7Sq8fOt/N3ps6xpyRLMeXLYWiqtD8gEZ2ujaxEdGIGQBbw+MCCy1zzFPuma9 Wiov/YAZB+dauO6irkKditKOMfMNaauEaKFewqc0YQP0ZDfn3wGUGgENHRJXK3voea ybJygIxZy10jKgfwgydeAimDWXT6gBetMfUTu0Hw0TneA/41I7YrABYq26dhmU14US R2azWwxZhyFWA== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Andy Shevchenko , Greg Kroah-Hartman , Sasha Levin Subject: [PATCH 5.10 37/73] serial: max310x: Use devm_clk_get_optional() to get the input clock Date: Wed, 13 Mar 2024 12:46:04 -0400 Message-ID: <20240313164640.616049-38-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Andy Shevchenko [ Upstream commit 974e454d6f96da0c0ab1b4115b92587dd9406f6a ] Simplify the code which fetches the input clock by using devm_clk_get_optional(). If no input clock is present devm_clk_get_optional() will return NULL instead of an error which matches the behavior of the old code. Signed-off-by: Andy Shevchenko Link: https://lore.kernel.org/r/20201007084635.594991-2-andy.shevchenko@gma= il.com Signed-off-by: Greg Kroah-Hartman Stable-dep-of: 8afa6c6decea ("serial: max310x: fail probe if clock crystal = is unstable") Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- drivers/tty/serial/max310x.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/drivers/tty/serial/max310x.c b/drivers/tty/serial/max310x.c index 14537878f9855..8bf3c5ab59431 100644 --- a/drivers/tty/serial/max310x.c +++ b/drivers/tty/serial/max310x.c @@ -1265,7 +1265,6 @@ static int max310x_probe(struct device *dev, struct m= ax310x_devtype *devtype, struct regmap *regmap, int irq) { int i, ret, fmin, fmax, freq, uartclk; - struct clk *clk_osc, *clk_xtal; struct max310x_port *s; bool xtal =3D false; =20 @@ -1279,23 +1278,24 @@ static int max310x_probe(struct device *dev, struct= max310x_devtype *devtype, return -ENOMEM; } =20 - clk_osc =3D devm_clk_get(dev, "osc"); - clk_xtal =3D devm_clk_get(dev, "xtal"); - if (!IS_ERR(clk_osc)) { - s->clk =3D clk_osc; + s->clk =3D devm_clk_get_optional(dev, "osc"); + if (IS_ERR(s->clk)) + return PTR_ERR(s->clk); + if (s->clk) { fmin =3D 500000; fmax =3D 35000000; - } else if (!IS_ERR(clk_xtal)) { - s->clk =3D clk_xtal; - fmin =3D 1000000; - fmax =3D 4000000; - xtal =3D true; - } else if (PTR_ERR(clk_osc) =3D=3D -EPROBE_DEFER || - PTR_ERR(clk_xtal) =3D=3D -EPROBE_DEFER) { - return -EPROBE_DEFER; } else { - dev_err(dev, "Cannot get clock\n"); - return -EINVAL; + s->clk =3D devm_clk_get_optional(dev, "xtal"); + if (IS_ERR(s->clk)) + return PTR_ERR(s->clk); + if (s->clk) { + fmin =3D 1000000; + fmax =3D 4000000; + xtal =3D true; + } else { + dev_err(dev, "Cannot get clock\n"); + return -EINVAL; + } } =20 ret =3D clk_prepare_enable(s->clk); --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 42A91158D93; Wed, 13 Mar 2024 16:47:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348444; cv=none; b=C2xVgSGMAtabzdVIzctQ1Rrsz/4aNJF3JHKSFnDqG0grFPAC61m5BPqGFZdtQIdpmNDb83cU0WOiz2Jb1fIZhF1lbwehQbBAc5Zq+iI3Bcl5T4akOxqrJEmmfhk50DCMApHIuLMAOFA4jXzHtK1nMrqiBzIIOFFuwfsAJ5rbJdU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348444; c=relaxed/simple; bh=5F8DJBRhvFfkT6zRKT0jjF22bUNX95SUh7FnLyf5P6c=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gPzyJD1fwWXd6LjGxJAALVU/gkco86AU81wweOGr26po1H2B+6226rSWkUCurDHRhUjseSDjqFuk1UY/PnIqPCffI2uPNb3kflJhP/qv+PhXeybQz2aq8WRJtgsakp0coZx0dMv6jUKX/+a5iiTliSNq4UNqyjhJU/4jpFtPVEQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=uCfK00eU; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="uCfK00eU" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 73969C433F1; Wed, 13 Mar 2024 16:47:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348444; bh=5F8DJBRhvFfkT6zRKT0jjF22bUNX95SUh7FnLyf5P6c=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=uCfK00eUGrgfqM2yuJsMOfa3Y/TUPGVcfkU+yt3uAi8ElFAeFpPlujp91Qf7Oy1T7 gfRc/ktNrKxmsoexk2J0mFtarx41zIAlxr0G1b4DTJj7A6g45ZG7X16Y7wns83fK1K f54NvNDZv+vhgBOxBBqake8esHV2GZhmnShUWZLoe78tP2iavgznBi227W0eHr11pp K4NvqOeQNa+aGFA1wzCY5e+zjTA+S8owNQJirtF6c8ZDnGJHHcCzgfe+n6P+46T03u cAoy7g5D0U8M7l8jxJr7vZMW937LQwqZGb4f5FaRWwDUh2r4fb8C5kcXVb4xN1MOuq BjtLUM1gkh67Q== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Andy Shevchenko , Greg Kroah-Hartman , Sasha Levin Subject: [PATCH 5.10 38/73] serial: max310x: Try to get crystal clock rate from property Date: Wed, 13 Mar 2024 12:46:05 -0400 Message-ID: <20240313164640.616049-39-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Andy Shevchenko [ Upstream commit d4d6f03c4fb3a91dadfe147b47edd40e4d7e4d36 ] In some configurations, mainly ACPI-based, the clock frequency of the device is supplied by very well established 'clock-frequency' property. Hence, try to get it from the property at last if no other providers are available. Signed-off-by: Andy Shevchenko Link: https://lore.kernel.org/r/20210517172930.83353-1-andriy.shevchenko@li= nux.intel.com Signed-off-by: Greg Kroah-Hartman Stable-dep-of: 8afa6c6decea ("serial: max310x: fail probe if clock crystal = is unstable") Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- drivers/tty/serial/max310x.c | 40 +++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/drivers/tty/serial/max310x.c b/drivers/tty/serial/max310x.c index 8bf3c5ab59431..0e0f778d75cd4 100644 --- a/drivers/tty/serial/max310x.c +++ b/drivers/tty/serial/max310x.c @@ -556,7 +556,7 @@ static int max310x_update_best_err(unsigned long f, lon= g *besterr) return 1; } =20 -static int max310x_set_ref_clk(struct device *dev, struct max310x_port *s, +static u32 max310x_set_ref_clk(struct device *dev, struct max310x_port *s, unsigned long freq, bool xtal) { unsigned int div, clksrc, pllcfg =3D 0; @@ -629,7 +629,7 @@ static int max310x_set_ref_clk(struct device *dev, stru= ct max310x_port *s, dev_warn(dev, "clock is not stable yet\n"); } =20 - return (int)bestfreq; + return bestfreq; } =20 static void max310x_batch_write(struct uart_port *port, u8 *txbuf, unsigne= d int len) @@ -1264,9 +1264,10 @@ static int max310x_gpio_set_config(struct gpio_chip = *chip, unsigned int offset, static int max310x_probe(struct device *dev, struct max310x_devtype *devty= pe, struct regmap *regmap, int irq) { - int i, ret, fmin, fmax, freq, uartclk; + int i, ret, fmin, fmax, freq; struct max310x_port *s; - bool xtal =3D false; + u32 uartclk =3D 0; + bool xtal; =20 if (IS_ERR(regmap)) return PTR_ERR(regmap); @@ -1278,24 +1279,20 @@ static int max310x_probe(struct device *dev, struct= max310x_devtype *devtype, return -ENOMEM; } =20 + /* Always ask for fixed clock rate from a property. */ + device_property_read_u32(dev, "clock-frequency", &uartclk); + s->clk =3D devm_clk_get_optional(dev, "osc"); if (IS_ERR(s->clk)) return PTR_ERR(s->clk); if (s->clk) { - fmin =3D 500000; - fmax =3D 35000000; + xtal =3D false; } else { s->clk =3D devm_clk_get_optional(dev, "xtal"); if (IS_ERR(s->clk)) return PTR_ERR(s->clk); - if (s->clk) { - fmin =3D 1000000; - fmax =3D 4000000; - xtal =3D true; - } else { - dev_err(dev, "Cannot get clock\n"); - return -EINVAL; - } + + xtal =3D true; } =20 ret =3D clk_prepare_enable(s->clk); @@ -1303,6 +1300,21 @@ static int max310x_probe(struct device *dev, struct = max310x_devtype *devtype, return ret; =20 freq =3D clk_get_rate(s->clk); + if (freq =3D=3D 0) + freq =3D uartclk; + if (freq =3D=3D 0) { + dev_err(dev, "Cannot get clock rate\n"); + return -EINVAL; + } + + if (xtal) { + fmin =3D 1000000; + fmax =3D 4000000; + } else { + fmin =3D 500000; + fmax =3D 35000000; + } + /* Check frequency limits */ if (freq < fmin || freq > fmax) { ret =3D -ERANGE; --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5DA5A15957E; Wed, 13 Mar 2024 16:47:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348445; cv=none; b=GeUgRdQoHx8oPxEQzHLSk5/FdkWXYkvumfsax9gU/zsfag/hmYDIsSD4tcNUKGP5zcl5GKTngYHG3DbzblMQAGZZI1Q0NOSxVGJ3cjgNhmStR1fjmrJovrh18r8tVvrLSQUIwt2d5CEqfxJFfdhAabus929RsaTDJIeNnB7d1rI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348445; c=relaxed/simple; bh=+gJvZK5uEADMDRO1Qiqp9iXZojO0nQHMf8DGFsBi2kE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=G+E0Ngvt2KYTSUNJOSvSz3LjkTcgBHqVSluDny7g+HLJ2Luaas4emUS+sgFvD6Uko3vqqdDg9vDl8e7nWCyxjD6b+6a/5ubIqX1XQflywvqf3jAAehT5hkpQIKCPtIasqbg3VESD9vzk3UIoCo5BHNyDJzdKJ3MtFv4SMyjghiA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Ce/riHKT; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Ce/riHKT" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6F53CC43399; Wed, 13 Mar 2024 16:47:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348445; bh=+gJvZK5uEADMDRO1Qiqp9iXZojO0nQHMf8DGFsBi2kE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Ce/riHKTpWXcBiIEqQCGbhixYP5AhRf1W69q6Ru12WZEofi2vixnFVE6gVuHHfhrj 5vyzFAbCsK2Os2plUW93pusofc25IlQfhRYJCs7dBI8+JX+7p2+a5mjLsiXZrpNfrT itm8bOwssN8iGkiGc03LJo95hMovCaCV6Nxd2iEymCc1CR5PZfVEn15FbpN1xo7TeO WD5OHi5SYD9aEvd67SQx22V0+ofnPRg9GsshiacgzCxIYNCx3nKpI0ZCx1TzNhZZ2T Z1PHlpckXV2MOwpRAEbMqMrzHYOXdpH0bp+ZV8ekKZmk3MHgY6Wil1W+nCPQypsOQk azhizZGBT8o4g== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Hugo Villeneuve , =?UTF-8?q?Jan=20Kundr=C3=A1t?= , Greg Kroah-Hartman , Sasha Levin Subject: [PATCH 5.10 39/73] serial: max310x: fail probe if clock crystal is unstable Date: Wed, 13 Mar 2024 12:46:06 -0400 Message-ID: <20240313164640.616049-40-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable From: Hugo Villeneuve [ Upstream commit 8afa6c6decea37e7cb473d2c60473f37f46cea35 ] A stable clock is really required in order to use this UART, so log an error message and bail out if the chip reports that the clock is not stable. Fixes: 4cf9a888fd3c ("serial: max310x: Check the clock readiness") Cc: stable@vger.kernel.org Suggested-by: Jan Kundr=C3=A1t Link: https://www.spinics.net/lists/linux-serial/msg35773.html Signed-off-by: Hugo Villeneuve Link: https://lore.kernel.org/r/20240116213001.3691629-4-hugo@hugovil.com Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- drivers/tty/serial/max310x.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/drivers/tty/serial/max310x.c b/drivers/tty/serial/max310x.c index 0e0f778d75cd4..bbf45c0626681 100644 --- a/drivers/tty/serial/max310x.c +++ b/drivers/tty/serial/max310x.c @@ -556,7 +556,7 @@ static int max310x_update_best_err(unsigned long f, lon= g *besterr) return 1; } =20 -static u32 max310x_set_ref_clk(struct device *dev, struct max310x_port *s, +static s32 max310x_set_ref_clk(struct device *dev, struct max310x_port *s, unsigned long freq, bool xtal) { unsigned int div, clksrc, pllcfg =3D 0; @@ -626,7 +626,8 @@ static u32 max310x_set_ref_clk(struct device *dev, stru= ct max310x_port *s, } while (!stable && (++try < MAX310X_XTAL_WAIT_RETRIES)); =20 if (!stable) - dev_warn(dev, "clock is not stable yet\n"); + return dev_err_probe(dev, -EAGAIN, + "clock is not stable\n"); } =20 return bestfreq; @@ -1266,7 +1267,7 @@ static int max310x_probe(struct device *dev, struct m= ax310x_devtype *devtype, { int i, ret, fmin, fmax, freq; struct max310x_port *s; - u32 uartclk =3D 0; + s32 uartclk =3D 0; bool xtal; =20 if (IS_ERR(regmap)) @@ -1350,6 +1351,11 @@ static int max310x_probe(struct device *dev, struct = max310x_devtype *devtype, } =20 uartclk =3D max310x_set_ref_clk(dev, s, freq, xtal); + if (uartclk < 0) { + ret =3D uartclk; + goto out_uart; + } + dev_dbg(dev, "Reference clock set to %i Hz\n", uartclk); =20 for (i =3D 0; i < devtype->nr; i++) { --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5A40F15A482; Wed, 13 Mar 2024 16:47:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348446; cv=none; b=Rgor2NYssGxZmgGB5htKod1fsp9hs8SppT0/ae7lBxjGH/L57yTxKWYtobrM9k4kUr6+NpwYCPMcIIMaqLj1xz6TvzihXXrdhaAjfmlb2JFVISHKq0KyxizYn4RIMlK3irR+S9MvthSLCjINph/lOJLmQzJZjroQmLeyMuq9MYo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348446; c=relaxed/simple; bh=ZVWAyljY+AhMX/8zChvX3ogQPcRmys9NtaHqrY/ZiWg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZG/jSv6kkXfDGkOsA/yEe55GZChKDBtfPUpD79SUFA7H9dhgKv9EYb3M4a2NVotj4cNB68VCh+lp8V/d7KJ+n+wK2m4h1RDzoAYK/kssCRBhto53WWlFL/4aJLmPF21nviV+CY4tEx/sL3ClN7R52uur7SATrx3ZvHBxic/fQhE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=UMmSysbq; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="UMmSysbq" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 866D9C433F1; Wed, 13 Mar 2024 16:47:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348446; bh=ZVWAyljY+AhMX/8zChvX3ogQPcRmys9NtaHqrY/ZiWg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=UMmSysbq2x8wHUoE7Hdgj2ieGF2c6qkM1keO2LK+aJVtzdUaAerSaBmSrGhT4H0zP QPAiMo5x3f0vQemsPaHk8/fGpe8afq5wZ52hyqZG+uwEutP+tt+ycYzVWXrGM+G/J1 egigXoFi3HQjN1cYCmzfRqQFYF5zO1v5BrxUMItoLEc5ZqR5d94Z54Hk8p8ADoj50r fmtgLisYyn84Jvju8wwaGpNGXv3H5LC3I2RvccIFnSQjEejWgoIH5gKlBEYXA7c20y bgMDDP7pQdYWVqHNcPROdiDc0Ct1d2SFa/AuoOb1Mg9dXkMxub2MXPzhyvwRpW9Xq0 miUC0zlImJy+w== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Andy Shevchenko , Greg Kroah-Hartman , Sasha Levin Subject: [PATCH 5.10 40/73] serial: max310x: Make use of device properties Date: Wed, 13 Mar 2024 12:46:07 -0400 Message-ID: <20240313164640.616049-41-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Andy Shevchenko [ Upstream commit c808fab604ca62cff19ee6b261211483830807aa ] Device property API allows to gather device resources from different source= s, such as ACPI. Convert the drivers to unleash the power of device property A= PI. Signed-off-by: Andy Shevchenko Link: https://lore.kernel.org/r/20201007084635.594991-1-andy.shevchenko@gma= il.com Signed-off-by: Greg Kroah-Hartman Stable-dep-of: b35f8dbbce81 ("serial: max310x: prevent infinite while() loo= p in port startup") Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- drivers/tty/serial/max310x.c | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/drivers/tty/serial/max310x.c b/drivers/tty/serial/max310x.c index bbf45c0626681..8d42c537ee5ea 100644 --- a/drivers/tty/serial/max310x.c +++ b/drivers/tty/serial/max310x.c @@ -15,8 +15,8 @@ #include #include #include -#include -#include +#include +#include #include #include #include @@ -271,7 +271,7 @@ struct max310x_one { container_of(_port, struct max310x_one, port) =20 struct max310x_port { - struct max310x_devtype *devtype; + const struct max310x_devtype *devtype; struct regmap *regmap; struct clk *clk; #ifdef CONFIG_GPIOLIB @@ -1262,7 +1262,7 @@ static int max310x_gpio_set_config(struct gpio_chip *= chip, unsigned int offset, } #endif =20 -static int max310x_probe(struct device *dev, struct max310x_devtype *devty= pe, +static int max310x_probe(struct device *dev, const struct max310x_devtype = *devtype, struct regmap *regmap, int irq) { int i, ret, fmin, fmax, freq; @@ -1488,7 +1488,7 @@ static struct regmap_config regcfg =3D { #ifdef CONFIG_SPI_MASTER static int max310x_spi_probe(struct spi_device *spi) { - struct max310x_devtype *devtype; + const struct max310x_devtype *devtype; struct regmap *regmap; int ret; =20 @@ -1500,18 +1500,9 @@ static int max310x_spi_probe(struct spi_device *spi) if (ret) return ret; =20 - if (spi->dev.of_node) { - const struct of_device_id *of_id =3D - of_match_device(max310x_dt_ids, &spi->dev); - if (!of_id) - return -ENODEV; - - devtype =3D (struct max310x_devtype *)of_id->data; - } else { - const struct spi_device_id *id_entry =3D spi_get_device_id(spi); - - devtype =3D (struct max310x_devtype *)id_entry->driver_data; - } + devtype =3D device_get_match_data(&spi->dev); + if (!devtype) + devtype =3D (struct max310x_devtype *)spi_get_device_id(spi)->driver_dat= a; =20 regcfg.max_register =3D devtype->nr * 0x20 - 1; regmap =3D devm_regmap_init_spi(spi, ®cfg); @@ -1536,7 +1527,7 @@ MODULE_DEVICE_TABLE(spi, max310x_id_table); static struct spi_driver max310x_spi_driver =3D { .driver =3D { .name =3D MAX310X_NAME, - .of_match_table =3D of_match_ptr(max310x_dt_ids), + .of_match_table =3D max310x_dt_ids, .pm =3D &max310x_pm_ops, }, .probe =3D max310x_spi_probe, --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7404915A4AA; Wed, 13 Mar 2024 16:47:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348447; cv=none; b=Egxfbdix243lDZ4i+NldIoBQVcw93aKjtzUIl5DL5Kfsv0Fya3n234R05amqAMxLG48ndSaECzBRn90LNtJJG78bC3n536rssU/fX4yNpU7FSPlaNrUx6izxQqMWQp/lQHux3/vjFv8oYIfcIluh+dP83WT6JAVoRTvLRGouwDU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348447; c=relaxed/simple; bh=KDuy0YzyLASNQ/uakw1bHnxcMSwZEnqIfhITzteukvI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=st9x3zoiUwERoiqy3QYDTypDSzvCrghnAw1kgfCv3Ad7/qRd2LB8PB5m6/bFPyfQAcBpjx3M/gIxO1UstJSny6YICRBNsYWnntubfpWvQnnbAJrL5zFWWXYkzDQ/5Kc8PrCWooyQR+izOxXZTuszXD7eLezmCJmRAlJZ+kb5JdI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=khCL9iHY; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="khCL9iHY" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 86153C43390; Wed, 13 Mar 2024 16:47:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348447; bh=KDuy0YzyLASNQ/uakw1bHnxcMSwZEnqIfhITzteukvI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=khCL9iHYbhcoHKmE2yXDsOT+z+XvHry/azNVemKbdSeaUbxRV6RrElXgHn7DNl59a i1NkCpKxZYqVtZjpXyVk9LzS8PxTqJMQZthQZNOvRijyAT8nU8xdqUFhhQ7AVGjMa7 jJrnAerJ39a0Py66pzq90jORS4d0H9CoYx/cx7MQiy3uQ+2KYceKCtfg9I1HM1HtMr zBl44uQgaNNHWWmJrR3SnFR0G3XzX3jTo75JckDdrUrD2p1T6xgNVunQ9nnjPrkXOU oL7I00d8x7eMtuq4h62uKCFssAsWt7Q11uEp4oeF7TR5QLSu11QLamhOTMZ+/uumjM y5V/05F2LyQYw== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Cosmin Tanislav , Andy Shevchenko , Greg Kroah-Hartman , Sasha Levin Subject: [PATCH 5.10 41/73] serial: max310x: use regmap methods for SPI batch operations Date: Wed, 13 Mar 2024 12:46:08 -0400 Message-ID: <20240313164640.616049-42-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Cosmin Tanislav [ Upstream commit 285e76fc049c4d32c772eea9460a7ef28a193802 ] The SPI batch read/write operations can be implemented as simple regmap raw read and write, which will also try to do a gather write just as it is done here. Use the regmap raw read and write methods. Reviewed-by: Andy Shevchenko Signed-off-by: Cosmin Tanislav Link: https://lore.kernel.org/r/20220605144659.4169853-2-demonsingur@gmail.= com Signed-off-by: Greg Kroah-Hartman Stable-dep-of: b35f8dbbce81 ("serial: max310x: prevent infinite while() loo= p in port startup") Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- drivers/tty/serial/max310x.c | 36 ++++++++---------------------------- 1 file changed, 8 insertions(+), 28 deletions(-) diff --git a/drivers/tty/serial/max310x.c b/drivers/tty/serial/max310x.c index 8d42c537ee5ea..c0fa4ad104774 100644 --- a/drivers/tty/serial/max310x.c +++ b/drivers/tty/serial/max310x.c @@ -263,8 +263,6 @@ struct max310x_one { struct work_struct md_work; struct work_struct rs_work; =20 - u8 wr_header; - u8 rd_header; u8 rx_buf[MAX310X_FIFO_SIZE]; }; #define to_max310x_port(_port) \ @@ -635,32 +633,18 @@ static s32 max310x_set_ref_clk(struct device *dev, st= ruct max310x_port *s, =20 static void max310x_batch_write(struct uart_port *port, u8 *txbuf, unsigne= d int len) { - struct max310x_one *one =3D to_max310x_port(port); - struct spi_transfer xfer[] =3D { - { - .tx_buf =3D &one->wr_header, - .len =3D sizeof(one->wr_header), - }, { - .tx_buf =3D txbuf, - .len =3D len, - } - }; - spi_sync_transfer(to_spi_device(port->dev), xfer, ARRAY_SIZE(xfer)); + struct max310x_port *s =3D dev_get_drvdata(port->dev); + u8 reg =3D port->iobase + MAX310X_THR_REG; + + regmap_raw_write(s->regmap, reg, txbuf, len); } =20 static void max310x_batch_read(struct uart_port *port, u8 *rxbuf, unsigned= int len) { - struct max310x_one *one =3D to_max310x_port(port); - struct spi_transfer xfer[] =3D { - { - .tx_buf =3D &one->rd_header, - .len =3D sizeof(one->rd_header), - }, { - .rx_buf =3D rxbuf, - .len =3D len, - } - }; - spi_sync_transfer(to_spi_device(port->dev), xfer, ARRAY_SIZE(xfer)); + struct max310x_port *s =3D dev_get_drvdata(port->dev); + u8 reg =3D port->iobase + MAX310X_RHR_REG; + + regmap_raw_read(s->regmap, reg, rxbuf, len); } =20 static void max310x_handle_rx(struct uart_port *port, unsigned int rxlen) @@ -1390,10 +1374,6 @@ static int max310x_probe(struct device *dev, const s= truct max310x_devtype *devty INIT_WORK(&s->p[i].md_work, max310x_md_proc); /* Initialize queue for changing RS485 mode */ INIT_WORK(&s->p[i].rs_work, max310x_rs_proc); - /* Initialize SPI-transfer buffers */ - s->p[i].wr_header =3D (s->p[i].port.iobase + MAX310X_THR_REG) | - MAX310X_WRITE_BIT; - s->p[i].rd_header =3D (s->p[i].port.iobase + MAX310X_RHR_REG); =20 /* Register port */ ret =3D uart_add_one_port(&max310x_uart, &s->p[i].port); --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8AE3715AAAF; Wed, 13 Mar 2024 16:47:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348448; cv=none; b=oylQ3XnUnsPNo6uztJ6RrVPOAbuS8ctG4oYwOk9k/iyLWNurtkANH+f8muSe/8yH32zmJHtZpCYThlO4vcK0oc+QoiHwFzhhoGNRArmHrSEEY4rmzSb4KOtZDSSmUKj4Tx1Eul4zjBC3pSxrACxTIxJ6vhQnsSi0DQmV0zJGbMo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348448; c=relaxed/simple; bh=ch2Ufytfvwceqf3EZkbNtVSDHUYAfgp6GehJEaHk/Jo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=naK2n2O/rFDGAPzvx9jh2XSCM80uoSEd8TRz25NgA6w4yMIbD/AhVYyeRSAiplGNC0Jv329njIxa2YWs8gn2jyWhpJNlcm/cf2nZLw2PZ8e1x/DwGcPLLBGxDIxpakZZHtqIfMmUmVVnjAhQVxTsro5eNdEJvxQrukVu+5tHnEo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=QJ96jB6+; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="QJ96jB6+" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A1321C433C7; Wed, 13 Mar 2024 16:47:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348448; bh=ch2Ufytfvwceqf3EZkbNtVSDHUYAfgp6GehJEaHk/Jo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=QJ96jB6++HH4JyTUzGDg6yjQs/Zq+81m3LIaYG1+v6ZBmAudfw04osx3YPKJa0JfM m22gm1cHxTtVJFzbcHmg2BRmh/42L01CjhuwUn070hhLfMUFL8mDxhEqDPBFMYAeEe UaQ5CLNtQfETC3wXqNqQDwjWUdgZYYsUVg0Lbp5vP+71b2YWjk4FNUldIV/2G5OCNE mfXJ2t8FNU81UHV6+NjTQn4dwa0OjohUa3v4i3kOUJ2Lk5RIP+S0/N14pKzOdcaqcJ pAs5BBDbZ46vWTaqtKBIAtBEwoahVY9EWD3AVEJMWOtZjRtEn1k+pVDWJ6Y4XUFteg NBP/6HvONHyuw== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Cosmin Tanislav , Andy Shevchenko , Greg Kroah-Hartman , Sasha Levin Subject: [PATCH 5.10 42/73] serial: max310x: use a separate regmap for each port Date: Wed, 13 Mar 2024 12:46:09 -0400 Message-ID: <20240313164640.616049-43-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Cosmin Tanislav [ Upstream commit 6ef281daf020592c219fa91780abc381c6c20db5 ] The driver currently does manual register manipulation in multiple places to talk to a specific UART port. In order to talk to a specific UART port over SPI, the bits U1 and U0 of the register address can be set, as explained in the Command byte configuration section of the datasheet. Make this more elegant by creating regmaps for each UART port and setting the read_flag_mask and write_flag_mask accordingly. All communcations regarding global registers are done on UART port 0, so replace the global regmap entirely with the port 0 regmap. Also, remove the 0x1f masks from reg_writeable(), reg_volatile() and reg_precious() methods, since setting the U1 and U0 bits of the register address happens inside the regmap core now. Reviewed-by: Andy Shevchenko Signed-off-by: Cosmin Tanislav Link: https://lore.kernel.org/r/20220605144659.4169853-3-demonsingur@gmail.= com Signed-off-by: Greg Kroah-Hartman Stable-dep-of: b35f8dbbce81 ("serial: max310x: prevent infinite while() loo= p in port startup") Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- drivers/tty/serial/max310x.c | 68 +++++++++++++++++++----------------- 1 file changed, 36 insertions(+), 32 deletions(-) diff --git a/drivers/tty/serial/max310x.c b/drivers/tty/serial/max310x.c index c0fa4ad104774..80298a5714bcb 100644 --- a/drivers/tty/serial/max310x.c +++ b/drivers/tty/serial/max310x.c @@ -262,6 +262,7 @@ struct max310x_one { struct work_struct tx_work; struct work_struct md_work; struct work_struct rs_work; + struct regmap *regmap; =20 u8 rx_buf[MAX310X_FIFO_SIZE]; }; @@ -291,26 +292,26 @@ static DECLARE_BITMAP(max310x_lines, MAX310X_UART_NRM= AX); =20 static u8 max310x_port_read(struct uart_port *port, u8 reg) { - struct max310x_port *s =3D dev_get_drvdata(port->dev); + struct max310x_one *one =3D to_max310x_port(port); unsigned int val =3D 0; =20 - regmap_read(s->regmap, port->iobase + reg, &val); + regmap_read(one->regmap, reg, &val); =20 return val; } =20 static void max310x_port_write(struct uart_port *port, u8 reg, u8 val) { - struct max310x_port *s =3D dev_get_drvdata(port->dev); + struct max310x_one *one =3D to_max310x_port(port); =20 - regmap_write(s->regmap, port->iobase + reg, val); + regmap_write(one->regmap, reg, val); } =20 static void max310x_port_update(struct uart_port *port, u8 reg, u8 mask, u= 8 val) { - struct max310x_port *s =3D dev_get_drvdata(port->dev); + struct max310x_one *one =3D to_max310x_port(port); =20 - regmap_update_bits(s->regmap, port->iobase + reg, mask, val); + regmap_update_bits(one->regmap, reg, mask, val); } =20 static int max3107_detect(struct device *dev) @@ -449,7 +450,7 @@ static const struct max310x_devtype max14830_devtype = =3D { =20 static bool max310x_reg_writeable(struct device *dev, unsigned int reg) { - switch (reg & 0x1f) { + switch (reg) { case MAX310X_IRQSTS_REG: case MAX310X_LSR_IRQSTS_REG: case MAX310X_SPCHR_IRQSTS_REG: @@ -466,7 +467,7 @@ static bool max310x_reg_writeable(struct device *dev, u= nsigned int reg) =20 static bool max310x_reg_volatile(struct device *dev, unsigned int reg) { - switch (reg & 0x1f) { + switch (reg) { case MAX310X_RHR_REG: case MAX310X_IRQSTS_REG: case MAX310X_LSR_IRQSTS_REG: @@ -488,7 +489,7 @@ static bool max310x_reg_volatile(struct device *dev, un= signed int reg) =20 static bool max310x_reg_precious(struct device *dev, unsigned int reg) { - switch (reg & 0x1f) { + switch (reg) { case MAX310X_RHR_REG: case MAX310X_IRQSTS_REG: case MAX310X_SPCHR_IRQSTS_REG: @@ -633,18 +634,16 @@ static s32 max310x_set_ref_clk(struct device *dev, st= ruct max310x_port *s, =20 static void max310x_batch_write(struct uart_port *port, u8 *txbuf, unsigne= d int len) { - struct max310x_port *s =3D dev_get_drvdata(port->dev); - u8 reg =3D port->iobase + MAX310X_THR_REG; + struct max310x_one *one =3D to_max310x_port(port); =20 - regmap_raw_write(s->regmap, reg, txbuf, len); + regmap_raw_write(one->regmap, MAX310X_THR_REG, txbuf, len); } =20 static void max310x_batch_read(struct uart_port *port, u8 *rxbuf, unsigned= int len) { - struct max310x_port *s =3D dev_get_drvdata(port->dev); - u8 reg =3D port->iobase + MAX310X_RHR_REG; + struct max310x_one *one =3D to_max310x_port(port); =20 - regmap_raw_read(s->regmap, reg, rxbuf, len); + regmap_raw_read(one->regmap, MAX310X_RHR_REG, rxbuf, len); } =20 static void max310x_handle_rx(struct uart_port *port, unsigned int rxlen) @@ -1247,15 +1246,16 @@ static int max310x_gpio_set_config(struct gpio_chip= *chip, unsigned int offset, #endif =20 static int max310x_probe(struct device *dev, const struct max310x_devtype = *devtype, - struct regmap *regmap, int irq) + struct regmap *regmaps[], int irq) { int i, ret, fmin, fmax, freq; struct max310x_port *s; s32 uartclk =3D 0; bool xtal; =20 - if (IS_ERR(regmap)) - return PTR_ERR(regmap); + for (i =3D 0; i < devtype->nr; i++) + if (IS_ERR(regmaps[i])) + return PTR_ERR(regmaps[i]); =20 /* Alloc port structure */ s =3D devm_kzalloc(dev, struct_size(s, p, devtype->nr), GFP_KERNEL); @@ -1306,7 +1306,7 @@ static int max310x_probe(struct device *dev, const st= ruct max310x_devtype *devty goto out_clk; } =20 - s->regmap =3D regmap; + s->regmap =3D regmaps[0]; s->devtype =3D devtype; dev_set_drvdata(dev, s); =20 @@ -1316,22 +1316,18 @@ static int max310x_probe(struct device *dev, const = struct max310x_devtype *devty goto out_clk; =20 for (i =3D 0; i < devtype->nr; i++) { - unsigned int offs =3D i << 5; - /* Reset port */ - regmap_write(s->regmap, MAX310X_MODE2_REG + offs, + regmap_write(regmaps[i], MAX310X_MODE2_REG, MAX310X_MODE2_RST_BIT); /* Clear port reset */ - regmap_write(s->regmap, MAX310X_MODE2_REG + offs, 0); + regmap_write(regmaps[i], MAX310X_MODE2_REG, 0); =20 /* Wait for port startup */ do { - regmap_read(s->regmap, - MAX310X_BRGDIVLSB_REG + offs, &ret); + regmap_read(regmaps[i], MAX310X_BRGDIVLSB_REG, &ret); } while (ret !=3D 0x01); =20 - regmap_write(s->regmap, MAX310X_MODE1_REG + offs, - devtype->mode1); + regmap_write(regmaps[i], MAX310X_MODE1_REG, devtype->mode1); } =20 uartclk =3D max310x_set_ref_clk(dev, s, freq, xtal); @@ -1359,11 +1355,13 @@ static int max310x_probe(struct device *dev, const = struct max310x_devtype *devty s->p[i].port.fifosize =3D MAX310X_FIFO_SIZE; s->p[i].port.flags =3D UPF_FIXED_TYPE | UPF_LOW_LATENCY; s->p[i].port.iotype =3D UPIO_PORT; - s->p[i].port.iobase =3D i * 0x20; + s->p[i].port.iobase =3D i; s->p[i].port.membase =3D (void __iomem *)~0; s->p[i].port.uartclk =3D uartclk; s->p[i].port.rs485_config =3D max310x_rs485_config; s->p[i].port.ops =3D &max310x_ops; + s->p[i].regmap =3D regmaps[i]; + /* Disable all interrupts */ max310x_port_write(&s->p[i].port, MAX310X_IRQEN_REG, 0); /* Clear IRQ status register */ @@ -1460,6 +1458,7 @@ static struct regmap_config regcfg =3D { .val_bits =3D 8, .write_flag_mask =3D MAX310X_WRITE_BIT, .cache_type =3D REGCACHE_RBTREE, + .max_register =3D MAX310X_REG_1F, .writeable_reg =3D max310x_reg_writeable, .volatile_reg =3D max310x_reg_volatile, .precious_reg =3D max310x_reg_precious, @@ -1469,7 +1468,8 @@ static struct regmap_config regcfg =3D { static int max310x_spi_probe(struct spi_device *spi) { const struct max310x_devtype *devtype; - struct regmap *regmap; + struct regmap *regmaps[4]; + unsigned int i; int ret; =20 /* Setup SPI bus */ @@ -1484,10 +1484,14 @@ static int max310x_spi_probe(struct spi_device *spi) if (!devtype) devtype =3D (struct max310x_devtype *)spi_get_device_id(spi)->driver_dat= a; =20 - regcfg.max_register =3D devtype->nr * 0x20 - 1; - regmap =3D devm_regmap_init_spi(spi, ®cfg); + for (i =3D 0; i < devtype->nr; i++) { + u8 port_mask =3D i * 0x20; + regcfg.read_flag_mask =3D port_mask; + regcfg.write_flag_mask =3D port_mask | MAX310X_WRITE_BIT; + regmaps[i] =3D devm_regmap_init_spi(spi, ®cfg); + } =20 - return max310x_probe(&spi->dev, devtype, regmap, spi->irq); + return max310x_probe(&spi->dev, devtype, regmaps, spi->irq); } =20 static int max310x_spi_remove(struct spi_device *spi) --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E439C15AAD1; Wed, 13 Mar 2024 16:47:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348450; cv=none; b=r2Q5lvAECS+30KECJdQ2yy3r8SUzx1h2jOKjX0QHeFUvkxjPYuveQ2fT6uYeNa6CW+Y8G8vuRuWdIoCNUCkkUGmv/vKxy5Qf7pefqfosrT4WyAgJvB53W3BM3Ts3vZ4P82B4KUJVTtnVBt8UA3TOkKOQLDZm1YnEtI71A9t5dDM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348450; c=relaxed/simple; bh=uB6Kmj+7UuWh5REtj+8LBvTzv9j9EamYzrZD7GF8gUU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=YHF/NMATbd5HVsavbx7v/eIMJjgcILN8/ie2SKDr4R9rMHW6y68x6AfFybBDo18HFDFnRIJMKDu3VvLbtqJS9BMYbm/WiulFt9avKjEtJXqkz8+XRtVXtx2wRK+5jjhYsfEUMSmh4aXbjnq8mOy65pRVIegWPs1llmoBbaFku5c= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=lNKQXbmk; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="lNKQXbmk" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B62A2C43390; Wed, 13 Mar 2024 16:47:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348449; bh=uB6Kmj+7UuWh5REtj+8LBvTzv9j9EamYzrZD7GF8gUU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=lNKQXbmkhJ7LCg9xnmCMTjudcpvJfWmWRIdPQ9m3/qoTCiMYmTqi0Gv6QUwUEDef1 ogDIxx91ZK0YaTMqwxy+o06mcz/Fn9C9HpAkQZwvpptCqc7FLLHyejqWkGwjooDvFl mSdt2TcgOew5lz/lOaBmiIkjLi83AyjwvU6wmQLSXh6jdiggMpkxIw6qcKierVjEte MDPSwnsnwciXICRYAnqggjMJ80c9PdsGJTN2so3UlrdznFl314HRuTo9dUecmieUbK rGRZVNqIQYFitGjciT3ip771sS8k2yr4pPsYOR8Ms1mFUuPgls6ACf5Jcm10MnxX5N 0W9wzBpLGr+uA== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Hugo Villeneuve , Greg Kroah-Hartman , Sasha Levin Subject: [PATCH 5.10 43/73] serial: max310x: prevent infinite while() loop in port startup Date: Wed, 13 Mar 2024 12:46:10 -0400 Message-ID: <20240313164640.616049-44-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Hugo Villeneuve [ Upstream commit b35f8dbbce818b02c730dc85133dc7754266e084 ] If there is a problem after resetting a port, the do/while() loop that checks the default value of DIVLSB register may run forever and spam the I2C bus. Add a delay before each read of DIVLSB, and a maximum number of tries to prevent that situation from happening. Also fail probe if port reset is unsuccessful. Fixes: 10d8b34a4217 ("serial: max310x: Driver rework") Cc: stable@vger.kernel.org Signed-off-by: Hugo Villeneuve Link: https://lore.kernel.org/r/20240116213001.3691629-5-hugo@hugovil.com Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- drivers/tty/serial/max310x.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/drivers/tty/serial/max310x.c b/drivers/tty/serial/max310x.c index 80298a5714bcb..978d9d93127e5 100644 --- a/drivers/tty/serial/max310x.c +++ b/drivers/tty/serial/max310x.c @@ -235,6 +235,10 @@ #define MAX310x_REV_MASK (0xf8) #define MAX310X_WRITE_BIT 0x80 =20 +/* Port startup definitions */ +#define MAX310X_PORT_STARTUP_WAIT_RETRIES 20 /* Number of retries */ +#define MAX310X_PORT_STARTUP_WAIT_DELAY_MS 10 /* Delay between retries */ + /* Crystal-related definitions */ #define MAX310X_XTAL_WAIT_RETRIES 20 /* Number of retries */ #define MAX310X_XTAL_WAIT_DELAY_MS 10 /* Delay between retries */ @@ -1316,6 +1320,9 @@ static int max310x_probe(struct device *dev, const st= ruct max310x_devtype *devty goto out_clk; =20 for (i =3D 0; i < devtype->nr; i++) { + bool started =3D false; + unsigned int try =3D 0, val =3D 0; + /* Reset port */ regmap_write(regmaps[i], MAX310X_MODE2_REG, MAX310X_MODE2_RST_BIT); @@ -1324,8 +1331,17 @@ static int max310x_probe(struct device *dev, const s= truct max310x_devtype *devty =20 /* Wait for port startup */ do { - regmap_read(regmaps[i], MAX310X_BRGDIVLSB_REG, &ret); - } while (ret !=3D 0x01); + msleep(MAX310X_PORT_STARTUP_WAIT_DELAY_MS); + regmap_read(regmaps[i], MAX310X_BRGDIVLSB_REG, &val); + + if (val =3D=3D 0x01) + started =3D true; + } while (!started && (++try < MAX310X_PORT_STARTUP_WAIT_RETRIES)); + + if (!started) { + ret =3D dev_err_probe(dev, -EAGAIN, "port reset failed\n"); + goto out_uart; + } =20 regmap_write(regmaps[i], MAX310X_MODE1_REG, devtype->mode1); } --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A345C15AAD9; Wed, 13 Mar 2024 16:47:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348450; cv=none; b=Af/LkMfGNl7ueCiA+j8TvqFTOlDGgPy5l0pjYyfuDJeFz6qkGML7HIgGkpSuOzPwsHRg6jilkNj2gz7xhwND8nrpD9tT5bDTiGJnJRlyf0vSU+0NEuct8kYLJwXzv0eMUlEG/E5cgAXdUnNyG+XuY/YoNeLqvN5w/mQjHMvv2+c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348450; c=relaxed/simple; bh=35fWejEZZKXvoDZx3BRorUFQb5CQmMP9lyAXTgMA5LI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=QE0J9RzKz7u6Zz6nHjaNol0zf+zAh9hXtljBNFfSYJfOjebGi9dQEVitJo/K3WHOXgIK8b3He2iixxic7+ooTso15ZA0CRLQrIJ6IQwdyfutQaj1cJIK6VTh+pz6Iw4dR6SdpuwBUV0mh0WfjzTTnooH7CSY+kfyZm8HbdluMF0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=C+Mq+JFR; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="C+Mq+JFR" Received: by smtp.kernel.org (Postfix) with ESMTPSA id BE15BC433F1; Wed, 13 Mar 2024 16:47:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348450; bh=35fWejEZZKXvoDZx3BRorUFQb5CQmMP9lyAXTgMA5LI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=C+Mq+JFRumLQlHx+esAqJA6Mx/vC5NEoYOkiM2VG53Ll7CiFe95Rv8V4fi6M+S9Vq IKRROMkYSqk7qhCNQkO1YaMsYbRzybeXdHha5OR1d3RNejc4+JM5QCxVfNzpT14Ud0 BgWBjuOeXl0npTY6Y227d4b4S3pM8r7SeQgy37bS8QTBgwDI3WePvpt8wwgsUFSihD x0QOfvdxcNFnhxxPvSfYG2MHbSb0VfHH6OIa9gYD4JTFTEXNVlFuLY9CzKtKyaYOIq OI4ODXZeExo40K9UO1IbeiiYIrfkHolSe5gB+y5kNdkffRYPNz+vnilDYk1+dR8xjL YX780hf/dDdxA== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Martin KaFai Lau , Alexei Starovoitov , Sasha Levin Subject: [PATCH 5.10 44/73] net: Change sock_getsockopt() to take the sk ptr instead of the sock ptr Date: Wed, 13 Mar 2024 12:46:11 -0400 Message-ID: <20240313164640.616049-45-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Martin KaFai Lau [ Upstream commit ba74a7608dc12fbbd8ea36e660087f08a81ef26a ] A latter patch refactors bpf_getsockopt(SOL_SOCKET) with the sock_getsockopt() to avoid code duplication and code drift between the two duplicates. The current sock_getsockopt() takes sock ptr as the argument. The very first thing of this function is to get back the sk ptr by 'sk =3D sock->sk'. bpf_getsockopt() could be called when the sk does not have the sock ptr created. Meaning sk->sk_socket is NULL. For example, when a passive tcp connection has just been established but has yet been accept()-ed. Thus, it cannot use the sock_getsockopt(sk->sk_socket) or else it will pass a NULL ptr. This patch moves all sock_getsockopt implementation to the newly added sk_getsockopt(). The new sk_getsockopt() takes a sk ptr and immediately gets the sock ptr by 'sock =3D sk->sk_socket' The existing sock_getsockopt(sock) is changed to call sk_getsockopt(sock->sk). All existing callers have both sock->sk and sk->sk_socket pointer. The latter patch will make bpf_getsockopt(SOL_SOCKET) call sk_getsockopt(sk) directly. The bpf_getsockopt(SOL_SOCKET) does not use the optnames that require sk->sk_socket, so it will be safe. Signed-off-by: Martin KaFai Lau Link: https://lore.kernel.org/r/20220902002756.2887884-1-kafai@fb.com Signed-off-by: Alexei Starovoitov Stable-dep-of: 5a287d3d2b9d ("lsm: fix default return value of the socket_g= etpeersec_*() hooks") Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- net/core/sock.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/net/core/sock.c b/net/core/sock.c index 769e969cd1dc5..95559d088a169 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -1293,10 +1293,10 @@ static int groups_to_user(gid_t __user *dst, const = struct group_info *src) return 0; } =20 -int sock_getsockopt(struct socket *sock, int level, int optname, - char __user *optval, int __user *optlen) +static int sk_getsockopt(struct sock *sk, int level, int optname, + char __user *optval, int __user *optlen) { - struct sock *sk =3D sock->sk; + struct socket *sock =3D sk->sk_socket; =20 union { int val; @@ -1633,6 +1633,12 @@ int sock_getsockopt(struct socket *sock, int level, = int optname, return 0; } =20 +int sock_getsockopt(struct socket *sock, int level, int optname, + char __user *optval, int __user *optlen) +{ + return sk_getsockopt(sock->sk, level, optname, optval, optlen); +} + /* * Initialize an sk_lock. * --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 50C5D15B113; Wed, 13 Mar 2024 16:47:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348452; cv=none; b=DXIU9yyGGCCbRjXrIzrnMC5aAvcRGEGatRnOEoRq8tpsDqxh6jAUwThflmDxXl2ZhjCEYOr5wre2URs2B1zQo1IkDjwMF8MGc/Jb5wA3V4Cjwhc0rKovaJyh6lZ3bsBx9B3/JB2pThkxIZUOl5X3CClBhKlt0ljHq7JLqeZ1P6o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348452; c=relaxed/simple; bh=lhW0E9o8xdX5sdzcKG/6y7daJkXyEql2FjTYwNEWdO8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=goFtx8VLh5sTmJEA6aKsLxsueViS9I7iqK6WR66WMmGZEMSM61s1wOsGf3zeSuKrfS9u0yHWuP1Hf/czCBIMX8VuAlNjtfki8+MJpRWLeboXqGpmRGpMiYkvozpmSmn9o2eGhF4km416I2qorh/L7ZbolxG6G0J8GyAjnP+skas= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=SzOlrD1I; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="SzOlrD1I" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C34B9C43390; Wed, 13 Mar 2024 16:47:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348451; bh=lhW0E9o8xdX5sdzcKG/6y7daJkXyEql2FjTYwNEWdO8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=SzOlrD1IPpvB11k7AVSlyqIIEW+WdyQbWc8uaytuFosSaImNlV996w9KgGEnndNOa skcBNayVsqnbp68yxeOQy915/IopOQF2JkdmB8AFG156+MuPaWLI2ReBWOUAX/oDZx HW2lG0yJDwalgt62HP7hJVKWEs7IIBc+87q900pprW4Ve2vOnpNL6A14d7NHVi2/hp AvGnTxGh8Vqm9y4CCeiwz4C61j01ugFsgxAapai1i2bFM4mPY2uFiGy/G0ff1ou2BU bQDdGHIA6Qjp7TX6yfVHTFWyu5Ta/XCKX4sWVQIWUXS0/UGXYhGDlgxqs8ZfS6rF1L AUxl/tLq2blZA== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Martin KaFai Lau , Alexei Starovoitov , Sasha Levin Subject: [PATCH 5.10 45/73] bpf: net: Change sk_getsockopt() to take the sockptr_t argument Date: Wed, 13 Mar 2024 12:46:12 -0400 Message-ID: <20240313164640.616049-46-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Martin KaFai Lau [ Upstream commit 4ff09db1b79b98b4a2a7511571c640b76cab3beb ] This patch changes sk_getsockopt() to take the sockptr_t argument such that it can be used by bpf_getsockopt(SOL_SOCKET) in a latter patch. security_socket_getpeersec_stream() is not changed. It stays with the __user ptr (optval.user and optlen.user) to avoid changes to other security hooks. bpf_getsockopt(SOL_SOCKET) also does not support SO_PEERSEC. Signed-off-by: Martin KaFai Lau Link: https://lore.kernel.org/r/20220902002802.2888419-1-kafai@fb.com Signed-off-by: Alexei Starovoitov Stable-dep-of: 5a287d3d2b9d ("lsm: fix default return value of the socket_g= etpeersec_*() hooks") Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- include/linux/filter.h | 3 +-- include/linux/sockptr.h | 5 +++++ net/core/filter.c | 5 ++--- net/core/sock.c | 43 +++++++++++++++++++++++------------------ 4 files changed, 32 insertions(+), 24 deletions(-) diff --git a/include/linux/filter.h b/include/linux/filter.h index bc6ce4b202a80..cd56e53bd42e2 100644 --- a/include/linux/filter.h +++ b/include/linux/filter.h @@ -892,8 +892,7 @@ int sk_reuseport_attach_filter(struct sock_fprog *fprog= , struct sock *sk); int sk_reuseport_attach_bpf(u32 ufd, struct sock *sk); void sk_reuseport_prog_free(struct bpf_prog *prog); int sk_detach_filter(struct sock *sk); -int sk_get_filter(struct sock *sk, struct sock_filter __user *filter, - unsigned int len); +int sk_get_filter(struct sock *sk, sockptr_t optval, unsigned int len); =20 bool sk_filter_charge(struct sock *sk, struct sk_filter *fp); void sk_filter_uncharge(struct sock *sk, struct sk_filter *fp); diff --git a/include/linux/sockptr.h b/include/linux/sockptr.h index ea193414298b7..38862819e77a1 100644 --- a/include/linux/sockptr.h +++ b/include/linux/sockptr.h @@ -64,6 +64,11 @@ static inline int copy_to_sockptr_offset(sockptr_t dst, = size_t offset, return 0; } =20 +static inline int copy_to_sockptr(sockptr_t dst, const void *src, size_t s= ize) +{ + return copy_to_sockptr_offset(dst, 0, src, size); +} + static inline void *memdup_sockptr(sockptr_t src, size_t len) { void *p =3D kmalloc_track_caller(len, GFP_USER | __GFP_NOWARN); diff --git a/net/core/filter.c b/net/core/filter.c index 6cfc8fb0562a2..49e4d1535cc82 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -9903,8 +9903,7 @@ int sk_detach_filter(struct sock *sk) } EXPORT_SYMBOL_GPL(sk_detach_filter); =20 -int sk_get_filter(struct sock *sk, struct sock_filter __user *ubuf, - unsigned int len) +int sk_get_filter(struct sock *sk, sockptr_t optval, unsigned int len) { struct sock_fprog_kern *fprog; struct sk_filter *filter; @@ -9935,7 +9934,7 @@ int sk_get_filter(struct sock *sk, struct sock_filter= __user *ubuf, goto out; =20 ret =3D -EFAULT; - if (copy_to_user(ubuf, fprog->filter, bpf_classic_proglen(fprog))) + if (copy_to_sockptr(optval, fprog->filter, bpf_classic_proglen(fprog))) goto out; =20 /* Instead of bytes, the API requests to return the number diff --git a/net/core/sock.c b/net/core/sock.c index 95559d088a169..42da46965b16f 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -644,8 +644,8 @@ static int sock_setbindtodevice(struct sock *sk, sockpt= r_t optval, int optlen) return ret; } =20 -static int sock_getbindtodevice(struct sock *sk, char __user *optval, - int __user *optlen, int len) +static int sock_getbindtodevice(struct sock *sk, sockptr_t optval, + sockptr_t optlen, int len) { int ret =3D -ENOPROTOOPT; #ifdef CONFIG_NETDEVICES @@ -668,12 +668,12 @@ static int sock_getbindtodevice(struct sock *sk, char= __user *optval, len =3D strlen(devname) + 1; =20 ret =3D -EFAULT; - if (copy_to_user(optval, devname, len)) + if (copy_to_sockptr(optval, devname, len)) goto out; =20 zero: ret =3D -EFAULT; - if (put_user(len, optlen)) + if (copy_to_sockptr(optlen, &len, sizeof(int))) goto out; =20 ret =3D 0; @@ -1281,20 +1281,23 @@ static void cred_to_ucred(struct pid *pid, const st= ruct cred *cred, } } =20 -static int groups_to_user(gid_t __user *dst, const struct group_info *src) +static int groups_to_user(sockptr_t dst, const struct group_info *src) { struct user_namespace *user_ns =3D current_user_ns(); int i; =20 - for (i =3D 0; i < src->ngroups; i++) - if (put_user(from_kgid_munged(user_ns, src->gid[i]), dst + i)) + for (i =3D 0; i < src->ngroups; i++) { + gid_t gid =3D from_kgid_munged(user_ns, src->gid[i]); + + if (copy_to_sockptr_offset(dst, i * sizeof(gid), &gid, sizeof(gid))) return -EFAULT; + } =20 return 0; } =20 static int sk_getsockopt(struct sock *sk, int level, int optname, - char __user *optval, int __user *optlen) + sockptr_t optval, sockptr_t optlen) { struct socket *sock =3D sk->sk_socket; =20 @@ -1312,7 +1315,7 @@ static int sk_getsockopt(struct sock *sk, int level, = int optname, int lv =3D sizeof(int); int len; =20 - if (get_user(len, optlen)) + if (copy_from_sockptr(&len, optlen, sizeof(int))) return -EFAULT; if (len < 0) return -EINVAL; @@ -1445,7 +1448,7 @@ static int sk_getsockopt(struct sock *sk, int level, = int optname, cred_to_ucred(sk->sk_peer_pid, sk->sk_peer_cred, &peercred); spin_unlock(&sk->sk_peer_lock); =20 - if (copy_to_user(optval, &peercred, len)) + if (copy_to_sockptr(optval, &peercred, len)) return -EFAULT; goto lenout; } @@ -1463,11 +1466,11 @@ static int sk_getsockopt(struct sock *sk, int level= , int optname, if (len < n * sizeof(gid_t)) { len =3D n * sizeof(gid_t); put_cred(cred); - return put_user(len, optlen) ? -EFAULT : -ERANGE; + return copy_to_sockptr(optlen, &len, sizeof(int)) ? -EFAULT : -ERANGE; } len =3D n * sizeof(gid_t); =20 - ret =3D groups_to_user((gid_t __user *)optval, cred->group_info); + ret =3D groups_to_user(optval, cred->group_info); put_cred(cred); if (ret) return ret; @@ -1483,7 +1486,7 @@ static int sk_getsockopt(struct sock *sk, int level, = int optname, return -ENOTCONN; if (lv < len) return -EINVAL; - if (copy_to_user(optval, address, len)) + if (copy_to_sockptr(optval, address, len)) return -EFAULT; goto lenout; } @@ -1500,7 +1503,7 @@ static int sk_getsockopt(struct sock *sk, int level, = int optname, break; =20 case SO_PEERSEC: - return security_socket_getpeersec_stream(sock, optval, optlen, len); + return security_socket_getpeersec_stream(sock, optval.user, optlen.user,= len); =20 case SO_MARK: v.val =3D sk->sk_mark; @@ -1528,7 +1531,7 @@ static int sk_getsockopt(struct sock *sk, int level, = int optname, return sock_getbindtodevice(sk, optval, optlen, len); =20 case SO_GET_FILTER: - len =3D sk_get_filter(sk, (struct sock_filter __user *)optval, len); + len =3D sk_get_filter(sk, optval, len); if (len < 0) return len; =20 @@ -1575,7 +1578,7 @@ static int sk_getsockopt(struct sock *sk, int level, = int optname, sk_get_meminfo(sk, meminfo); =20 len =3D min_t(unsigned int, len, sizeof(meminfo)); - if (copy_to_user(optval, &meminfo, len)) + if (copy_to_sockptr(optval, &meminfo, len)) return -EFAULT; =20 goto lenout; @@ -1625,10 +1628,10 @@ static int sk_getsockopt(struct sock *sk, int level= , int optname, =20 if (len > lv) len =3D lv; - if (copy_to_user(optval, &v, len)) + if (copy_to_sockptr(optval, &v, len)) return -EFAULT; lenout: - if (put_user(len, optlen)) + if (copy_to_sockptr(optlen, &len, sizeof(int))) return -EFAULT; return 0; } @@ -1636,7 +1639,9 @@ static int sk_getsockopt(struct sock *sk, int level, = int optname, int sock_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen) { - return sk_getsockopt(sock->sk, level, optname, optval, optlen); + return sk_getsockopt(sock->sk, level, optname, + USER_SOCKPTR(optval), + USER_SOCKPTR(optlen)); } =20 /* --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0E1FD15B96C; Wed, 13 Mar 2024 16:47:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348453; cv=none; b=EE7oe0KwQ7yj+zUB3rw6vSAQAMqIiqrk+ji//7xvDLAIAAjqQGGhKryFg1VKJ+2KBjO963GIrbNhsIyUK9XNEHQDGiDolmsx33pFs/gFyjpIJgo4LLuA7NEb5BJijB8bZ93ZfaH2laxYRufPW+W9R4DgEpTchJKZyZZMNBa51hM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348453; c=relaxed/simple; bh=QjxLFRsGdo57Hkre15eaMsp+MhCn58/hHstYIjAHJCM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bq8+dG6emYctGHsfVwumTjGf/x/mP3TycuCvaGSIJyVGALMgqSgEtvt+XRE0+NKWPWHPeIsaIbkty5MEc/SoFziJjhVOY03DJGDA6FNJfauMuk3X5BWMDL45eIX0hmqnAm20rr4nhwJ+/LfYJZSrhG/yFNJ5Fi+dthcgiMJWS40= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=jIQh/mQ3; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="jIQh/mQ3" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 16123C433F1; Wed, 13 Mar 2024 16:47:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348452; bh=QjxLFRsGdo57Hkre15eaMsp+MhCn58/hHstYIjAHJCM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=jIQh/mQ3ZIaJtFH65nPq21mUgS5DqSXG1+utIUtr6dWhRszDiPajDaE6Zzrl7Vgow 0gKXtGrJbkZc9j0fu5eraTkMCZWRPWRGJ/iL1pjTTuYTd8+KQHTRBD0X46aTBfCjLX 95KNsvh5mJ9Jf3YS/YHGpn3f9ego2GXP/h6JY7xH5g7uT/U/Ql/LI3nrtXT+8Dk+Qz cr9jDURzZgGwXL+0Ns8TUV4TeNwX3TtKCNLDy0aUjV7wgfMXCGvlmjJDER8ZOq/l9Z pCA+5Cu3Wlv3CF1YVIMoYEtRRTbWSY5Lr/Jaz2GA5QaW0vhavqIDnqEBy4DLEN7HQJ 8tXeIcM8toXFg== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Paul Moore , Casey Schaufler , John Johansen , Sasha Levin Subject: [PATCH 5.10 46/73] lsm: make security_socket_getpeersec_stream() sockptr_t safe Date: Wed, 13 Mar 2024 12:46:13 -0400 Message-ID: <20240313164640.616049-47-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Paul Moore [ Upstream commit b10b9c342f7571f287fd422be5d5c0beb26ba974 ] Commit 4ff09db1b79b ("bpf: net: Change sk_getsockopt() to take the sockptr_t argument") made it possible to call sk_getsockopt() with both user and kernel address space buffers through the use of the sockptr_t type. Unfortunately at the time of conversion the security_socket_getpeersec_stream() LSM hook was written to only accept userspace buffers, and in a desire to avoid having to change the LSM hook the commit author simply passed the sockptr_t's userspace buffer pointer. Since the only sk_getsockopt() callers at the time of conversion which used kernel sockptr_t buffers did not allow SO_PEERSEC, and hence the security_socket_getpeersec_stream() hook, this was acceptable but also very fragile as future changes presented the possibility of silently passing kernel space pointers to the LSM hook. There are several ways to protect against this, including careful code review of future commits, but since relying on code review to catch bugs is a recipe for disaster and the upstream eBPF maintainer is "strongly against defensive programming", this patch updates the LSM hook, and all of the implementations to support sockptr_t and safely handle both user and kernel space buffers. Acked-by: Casey Schaufler Acked-by: John Johansen Signed-off-by: Paul Moore Stable-dep-of: 5a287d3d2b9d ("lsm: fix default return value of the socket_g= etpeersec_*() hooks") Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- include/linux/lsm_hook_defs.h | 2 +- include/linux/lsm_hooks.h | 4 ++-- include/linux/security.h | 11 +++++++---- net/core/sock.c | 3 ++- security/apparmor/lsm.c | 29 +++++++++++++---------------- security/security.c | 6 +++--- security/selinux/hooks.c | 13 ++++++------- security/smack/smack_lsm.c | 19 ++++++++++--------- 8 files changed, 44 insertions(+), 43 deletions(-) diff --git a/include/linux/lsm_hook_defs.h b/include/linux/lsm_hook_defs.h index 92a76ce0c382d..9f550eab8ebdb 100644 --- a/include/linux/lsm_hook_defs.h +++ b/include/linux/lsm_hook_defs.h @@ -294,7 +294,7 @@ LSM_HOOK(int, 0, socket_setsockopt, struct socket *sock= , int level, int optname) LSM_HOOK(int, 0, socket_shutdown, struct socket *sock, int how) LSM_HOOK(int, 0, socket_sock_rcv_skb, struct sock *sk, struct sk_buff *skb) LSM_HOOK(int, 0, socket_getpeersec_stream, struct socket *sock, - char __user *optval, int __user *optlen, unsigned len) + sockptr_t optval, sockptr_t optlen, unsigned int len) LSM_HOOK(int, 0, socket_getpeersec_dgram, struct socket *sock, struct sk_buff *skb, u32 *secid) LSM_HOOK(int, 0, sk_alloc_security, struct sock *sk, int family, gfp_t pri= ority) diff --git a/include/linux/lsm_hooks.h b/include/linux/lsm_hooks.h index 64cdf4d7bfb30..bbf9c8c7bd9c5 100644 --- a/include/linux/lsm_hooks.h +++ b/include/linux/lsm_hooks.h @@ -926,8 +926,8 @@ * SO_GETPEERSEC. For tcp sockets this can be meaningful if the * socket is associated with an ipsec SA. * @sock is the local socket. - * @optval userspace memory where the security state is to be copied. - * @optlen userspace int where the module should copy the actual length + * @optval memory where the security state is to be copied. + * @optlen memory where the module should copy the actual length * of the security state. * @len as input is the maximum length to copy to userspace provided * by the caller. diff --git a/include/linux/security.h b/include/linux/security.h index e388b1666bcfc..5b61aa19fac66 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -31,6 +31,7 @@ #include #include #include +#include =20 struct linux_binprm; struct cred; @@ -1366,8 +1367,8 @@ int security_socket_getsockopt(struct socket *sock, i= nt level, int optname); int security_socket_setsockopt(struct socket *sock, int level, int optname= ); int security_socket_shutdown(struct socket *sock, int how); int security_sock_rcv_skb(struct sock *sk, struct sk_buff *skb); -int security_socket_getpeersec_stream(struct socket *sock, char __user *op= tval, - int __user *optlen, unsigned len); +int security_socket_getpeersec_stream(struct socket *sock, sockptr_t optva= l, + sockptr_t optlen, unsigned int len); int security_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *= skb, u32 *secid); int security_sk_alloc(struct sock *sk, int family, gfp_t priority); void security_sk_free(struct sock *sk); @@ -1501,8 +1502,10 @@ static inline int security_sock_rcv_skb(struct sock = *sk, return 0; } =20 -static inline int security_socket_getpeersec_stream(struct socket *sock, c= har __user *optval, - int __user *optlen, unsigned len) +static inline int security_socket_getpeersec_stream(struct socket *sock, + sockptr_t optval, + sockptr_t optlen, + unsigned int len) { return -ENOPROTOOPT; } diff --git a/net/core/sock.c b/net/core/sock.c index 42da46965b16f..016c0b9e01b70 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -1503,7 +1503,8 @@ static int sk_getsockopt(struct sock *sk, int level, = int optname, break; =20 case SO_PEERSEC: - return security_socket_getpeersec_stream(sock, optval.user, optlen.user,= len); + return security_socket_getpeersec_stream(sock, + optval, optlen, len); =20 case SO_MARK: v.val =3D sk->sk_mark; diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c index 585edcc6814d2..052f1b920e43f 100644 --- a/security/apparmor/lsm.c +++ b/security/apparmor/lsm.c @@ -1070,11 +1070,10 @@ static struct aa_label *sk_peer_label(struct sock *= sk) * Note: for tcp only valid if using ipsec or cipso on lan */ static int apparmor_socket_getpeersec_stream(struct socket *sock, - char __user *optval, - int __user *optlen, + sockptr_t optval, sockptr_t optlen, unsigned int len) { - char *name; + char *name =3D NULL; int slen, error =3D 0; struct aa_label *label; struct aa_label *peer; @@ -1091,23 +1090,21 @@ static int apparmor_socket_getpeersec_stream(struct= socket *sock, /* don't include terminating \0 in slen, it breaks some apps */ if (slen < 0) { error =3D -ENOMEM; - } else { - if (slen > len) { - error =3D -ERANGE; - } else if (copy_to_user(optval, name, slen)) { - error =3D -EFAULT; - goto out; - } - if (put_user(slen, optlen)) - error =3D -EFAULT; -out: - kfree(name); - + goto done; + } + if (slen > len) { + error =3D -ERANGE; + goto done_len; } =20 + if (copy_to_sockptr(optval, name, slen)) + error =3D -EFAULT; +done_len: + if (copy_to_sockptr(optlen, &slen, sizeof(slen))) + error =3D -EFAULT; done: end_current_label_crit_section(label); - + kfree(name); return error; } =20 diff --git a/security/security.c b/security/security.c index 269c3965393f4..e9dcde3c4f14b 100644 --- a/security/security.c +++ b/security/security.c @@ -2224,11 +2224,11 @@ int security_sock_rcv_skb(struct sock *sk, struct s= k_buff *skb) } EXPORT_SYMBOL(security_sock_rcv_skb); =20 -int security_socket_getpeersec_stream(struct socket *sock, char __user *op= tval, - int __user *optlen, unsigned len) +int security_socket_getpeersec_stream(struct socket *sock, sockptr_t optva= l, + sockptr_t optlen, unsigned int len) { return call_int_hook(socket_getpeersec_stream, -ENOPROTOOPT, sock, - optval, optlen, len); + optval, optlen, len); } =20 int security_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *= skb, u32 *secid) diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index 50d3ddfe15fd1..46c00a68bb4bd 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c @@ -5110,11 +5110,12 @@ static int selinux_socket_sock_rcv_skb(struct sock = *sk, struct sk_buff *skb) return err; } =20 -static int selinux_socket_getpeersec_stream(struct socket *sock, char __us= er *optval, - int __user *optlen, unsigned len) +static int selinux_socket_getpeersec_stream(struct socket *sock, + sockptr_t optval, sockptr_t optlen, + unsigned int len) { int err =3D 0; - char *scontext; + char *scontext =3D NULL; u32 scontext_len; struct sk_security_struct *sksec =3D sock->sk->sk_security; u32 peer_sid =3D SECSID_NULL; @@ -5130,17 +5131,15 @@ static int selinux_socket_getpeersec_stream(struct = socket *sock, char __user *op &scontext_len); if (err) return err; - if (scontext_len > len) { err =3D -ERANGE; goto out_len; } =20 - if (copy_to_user(optval, scontext, scontext_len)) + if (copy_to_sockptr(optval, scontext, scontext_len)) err =3D -EFAULT; - out_len: - if (put_user(scontext_len, optlen)) + if (copy_to_sockptr(optlen, &scontext_len, sizeof(scontext_len))) err =3D -EFAULT; kfree(scontext); return err; diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c index e1669759403a6..5388f143eecd8 100644 --- a/security/smack/smack_lsm.c +++ b/security/smack/smack_lsm.c @@ -4022,12 +4022,12 @@ static int smack_socket_sock_rcv_skb(struct sock *s= k, struct sk_buff *skb) * returns zero on success, an error code otherwise */ static int smack_socket_getpeersec_stream(struct socket *sock, - char __user *optval, - int __user *optlen, unsigned len) + sockptr_t optval, sockptr_t optlen, + unsigned int len) { struct socket_smack *ssp; char *rcp =3D ""; - int slen =3D 1; + u32 slen =3D 1; int rc =3D 0; =20 ssp =3D sock->sk->sk_security; @@ -4035,15 +4035,16 @@ static int smack_socket_getpeersec_stream(struct so= cket *sock, rcp =3D ssp->smk_packet->smk_known; slen =3D strlen(rcp) + 1; } - - if (slen > len) + if (slen > len) { rc =3D -ERANGE; - else if (copy_to_user(optval, rcp, slen) !=3D 0) - rc =3D -EFAULT; + goto out_len; + } =20 - if (put_user(slen, optlen) !=3D 0) + if (copy_to_sockptr(optval, rcp, slen)) + rc =3D -EFAULT; +out_len: + if (copy_to_sockptr(optlen, &slen, sizeof(slen))) rc =3D -EFAULT; - return rc; } =20 --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0D32515B985; Wed, 13 Mar 2024 16:47:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348454; cv=none; b=Ubx6arMBHE89zELhhvGEWTtQcueDwmMaluLeLcTAYOBzwy7QrVfmsXV71+8z1wu6tclnnYPM7V2AvmeHaDvOld2dM1CWovm4+oTHDPNcsfX58uvMHC/8IytE2Au48GpBjgT7Ebe+HVle6ZUsgOrLQcVrm3Kp0tIQygYUbzRtGN8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348454; c=relaxed/simple; bh=36tOWfFuzG3HhdjxZYdrj+qn15FcF4TnU7zWvxXyEQo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CNnhGQPypS+qatoHZVQgB/LohuZTRqXaTo3yLKdPEl9MehVA2ZIOyfzORMRGJ4NTAGWI/8iRmBmngRBnOkLT1i4kqjTXiwJb4W5zXIRcnHLh/xqq1uvrJ2l3DjxtfysRRX8evxHy+wo8I59ZToREIJwvEKBYGCQXeJyqUdS26wA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=OfoxGFMT; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="OfoxGFMT" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 36BEBC43399; Wed, 13 Mar 2024 16:47:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348453; bh=36tOWfFuzG3HhdjxZYdrj+qn15FcF4TnU7zWvxXyEQo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=OfoxGFMT3msQRmbeyptykW34vb2JaN5ZgslhKv/e8NvpZwaI21PX7LO9cNPwDC2ag ctQyeevzlxCeEjUhay21dVJ5csbBGFtxTjhcML3gtFrszYDt5UFA4ifIE7EDOyMHry YSSFZtVV0mn+F6qbFwBC/fbdBbg+IYFAl6NLrQhq79+bTTg7ZAXZteL04lb1wtdRZU qKVvwpz3hpLxR6IyQWHDBUyLputE7I0Oh4TFa5QIDNJ4YsT9gIkThWQSstC6EWAKBx Mk2AV4xPjjA5cDR0hq5Y3MvWY/1cLxOBy1JNkKVN12MhKVUnqyKvNJQ9m/gZbGSYd0 +OP5Q3AIak0jg== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Ondrej Mosnacek , Paul Moore , Sasha Levin Subject: [PATCH 5.10 47/73] lsm: fix default return value of the socket_getpeersec_*() hooks Date: Wed, 13 Mar 2024 12:46:14 -0400 Message-ID: <20240313164640.616049-48-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Ondrej Mosnacek [ Upstream commit 5a287d3d2b9de2b3e747132c615599907ba5c3c1 ] For these hooks the true "neutral" value is -EOPNOTSUPP, which is currently what is returned when no LSM provides this hook and what LSMs return when there is no security context set on the socket. Correct the value in and adjust the dispatch functions in security/security.c to avoid issues when the BPF LSM is enabled. Cc: stable@vger.kernel.org Fixes: 98e828a0650f ("security: Refactor declaration of LSM hooks") Signed-off-by: Ondrej Mosnacek [PM: subject line tweak] Signed-off-by: Paul Moore Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- include/linux/lsm_hook_defs.h | 4 ++-- security/security.c | 31 +++++++++++++++++++++++++++---- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/include/linux/lsm_hook_defs.h b/include/linux/lsm_hook_defs.h index 9f550eab8ebdb..07abcd384975b 100644 --- a/include/linux/lsm_hook_defs.h +++ b/include/linux/lsm_hook_defs.h @@ -293,9 +293,9 @@ LSM_HOOK(int, 0, socket_getsockopt, struct socket *sock= , int level, int optname) LSM_HOOK(int, 0, socket_setsockopt, struct socket *sock, int level, int op= tname) LSM_HOOK(int, 0, socket_shutdown, struct socket *sock, int how) LSM_HOOK(int, 0, socket_sock_rcv_skb, struct sock *sk, struct sk_buff *skb) -LSM_HOOK(int, 0, socket_getpeersec_stream, struct socket *sock, +LSM_HOOK(int, -ENOPROTOOPT, socket_getpeersec_stream, struct socket *sock, sockptr_t optval, sockptr_t optlen, unsigned int len) -LSM_HOOK(int, 0, socket_getpeersec_dgram, struct socket *sock, +LSM_HOOK(int, -ENOPROTOOPT, socket_getpeersec_dgram, struct socket *sock, struct sk_buff *skb, u32 *secid) LSM_HOOK(int, 0, sk_alloc_security, struct sock *sk, int family, gfp_t pri= ority) LSM_HOOK(void, LSM_RET_VOID, sk_free_security, struct sock *sk) diff --git a/security/security.c b/security/security.c index e9dcde3c4f14b..0bbcb100ba8e9 100644 --- a/security/security.c +++ b/security/security.c @@ -2227,14 +2227,37 @@ EXPORT_SYMBOL(security_sock_rcv_skb); int security_socket_getpeersec_stream(struct socket *sock, sockptr_t optva= l, sockptr_t optlen, unsigned int len) { - return call_int_hook(socket_getpeersec_stream, -ENOPROTOOPT, sock, - optval, optlen, len); + struct security_hook_list *hp; + int rc; + + /* + * Only one module will provide a security context. + */ + hlist_for_each_entry(hp, &security_hook_heads.socket_getpeersec_stream, + list) { + rc =3D hp->hook.socket_getpeersec_stream(sock, optval, optlen, + len); + if (rc !=3D LSM_RET_DEFAULT(socket_getpeersec_stream)) + return rc; + } + return LSM_RET_DEFAULT(socket_getpeersec_stream); } =20 int security_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *= skb, u32 *secid) { - return call_int_hook(socket_getpeersec_dgram, -ENOPROTOOPT, sock, - skb, secid); + struct security_hook_list *hp; + int rc; + + /* + * Only one module will provide a security context. + */ + hlist_for_each_entry(hp, &security_hook_heads.socket_getpeersec_dgram, + list) { + rc =3D hp->hook.socket_getpeersec_dgram(sock, skb, secid); + if (rc !=3D LSM_RET_DEFAULT(socket_getpeersec_dgram)) + return rc; + } + return LSM_RET_DEFAULT(socket_getpeersec_dgram); } EXPORT_SYMBOL(security_socket_getpeersec_dgram); =20 --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2AE8815B99F; Wed, 13 Mar 2024 16:47:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348455; cv=none; b=LUv1sukgZCgMhrDb05oGY7OiMvUVxJ+NxX5y5ejaQ2IIhTOW5uPcBGCJvkpLztGlbhLd06qXrdWfUwT0deAkvzZ6MZR1if0FlB9+6g0kyRlf69hTh10TD4rkkeTbCRqVhvnmfI/9cm47VBKpbYpLWFGMQEo0u0CSwpJlUOi26KI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348455; c=relaxed/simple; bh=fnCtHXKpMQRO52XU6DnTr/ttKAOmG1WL57rSqunSTqg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=eYB6XPdrT6nB3Z5ahhDLPE6Fg7VIaGHBzeKds3+fkielpIKrWlZutdoupdHK9i6mATvVoEPIzluJY8j55aQ+H3wICY57IptMjmewXZBRaePPKtoyKI8XBIPbWjZ4ugFnhtjt1srM3++sQ92amRR8Wqr1dxSreMWTsWcIPQjTbFg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=qSxgRZWh; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="qSxgRZWh" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 38251C433F1; Wed, 13 Mar 2024 16:47:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348455; bh=fnCtHXKpMQRO52XU6DnTr/ttKAOmG1WL57rSqunSTqg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=qSxgRZWhb5pA1nZslfCNoKQWsWGtUlOLLR6zdLNtYvX0x7e3ucCk87s8NYiE7iyi4 tOFy8ZnTv2V7nwp0pgYnN0xoWG7KNcPqmEBmUn0gmcUzkTrOo8oDbS3zz5K560IHvp ofCUp8Q7X0eUj877VLRXoCeGRnxJMyguu9i8bhDUDDL38QIlVDp37IPlh70dDhucpJ r4SAYPn3M6OYBTD2x5z2Jlon0zS06bSy5zKexcQ7fQMc/aRzGQ3qQQt27b92jsZ5HU 19ojS2Sokg3JM1hvGp73e/pF0o5dm+eIoH0DUfquaLb3CV8dxDmlg7WK8Dc3W3iaok 6hcHCyBjW5yDg== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Baokun Li , Jan Kara , Theodore Ts'o , Sasha Levin Subject: [PATCH 5.10 48/73] ext4: make ext4_es_insert_extent() return void Date: Wed, 13 Mar 2024 12:46:15 -0400 Message-ID: <20240313164640.616049-49-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Baokun Li [ Upstream commit 6c120399cde6b1b5cf65ce403765c579fb3d3e50 ] Now ext4_es_insert_extent() never return error, so make it return void. Signed-off-by: Baokun Li Reviewed-by: Jan Kara Link: https://lore.kernel.org/r/20230424033846.4732-12-libaokun1@huawei.com Signed-off-by: Theodore Ts'o Stable-dep-of: acf795dc161f ("ext4: convert to exclusive lock while inserti= ng delalloc extents") Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- fs/ext4/extents.c | 5 +++-- fs/ext4/extents_status.c | 14 ++++++-------- fs/ext4/extents_status.h | 6 +++--- fs/ext4/inode.c | 21 ++++++--------------- 4 files changed, 18 insertions(+), 28 deletions(-) diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 68aa8760cb465..9e12592727914 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c @@ -3107,8 +3107,9 @@ static int ext4_zeroout_es(struct inode *inode, struc= t ext4_extent *ex) if (ee_len =3D=3D 0) return 0; =20 - return ext4_es_insert_extent(inode, ee_block, ee_len, ee_pblock, - EXTENT_STATUS_WRITTEN); + ext4_es_insert_extent(inode, ee_block, ee_len, ee_pblock, + EXTENT_STATUS_WRITTEN); + return 0; } =20 /* FIXME!! we need to try to merge to left or right after zero-out */ diff --git a/fs/ext4/extents_status.c b/fs/ext4/extents_status.c index cccbdfd49a86b..f37e62546745b 100644 --- a/fs/ext4/extents_status.c +++ b/fs/ext4/extents_status.c @@ -846,12 +846,10 @@ static int __es_insert_extent(struct inode *inode, st= ruct extent_status *newes, /* * ext4_es_insert_extent() adds information to an inode's extent * status tree. - * - * Return 0 on success, error code on failure. */ -int ext4_es_insert_extent(struct inode *inode, ext4_lblk_t lblk, - ext4_lblk_t len, ext4_fsblk_t pblk, - unsigned int status) +void ext4_es_insert_extent(struct inode *inode, ext4_lblk_t lblk, + ext4_lblk_t len, ext4_fsblk_t pblk, + unsigned int status) { struct extent_status newes; ext4_lblk_t end =3D lblk + len - 1; @@ -863,13 +861,13 @@ int ext4_es_insert_extent(struct inode *inode, ext4_l= blk_t lblk, bool revise_pending =3D false; =20 if (EXT4_SB(inode->i_sb)->s_mount_state & EXT4_FC_REPLAY) - return 0; + return; =20 es_debug("add [%u/%u) %llu %x to extent status tree of inode %lu\n", lblk, len, pblk, status, inode->i_ino); =20 if (!len) - return 0; + return; =20 BUG_ON(end < lblk); =20 @@ -938,7 +936,7 @@ int ext4_es_insert_extent(struct inode *inode, ext4_lbl= k_t lblk, goto retry; =20 ext4_es_print_tree(inode); - return 0; + return; } =20 /* diff --git a/fs/ext4/extents_status.h b/fs/ext4/extents_status.h index 4ec30a7982605..481ec4381bee6 100644 --- a/fs/ext4/extents_status.h +++ b/fs/ext4/extents_status.h @@ -127,9 +127,9 @@ extern int __init ext4_init_es(void); extern void ext4_exit_es(void); extern void ext4_es_init_tree(struct ext4_es_tree *tree); =20 -extern int ext4_es_insert_extent(struct inode *inode, ext4_lblk_t lblk, - ext4_lblk_t len, ext4_fsblk_t pblk, - unsigned int status); +extern void ext4_es_insert_extent(struct inode *inode, ext4_lblk_t lblk, + ext4_lblk_t len, ext4_fsblk_t pblk, + unsigned int status); extern void ext4_es_cache_extent(struct inode *inode, ext4_lblk_t lblk, ext4_lblk_t len, ext4_fsblk_t pblk, unsigned int status); diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 365c4d3a434ab..ab2a7f9902887 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -589,10 +589,8 @@ int ext4_map_blocks(handle_t *handle, struct inode *in= ode, ext4_es_scan_range(inode, &ext4_es_is_delayed, map->m_lblk, map->m_lblk + map->m_len - 1)) status |=3D EXTENT_STATUS_DELAYED; - ret =3D ext4_es_insert_extent(inode, map->m_lblk, - map->m_len, map->m_pblk, status); - if (ret < 0) - retval =3D ret; + ext4_es_insert_extent(inode, map->m_lblk, map->m_len, + map->m_pblk, status); } up_read((&EXT4_I(inode)->i_data_sem)); =20 @@ -701,12 +699,8 @@ int ext4_map_blocks(handle_t *handle, struct inode *in= ode, ext4_es_scan_range(inode, &ext4_es_is_delayed, map->m_lblk, map->m_lblk + map->m_len - 1)) status |=3D EXTENT_STATUS_DELAYED; - ret =3D ext4_es_insert_extent(inode, map->m_lblk, map->m_len, - map->m_pblk, status); - if (ret < 0) { - retval =3D ret; - goto out_sem; - } + ext4_es_insert_extent(inode, map->m_lblk, map->m_len, + map->m_pblk, status); } =20 out_sem: @@ -1800,7 +1794,6 @@ static int ext4_da_map_blocks(struct inode *inode, se= ctor_t iblock, set_buffer_new(bh); set_buffer_delay(bh); } else if (retval > 0) { - int ret; unsigned int status; =20 if (unlikely(retval !=3D map->m_len)) { @@ -1813,10 +1806,8 @@ static int ext4_da_map_blocks(struct inode *inode, s= ector_t iblock, =20 status =3D map->m_flags & EXT4_MAP_UNWRITTEN ? EXTENT_STATUS_UNWRITTEN : EXTENT_STATUS_WRITTEN; - ret =3D ext4_es_insert_extent(inode, map->m_lblk, map->m_len, - map->m_pblk, status); - if (ret !=3D 0) - retval =3D ret; + ext4_es_insert_extent(inode, map->m_lblk, map->m_len, + map->m_pblk, status); } =20 out_unlock: --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B10D415CD6B; Wed, 13 Mar 2024 16:47:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348456; cv=none; b=csmnetktS2TtwYjFz3+lneo4X83FcjIL2s9+x8KcYZQdmHXqyEG7XDw+w2GpYK+xk3SUUMTmcXta2F4wkWmRfjdeZcKy365gGUl2V3dX9TfV0hxKZjKGrI48rK/gia+ux53USAyMxdpTJJW0ti2D6XmiXdoVbC6nwyFlSjd04vI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348456; c=relaxed/simple; bh=qn2fM80E1w/rF1OY2H5UOkBO47+ZXtu86DalO7stLGI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Laawy6Bx/kVCKforl+akN8q00LkJVUse26QuoGECdjSMOPxbID8azpW5MpWjq7IIEipWesbjHqyzJTPJwKIMXbq1bpedop52EuusM1cNdLrpET4y0AXGAW5LFpN0c93oWYjB3YS4il1lYuOyUx8e9QWitT5tCKH2C2ya7ihA0Hk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=UcaKGuj8; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="UcaKGuj8" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 56F81C433C7; Wed, 13 Mar 2024 16:47:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348456; bh=qn2fM80E1w/rF1OY2H5UOkBO47+ZXtu86DalO7stLGI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=UcaKGuj8n+ECGlm4qy9tcq3fnDefMBpr9fd3W7cIA2cN/I+T5pFYY/hdFeF2JCZuN 3+Y7J51A08mHzvDqLLlJ/vEJW4njedKWGzaVlxlfOBQXON4Aurzt0GmuKEetuU6gGG WWP668KQgVhV1dCgLdHWQmMuD2sfZm7/GtjNP9AqGhk1L8woyfY+NwY4sQIkg+BlW7 tclJjZG/VcPaoKa++gRBERvUCmW9I4g5aY+I7m4tw5+y7iUWUVAQYC7uh41O4iERwq gEfAVy4R4Fbya3fxo2Df6fK7mNFIdxEVoM6iZr0PucviXqdOBQnauTwD1rvpqtwqZN mJw7a6yEKAhHA== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Zhang Yi , Jan Kara , Theodore Ts'o , Sasha Levin Subject: [PATCH 5.10 49/73] ext4: refactor ext4_da_map_blocks() Date: Wed, 13 Mar 2024 12:46:16 -0400 Message-ID: <20240313164640.616049-50-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Zhang Yi [ Upstream commit 3fcc2b887a1ba4c1f45319cd8c54daa263ecbc36 ] Refactor and cleanup ext4_da_map_blocks(), reduce some unnecessary parameters and branches, no logic changes. Signed-off-by: Zhang Yi Reviewed-by: Jan Kara Link: https://lore.kernel.org/r/20240127015825.1608160-2-yi.zhang@huaweiclo= ud.com Signed-off-by: Theodore Ts'o Stable-dep-of: acf795dc161f ("ext4: convert to exclusive lock while inserti= ng delalloc extents") Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- fs/ext4/inode.c | 39 +++++++++++++++++---------------------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index ab2a7f9902887..64162470a7e6c 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -1729,7 +1729,6 @@ static int ext4_da_map_blocks(struct inode *inode, se= ctor_t iblock, /* Lookup extent status tree firstly */ if (ext4_es_lookup_extent(inode, iblock, NULL, &es)) { if (ext4_es_is_hole(&es)) { - retval =3D 0; down_read(&EXT4_I(inode)->i_data_sem); goto add_delayed; } @@ -1774,26 +1773,9 @@ static int ext4_da_map_blocks(struct inode *inode, s= ector_t iblock, retval =3D ext4_ext_map_blocks(NULL, inode, map, 0); else retval =3D ext4_ind_map_blocks(NULL, inode, map, 0); - -add_delayed: - if (retval =3D=3D 0) { - int ret; - - /* - * XXX: __block_prepare_write() unmaps passed block, - * is it OK? - */ - - ret =3D ext4_insert_delayed_block(inode, map->m_lblk); - if (ret !=3D 0) { - retval =3D ret; - goto out_unlock; - } - - map_bh(bh, inode->i_sb, invalid_block); - set_buffer_new(bh); - set_buffer_delay(bh); - } else if (retval > 0) { + if (retval < 0) + goto out_unlock; + if (retval > 0) { unsigned int status; =20 if (unlikely(retval !=3D map->m_len)) { @@ -1808,11 +1790,24 @@ static int ext4_da_map_blocks(struct inode *inode, = sector_t iblock, EXTENT_STATUS_UNWRITTEN : EXTENT_STATUS_WRITTEN; ext4_es_insert_extent(inode, map->m_lblk, map->m_len, map->m_pblk, status); + goto out_unlock; } =20 +add_delayed: + /* + * XXX: __block_prepare_write() unmaps passed block, + * is it OK? + */ + retval =3D ext4_insert_delayed_block(inode, map->m_lblk); + if (retval) + goto out_unlock; + + map_bh(bh, inode->i_sb, invalid_block); + set_buffer_new(bh); + set_buffer_delay(bh); + out_unlock: up_read((&EXT4_I(inode)->i_data_sem)); - return retval; } =20 --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B256515D5A9; Wed, 13 Mar 2024 16:47:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348457; cv=none; b=AFZbLFCb2X2M2ouohYWnPyFcmw198yMKc3pOkTsKdqzesW+zQZgZ2bQehPxfsles+B6GDzLQ97NmD/sEN5q8jKnuS3H0X8IngaUtZnqj47KfNluKXfVduIAUIlBn+2wOEwMcGRKL1EcuuWdyO3sL0Gm/nVMYgkKOWp2iEueRlEY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348457; c=relaxed/simple; bh=he7vDD0F7WTBM5sUNCP71TiC7WyKB9hFx2d1SuU2sR8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rnJVsHAVgLIUzRLFgOKE5vwI0ptYcJpK6wb4Q4JkwJ8N1Z8Kn6OaORqYPNAG51aPe9mhHbZyXCkFI06bn/mSkF9kvEdbUuIQbQIZDor5B40mfz9r2iRrfqH7laTUKh+u/8daDa+Y7KDwvmB5iE1hCbmTKbrcSek+YRSpoC/t95c= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=MgDOTEr4; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="MgDOTEr4" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6DF09C433F1; Wed, 13 Mar 2024 16:47:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348457; bh=he7vDD0F7WTBM5sUNCP71TiC7WyKB9hFx2d1SuU2sR8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=MgDOTEr4AzyTlbw+ZZoTdf07+dlAjVSD13ygwaSbFTiVs3Nl8G7Fr47+cjouG/hug 9cCXywinTNnUS2qiWJ7UjD1/PFTuElpUcBsr8O3V4LaP+Zjmpa7/8XysTDw0H23Xcp y3OgbDsiJ7BIRgQ3NbdmmLqxNvcESK1OHuYOFZ5XO35aJWVeJ78Zm3uu4ADSklfnlM MUTK+MdgKJ7J1xjTn3ttSHO98DLrGQeA7pQfu4yirODEKlkHSPx2nEERXzdgHv3gjf 7XcuTOvwlLpRBy3fHshXCLogdsuWL2p30NsYBbj07Ry6dJzlDdeYzUYpeZ1w/0ziCi 3DO/A8zgX+5xA== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Zhang Yi , Jan Kara , Theodore Ts'o , Sasha Levin Subject: [PATCH 5.10 50/73] ext4: convert to exclusive lock while inserting delalloc extents Date: Wed, 13 Mar 2024 12:46:17 -0400 Message-ID: <20240313164640.616049-51-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Zhang Yi [ Upstream commit acf795dc161f3cf481db20f05db4250714e375e5 ] ext4_da_map_blocks() only hold i_data_sem in shared mode and i_rwsem when inserting delalloc extents, it could be raced by another querying path of ext4_map_blocks() without i_rwsem, .e.g buffered read path. Suppose we buffered read a file containing just a hole, and without any cached extents tree, then it is raced by another delayed buffered write to the same area or the near area belongs to the same hole, and the new delalloc extent could be overwritten to a hole extent. pread() pwrite() filemap_read_folio() ext4_mpage_readpages() ext4_map_blocks() down_read(i_data_sem) ext4_ext_determine_hole() //find hole ext4_ext_put_gap_in_cache() ext4_es_find_extent_range() //no delalloc extent ext4_da_map_blocks() down_read(i_data_sem) ext4_insert_delayed_block() //insert delalloc extent ext4_es_insert_extent() //overwrite delalloc extent to hole This race could lead to inconsistent delalloc extents tree and incorrect reserved space counter. Fix this by converting to hold i_data_sem in exclusive mode when adding a new delalloc extent in ext4_da_map_blocks(). Cc: stable@vger.kernel.org Signed-off-by: Zhang Yi Suggested-by: Jan Kara Reviewed-by: Jan Kara Link: https://lore.kernel.org/r/20240127015825.1608160-3-yi.zhang@huaweiclo= ud.com Signed-off-by: Theodore Ts'o Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- fs/ext4/inode.c | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 64162470a7e6c..8b48ed351c4b9 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -1728,10 +1728,8 @@ static int ext4_da_map_blocks(struct inode *inode, s= ector_t iblock, =20 /* Lookup extent status tree firstly */ if (ext4_es_lookup_extent(inode, iblock, NULL, &es)) { - if (ext4_es_is_hole(&es)) { - down_read(&EXT4_I(inode)->i_data_sem); + if (ext4_es_is_hole(&es)) goto add_delayed; - } =20 /* * Delayed extent could be allocated by fallocate. @@ -1773,8 +1771,10 @@ static int ext4_da_map_blocks(struct inode *inode, s= ector_t iblock, retval =3D ext4_ext_map_blocks(NULL, inode, map, 0); else retval =3D ext4_ind_map_blocks(NULL, inode, map, 0); - if (retval < 0) - goto out_unlock; + if (retval < 0) { + up_read(&EXT4_I(inode)->i_data_sem); + return retval; + } if (retval > 0) { unsigned int status; =20 @@ -1790,24 +1790,21 @@ static int ext4_da_map_blocks(struct inode *inode, = sector_t iblock, EXTENT_STATUS_UNWRITTEN : EXTENT_STATUS_WRITTEN; ext4_es_insert_extent(inode, map->m_lblk, map->m_len, map->m_pblk, status); - goto out_unlock; + up_read(&EXT4_I(inode)->i_data_sem); + return retval; } + up_read(&EXT4_I(inode)->i_data_sem); =20 add_delayed: - /* - * XXX: __block_prepare_write() unmaps passed block, - * is it OK? - */ + down_write(&EXT4_I(inode)->i_data_sem); retval =3D ext4_insert_delayed_block(inode, map->m_lblk); + up_write(&EXT4_I(inode)->i_data_sem); if (retval) - goto out_unlock; + return retval; =20 map_bh(bh, inode->i_sb, invalid_block); set_buffer_new(bh); set_buffer_delay(bh); - -out_unlock: - up_read((&EXT4_I(inode)->i_data_sem)); return retval; } =20 --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A187F15D5C9; Wed, 13 Mar 2024 16:47:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348458; cv=none; b=GJNcQzWd1VxvCXAZEvYe74RXNMGgd/+faAPy0hj+ptI7loY2t1Ksh7nA4q4G1N/AWXWRCLv9UuhsmqpcmcWdU34bR4HpDQzcy/jTglmXMxDTF4xj44HB75uJu183+dDvUHzeegFKNGDPfiwlddAfbS9KtXyfE7GxioBVBRFGnZU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348458; c=relaxed/simple; bh=5O58s6UR/Yv7a5XWWOqdt7PsoVag5W8FH/r7YM6gtL0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=pzEnNZjBKOwUT7mirmGiYy72xDivCCUXeJWDHZvcx5VW23m1Fk98B/WtvJtF2RsEUAS1EFjsck4UO+xLPomOn0JS21iMu5nTe/X7RlIImoRUQUKh41zypsF0HyarWBL03XJ9eh8LDxeApwVl5fpnZc3h3YPx4WAQYYKCP8wAjjY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=H7mZhO34; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="H7mZhO34" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 90224C43394; Wed, 13 Mar 2024 16:47:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348458; bh=5O58s6UR/Yv7a5XWWOqdt7PsoVag5W8FH/r7YM6gtL0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=H7mZhO343l9YLrjHFhMV1uVanWyYTu+l3D1inIlm/VopuXbSDegU8iAWDtgXvP5dJ uR3HAakXaJQcWtPJ0nJQcahWUV1NNC37gF2hzQbfTlL2Xk00y1LYozcgMtOBPMi6b9 5lXykb02JX+35aMZf6V5SAGKvssy2zEAD6mYmIZqRdAkgLWZvdhlxfwW32VOHf1erk yjlmgSclm5H9pFxEWf0MpIfkqDYnTK/ivZpLyxaw9bYln7Lq9OWo+WLJAvV3fN9EE7 f2FLwBW0akz88elPXvrTZRzqVAmy2tvupRSnd0Lvha6flfQHR/2NOaCKJN/azfyerj TZwcW1QfU891Q== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Andres Beltran , Andrea Parri , Michael Kelley , Wei Liu , Sasha Levin Subject: [PATCH 5.10 51/73] Drivers: hv: vmbus: Add vmbus_requestor data structure for VMBus hardening Date: Wed, 13 Mar 2024 12:46:18 -0400 Message-ID: <20240313164640.616049-52-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Andres Beltran [ Upstream commit e8b7db38449ac5b950a3f00519171c4be3e226ff ] Currently, VMbus drivers use pointers into guest memory as request IDs for interactions with Hyper-V. To be more robust in the face of errors or malicious behavior from a compromised Hyper-V, avoid exposing guest memory addresses to Hyper-V. Also avoid Hyper-V giving back a bad request ID that is then treated as the address of a guest data structure with no validation. Instead, encapsulate these memory addresses and provide small integers as request IDs. Signed-off-by: Andres Beltran Co-developed-by: Andrea Parri (Microsoft) Signed-off-by: Andrea Parri (Microsoft) Reviewed-by: Michael Kelley Reviewed-by: Wei Liu Link: https://lore.kernel.org/r/20201109100402.8946-2-parri.andrea@gmail.com Signed-off-by: Wei Liu Stable-dep-of: 9cae43da9867 ("hv_netvsc: Register VF in netvsc_probe if NET= _DEVICE_REGISTER missed") Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- drivers/hv/channel.c | 174 ++++++++++++++++++++++++++++++++++++-- drivers/hv/hyperv_vmbus.h | 3 +- drivers/hv/ring_buffer.c | 29 ++++++- include/linux/hyperv.h | 22 +++++ 4 files changed, 219 insertions(+), 9 deletions(-) diff --git a/drivers/hv/channel.c b/drivers/hv/channel.c index f064fa6ef181a..a59ab2f3d68e1 100644 --- a/drivers/hv/channel.c +++ b/drivers/hv/channel.c @@ -503,6 +503,70 @@ int vmbus_establish_gpadl(struct vmbus_channel *channe= l, void *kbuffer, } EXPORT_SYMBOL_GPL(vmbus_establish_gpadl); =20 +/** + * request_arr_init - Allocates memory for the requestor array. Each slot + * keeps track of the next available slot in the array. Initially, each + * slot points to the next one (as in a Linked List). The last slot + * does not point to anything, so its value is U64_MAX by default. + * @size The size of the array + */ +static u64 *request_arr_init(u32 size) +{ + int i; + u64 *req_arr; + + req_arr =3D kcalloc(size, sizeof(u64), GFP_KERNEL); + if (!req_arr) + return NULL; + + for (i =3D 0; i < size - 1; i++) + req_arr[i] =3D i + 1; + + /* Last slot (no more available slots) */ + req_arr[i] =3D U64_MAX; + + return req_arr; +} + +/* + * vmbus_alloc_requestor - Initializes @rqstor's fields. + * Index 0 is the first free slot + * @size: Size of the requestor array + */ +static int vmbus_alloc_requestor(struct vmbus_requestor *rqstor, u32 size) +{ + u64 *rqst_arr; + unsigned long *bitmap; + + rqst_arr =3D request_arr_init(size); + if (!rqst_arr) + return -ENOMEM; + + bitmap =3D bitmap_zalloc(size, GFP_KERNEL); + if (!bitmap) { + kfree(rqst_arr); + return -ENOMEM; + } + + rqstor->req_arr =3D rqst_arr; + rqstor->req_bitmap =3D bitmap; + rqstor->size =3D size; + rqstor->next_request_id =3D 0; + spin_lock_init(&rqstor->req_lock); + + return 0; +} + +/* + * vmbus_free_requestor - Frees memory allocated for @rqstor + * @rqstor: Pointer to the requestor struct + */ +static void vmbus_free_requestor(struct vmbus_requestor *rqstor) +{ + kfree(rqstor->req_arr); + bitmap_free(rqstor->req_bitmap); +} + static int __vmbus_open(struct vmbus_channel *newchannel, void *userdata, u32 userdatalen, void (*onchannelcallback)(void *context), void *context) @@ -523,6 +587,12 @@ static int __vmbus_open(struct vmbus_channel *newchann= el, if (newchannel->state !=3D CHANNEL_OPEN_STATE) return -EINVAL; =20 + /* Create and init requestor */ + if (newchannel->rqstor_size) { + if (vmbus_alloc_requestor(&newchannel->requestor, newchannel->rqstor_siz= e)) + return -ENOMEM; + } + newchannel->state =3D CHANNEL_OPENING_STATE; newchannel->onchannel_callback =3D onchannelcallback; newchannel->channel_callback_context =3D context; @@ -626,6 +696,7 @@ static int __vmbus_open(struct vmbus_channel *newchanne= l, error_clean_ring: hv_ringbuffer_cleanup(&newchannel->outbound); hv_ringbuffer_cleanup(&newchannel->inbound); + vmbus_free_requestor(&newchannel->requestor); newchannel->state =3D CHANNEL_OPEN_STATE; return err; } @@ -808,6 +879,9 @@ static int vmbus_close_internal(struct vmbus_channel *c= hannel) channel->ringbuffer_gpadlhandle =3D 0; } =20 + if (!ret) + vmbus_free_requestor(&channel->requestor); + return ret; } =20 @@ -888,7 +962,7 @@ int vmbus_sendpacket(struct vmbus_channel *channel, voi= d *buffer, /* in 8-bytes granularity */ desc.offset8 =3D sizeof(struct vmpacket_descriptor) >> 3; desc.len8 =3D (u16)(packetlen_aligned >> 3); - desc.trans_id =3D requestid; + desc.trans_id =3D VMBUS_RQST_ERROR; /* will be updated in hv_ringbuffer_w= rite() */ =20 bufferlist[0].iov_base =3D &desc; bufferlist[0].iov_len =3D sizeof(struct vmpacket_descriptor); @@ -897,7 +971,7 @@ int vmbus_sendpacket(struct vmbus_channel *channel, voi= d *buffer, bufferlist[2].iov_base =3D &aligned_data; bufferlist[2].iov_len =3D (packetlen_aligned - packetlen); =20 - return hv_ringbuffer_write(channel, bufferlist, num_vecs); + return hv_ringbuffer_write(channel, bufferlist, num_vecs, requestid); } EXPORT_SYMBOL(vmbus_sendpacket); =20 @@ -939,7 +1013,7 @@ int vmbus_sendpacket_pagebuffer(struct vmbus_channel *= channel, desc.flags =3D VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED; desc.dataoffset8 =3D descsize >> 3; /* in 8-bytes granularity */ desc.length8 =3D (u16)(packetlen_aligned >> 3); - desc.transactionid =3D requestid; + desc.transactionid =3D VMBUS_RQST_ERROR; /* will be updated in hv_ringbuf= fer_write() */ desc.reserved =3D 0; desc.rangecount =3D pagecount; =20 @@ -956,7 +1030,7 @@ int vmbus_sendpacket_pagebuffer(struct vmbus_channel *= channel, bufferlist[2].iov_base =3D &aligned_data; bufferlist[2].iov_len =3D (packetlen_aligned - packetlen); =20 - return hv_ringbuffer_write(channel, bufferlist, 3); + return hv_ringbuffer_write(channel, bufferlist, 3, requestid); } EXPORT_SYMBOL_GPL(vmbus_sendpacket_pagebuffer); =20 @@ -983,7 +1057,7 @@ int vmbus_sendpacket_mpb_desc(struct vmbus_channel *ch= annel, desc->flags =3D VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED; desc->dataoffset8 =3D desc_size >> 3; /* in 8-bytes granularity */ desc->length8 =3D (u16)(packetlen_aligned >> 3); - desc->transactionid =3D requestid; + desc->transactionid =3D VMBUS_RQST_ERROR; /* will be updated in hv_ringbu= ffer_write() */ desc->reserved =3D 0; desc->rangecount =3D 1; =20 @@ -994,7 +1068,7 @@ int vmbus_sendpacket_mpb_desc(struct vmbus_channel *ch= annel, bufferlist[2].iov_base =3D &aligned_data; bufferlist[2].iov_len =3D (packetlen_aligned - packetlen); =20 - return hv_ringbuffer_write(channel, bufferlist, 3); + return hv_ringbuffer_write(channel, bufferlist, 3, requestid); } EXPORT_SYMBOL_GPL(vmbus_sendpacket_mpb_desc); =20 @@ -1042,3 +1116,91 @@ int vmbus_recvpacket_raw(struct vmbus_channel *chann= el, void *buffer, buffer_actual_len, requestid, true); } EXPORT_SYMBOL_GPL(vmbus_recvpacket_raw); + +/* + * vmbus_next_request_id - Returns a new request id. It is also + * the index at which the guest memory address is stored. + * Uses a spin lock to avoid race conditions. + * @rqstor: Pointer to the requestor struct + * @rqst_add: Guest memory address to be stored in the array + */ +u64 vmbus_next_request_id(struct vmbus_requestor *rqstor, u64 rqst_addr) +{ + unsigned long flags; + u64 current_id; + const struct vmbus_channel *channel =3D + container_of(rqstor, const struct vmbus_channel, requestor); + + /* Check rqstor has been initialized */ + if (!channel->rqstor_size) + return VMBUS_NO_RQSTOR; + + spin_lock_irqsave(&rqstor->req_lock, flags); + current_id =3D rqstor->next_request_id; + + /* Requestor array is full */ + if (current_id >=3D rqstor->size) { + spin_unlock_irqrestore(&rqstor->req_lock, flags); + return VMBUS_RQST_ERROR; + } + + rqstor->next_request_id =3D rqstor->req_arr[current_id]; + rqstor->req_arr[current_id] =3D rqst_addr; + + /* The already held spin lock provides atomicity */ + bitmap_set(rqstor->req_bitmap, current_id, 1); + + spin_unlock_irqrestore(&rqstor->req_lock, flags); + + /* + * Cannot return an ID of 0, which is reserved for an unsolicited + * message from Hyper-V. + */ + return current_id + 1; +} +EXPORT_SYMBOL_GPL(vmbus_next_request_id); + +/* + * vmbus_request_addr - Returns the memory address stored at @trans_id + * in @rqstor. Uses a spin lock to avoid race conditions. + * @rqstor: Pointer to the requestor struct + * @trans_id: Request id sent back from Hyper-V. Becomes the requestor's + * next request id. + */ +u64 vmbus_request_addr(struct vmbus_requestor *rqstor, u64 trans_id) +{ + unsigned long flags; + u64 req_addr; + const struct vmbus_channel *channel =3D + container_of(rqstor, const struct vmbus_channel, requestor); + + /* Check rqstor has been initialized */ + if (!channel->rqstor_size) + return VMBUS_NO_RQSTOR; + + /* Hyper-V can send an unsolicited message with ID of 0 */ + if (!trans_id) + return trans_id; + + spin_lock_irqsave(&rqstor->req_lock, flags); + + /* Data corresponding to trans_id is stored at trans_id - 1 */ + trans_id--; + + /* Invalid trans_id */ + if (trans_id >=3D rqstor->size || !test_bit(trans_id, rqstor->req_bitmap)= ) { + spin_unlock_irqrestore(&rqstor->req_lock, flags); + return VMBUS_RQST_ERROR; + } + + req_addr =3D rqstor->req_arr[trans_id]; + rqstor->req_arr[trans_id] =3D rqstor->next_request_id; + rqstor->next_request_id =3D trans_id; + + /* The already held spin lock provides atomicity */ + bitmap_clear(rqstor->req_bitmap, trans_id, 1); + + spin_unlock_irqrestore(&rqstor->req_lock, flags); + return req_addr; +} +EXPORT_SYMBOL_GPL(vmbus_request_addr); diff --git a/drivers/hv/hyperv_vmbus.h b/drivers/hv/hyperv_vmbus.h index 7845fa5de79e9..601660bca5d47 100644 --- a/drivers/hv/hyperv_vmbus.h +++ b/drivers/hv/hyperv_vmbus.h @@ -180,7 +180,8 @@ int hv_ringbuffer_init(struct hv_ring_buffer_info *ring= _info, void hv_ringbuffer_cleanup(struct hv_ring_buffer_info *ring_info); =20 int hv_ringbuffer_write(struct vmbus_channel *channel, - const struct kvec *kv_list, u32 kv_count); + const struct kvec *kv_list, u32 kv_count, + u64 requestid); =20 int hv_ringbuffer_read(struct vmbus_channel *channel, void *buffer, u32 buflen, u32 *buffer_actual_len, diff --git a/drivers/hv/ring_buffer.c b/drivers/hv/ring_buffer.c index 7ed6fad3fa8ff..a0ba6ac487368 100644 --- a/drivers/hv/ring_buffer.c +++ b/drivers/hv/ring_buffer.c @@ -261,7 +261,8 @@ EXPORT_SYMBOL_GPL(hv_ringbuffer_spinlock_busy); =20 /* Write to the ring buffer. */ int hv_ringbuffer_write(struct vmbus_channel *channel, - const struct kvec *kv_list, u32 kv_count) + const struct kvec *kv_list, u32 kv_count, + u64 requestid) { int i; u32 bytes_avail_towrite; @@ -271,6 +272,8 @@ int hv_ringbuffer_write(struct vmbus_channel *channel, u64 prev_indices; unsigned long flags; struct hv_ring_buffer_info *outring_info =3D &channel->outbound; + struct vmpacket_descriptor *desc =3D kv_list[0].iov_base; + u64 rqst_id =3D VMBUS_NO_RQSTOR; =20 if (channel->rescind) return -ENODEV; @@ -313,6 +316,23 @@ int hv_ringbuffer_write(struct vmbus_channel *channel, kv_list[i].iov_len); } =20 + /* + * Allocate the request ID after the data has been copied into the + * ring buffer. Once this request ID is allocated, the completion + * path could find the data and free it. + */ + + if (desc->flags =3D=3D VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED) { + rqst_id =3D vmbus_next_request_id(&channel->requestor, requestid); + if (rqst_id =3D=3D VMBUS_RQST_ERROR) { + spin_unlock_irqrestore(&outring_info->ring_lock, flags); + pr_err("No request id available\n"); + return -EAGAIN; + } + } + desc =3D hv_get_ring_buffer(outring_info) + old_write; + desc->trans_id =3D (rqst_id =3D=3D VMBUS_NO_RQSTOR) ? requestid : rqst_id; + /* Set previous packet start */ prev_indices =3D hv_get_ring_bufferindices(outring_info); =20 @@ -332,8 +352,13 @@ int hv_ringbuffer_write(struct vmbus_channel *channel, =20 hv_signal_on_write(old_write, channel); =20 - if (channel->rescind) + if (channel->rescind) { + if (rqst_id !=3D VMBUS_NO_RQSTOR) { + /* Reclaim request ID to avoid leak of IDs */ + vmbus_request_addr(&channel->requestor, rqst_id); + } return -ENODEV; + } =20 return 0; } diff --git a/include/linux/hyperv.h b/include/linux/hyperv.h index eada4d8d65879..4cb65a79d92f6 100644 --- a/include/linux/hyperv.h +++ b/include/linux/hyperv.h @@ -764,6 +764,22 @@ enum vmbus_device_type { HV_UNKNOWN, }; =20 +/* + * Provides request ids for VMBus. Encapsulates guest memory + * addresses and stores the next available slot in req_arr + * to generate new ids in constant time. + */ +struct vmbus_requestor { + u64 *req_arr; + unsigned long *req_bitmap; /* is a given slot available? */ + u32 size; + u64 next_request_id; + spinlock_t req_lock; /* provides atomicity */ +}; + +#define VMBUS_NO_RQSTOR U64_MAX +#define VMBUS_RQST_ERROR (U64_MAX - 1) + struct vmbus_device { u16 dev_type; guid_t guid; @@ -988,8 +1004,14 @@ struct vmbus_channel { u32 fuzz_testing_interrupt_delay; u32 fuzz_testing_message_delay; =20 + /* request/transaction ids for VMBus */ + struct vmbus_requestor requestor; + u32 rqstor_size; }; =20 +u64 vmbus_next_request_id(struct vmbus_requestor *rqstor, u64 rqst_addr); +u64 vmbus_request_addr(struct vmbus_requestor *rqstor, u64 trans_id); + static inline bool is_hvsock_channel(const struct vmbus_channel *c) { return !!(c->offermsg.offer.chn_flags & --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3676C57863; Wed, 13 Mar 2024 16:47:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348460; cv=none; b=nf2TD1Z3lFYDHTDNJMcjEM1xKEYJMS0k+jKeIeqJIQvIOIg9hnnzXqTTwrzgLBwW4sLD3QGy76pGYh1n05OyX7drmlpwuXnJhT+6+Wl2UoVk18TS0uGM411g/xwFL2xJEPqrfe7oMByJOIXCP8NzV95UE+JsfP8eAvavuI+J6I4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348460; c=relaxed/simple; bh=67joID66XQABK1cTcPNd6BUkVrz/MyGfrjRExWE0uTY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mtDcdkstvCWA3rTMV3+6xH4amznUjIEhFlVMcFdRPtm0kKnzMFzKyD7Zsk0olKo0Zr0O0ePwOf8rctsCCAKwwVK12bqpb3kuhfrW//SOLT39f3afQycaiXp2cCvAEoeNOzBIC3b7sBvLzfHOVI6aoMLO/Hj6MuiAC35L1nVbdzI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=OS0dhJy2; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="OS0dhJy2" Received: by smtp.kernel.org (Postfix) with ESMTPSA id D2CB8C43390; Wed, 13 Mar 2024 16:47:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348460; bh=67joID66XQABK1cTcPNd6BUkVrz/MyGfrjRExWE0uTY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=OS0dhJy2HGGEJCrlOpVTXQYwqP5ciHcaeOKC1llwkfW4FLF429+33p42bbKCavPzf eEe9epmfZQ9ygXyl0YMbPLX/QaejN3uVOON4DvdBC8YWd77xjJ9H1MHb/Ow8/orsRZ +lyOF2tVJ4mKNRKo9K3uja2c3958iBugtuqiaftZneTxgw7GoirFks/Z5vvohKVdw1 4mjghSp4gxog2vK2X/XddtoyiF8J56p7C8xjg6+B5G3VqOVdwc5QdkCrMirWWBmC5s lDg9e8YmpomRaHAWl/hAEu3v3cI5QbY9LndX+taVKTLoQ2funhATyncNRbVtbkvtXA gEC1Rg8t8taLQ== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Andres Beltran , Andrea Parri , Michael Kelley , Jakub Kicinski , Wei Liu , "David S. Miller" , netdev@vger.kernel.org, Sasha Levin Subject: [PATCH 5.10 52/73] hv_netvsc: Use vmbus_requestor to generate transaction IDs for VMBus hardening Date: Wed, 13 Mar 2024 12:46:19 -0400 Message-ID: <20240313164640.616049-53-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Andres Beltran [ Upstream commit 4d18fcc95f50950a99bd940d4e61a983f91d267a ] Currently, pointers to guest memory are passed to Hyper-V as transaction IDs in netvsc. In the face of errors or malicious behavior in Hyper-V, netvsc should not expose or trust the transaction IDs returned by Hyper-V to be valid guest memory addresses. Instead, use small integers generated by vmbus_requestor as requests (transaction) IDs. Signed-off-by: Andres Beltran Co-developed-by: Andrea Parri (Microsoft) Signed-off-by: Andrea Parri (Microsoft) Reviewed-by: Michael Kelley Acked-by: Jakub Kicinski Reviewed-by: Wei Liu Cc: "David S. Miller" Cc: Jakub Kicinski Cc: netdev@vger.kernel.org Link: https://lore.kernel.org/r/20201109100402.8946-4-parri.andrea@gmail.com Signed-off-by: Wei Liu Stable-dep-of: 9cae43da9867 ("hv_netvsc: Register VF in netvsc_probe if NET= _DEVICE_REGISTER missed") Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- drivers/net/hyperv/hyperv_net.h | 13 +++++++++++++ drivers/net/hyperv/netvsc.c | 22 ++++++++++++++++------ drivers/net/hyperv/rndis_filter.c | 1 + include/linux/hyperv.h | 1 + 4 files changed, 31 insertions(+), 6 deletions(-) diff --git a/drivers/net/hyperv/hyperv_net.h b/drivers/net/hyperv/hyperv_ne= t.h index 367878493e704..15652d7951f9e 100644 --- a/drivers/net/hyperv/hyperv_net.h +++ b/drivers/net/hyperv/hyperv_net.h @@ -847,6 +847,19 @@ struct nvsp_message { =20 #define NETVSC_XDP_HDRM 256 =20 +#define NETVSC_MIN_OUT_MSG_SIZE (sizeof(struct vmpacket_descriptor) + \ + sizeof(struct nvsp_message)) +#define NETVSC_MIN_IN_MSG_SIZE sizeof(struct vmpacket_descriptor) + +/* Estimated requestor size: + * out_ring_size/min_out_msg_size + in_ring_size/min_in_msg_size + */ +static inline u32 netvsc_rqstor_size(unsigned long ringbytes) +{ + return ringbytes / NETVSC_MIN_OUT_MSG_SIZE + + ringbytes / NETVSC_MIN_IN_MSG_SIZE; +} + #define NETVSC_XFER_HEADER_SIZE(rng_cnt) \ (offsetof(struct vmtransfer_page_packet_header, ranges) + \ (rng_cnt) * sizeof(struct vmtransfer_page_range)) diff --git a/drivers/net/hyperv/netvsc.c b/drivers/net/hyperv/netvsc.c index 3eae31c0f97a6..c9b73a0448813 100644 --- a/drivers/net/hyperv/netvsc.c +++ b/drivers/net/hyperv/netvsc.c @@ -50,7 +50,7 @@ void netvsc_switch_datapath(struct net_device *ndev, bool= vf) =20 vmbus_sendpacket(dev->channel, init_pkt, sizeof(struct nvsp_message), - (unsigned long)init_pkt, + VMBUS_RQST_ID_NO_RESPONSE, VM_PKT_DATA_INBAND, 0); } =20 @@ -163,7 +163,7 @@ static void netvsc_revoke_recv_buf(struct hv_device *de= vice, ret =3D vmbus_sendpacket(device->channel, revoke_packet, sizeof(struct nvsp_message), - (unsigned long)revoke_packet, + VMBUS_RQST_ID_NO_RESPONSE, VM_PKT_DATA_INBAND, 0); /* If the failure is because the channel is rescinded; * ignore the failure since we cannot send on a rescinded @@ -213,7 +213,7 @@ static void netvsc_revoke_send_buf(struct hv_device *de= vice, ret =3D vmbus_sendpacket(device->channel, revoke_packet, sizeof(struct nvsp_message), - (unsigned long)revoke_packet, + VMBUS_RQST_ID_NO_RESPONSE, VM_PKT_DATA_INBAND, 0); =20 /* If the failure is because the channel is rescinded; @@ -557,7 +557,7 @@ static int negotiate_nvsp_ver(struct hv_device *device, =20 ret =3D vmbus_sendpacket(device->channel, init_packet, sizeof(struct nvsp_message), - (unsigned long)init_packet, + VMBUS_RQST_ID_NO_RESPONSE, VM_PKT_DATA_INBAND, 0); =20 return ret; @@ -614,7 +614,7 @@ static int netvsc_connect_vsp(struct hv_device *device, /* Send the init request */ ret =3D vmbus_sendpacket(device->channel, init_packet, sizeof(struct nvsp_message), - (unsigned long)init_packet, + VMBUS_RQST_ID_NO_RESPONSE, VM_PKT_DATA_INBAND, 0); if (ret !=3D 0) goto cleanup; @@ -698,10 +698,19 @@ static void netvsc_send_tx_complete(struct net_device= *ndev, const struct vmpacket_descriptor *desc, int budget) { - struct sk_buff *skb =3D (struct sk_buff *)(unsigned long)desc->trans_id; struct net_device_context *ndev_ctx =3D netdev_priv(ndev); + struct sk_buff *skb; u16 q_idx =3D 0; int queue_sends; + u64 cmd_rqst; + + cmd_rqst =3D vmbus_request_addr(&channel->requestor, (u64)desc->trans_id); + if (cmd_rqst =3D=3D VMBUS_RQST_ERROR) { + netdev_err(ndev, "Incorrect transaction id\n"); + return; + } + + skb =3D (struct sk_buff *)(unsigned long)cmd_rqst; =20 /* Notify the layer above us */ if (likely(skb)) { @@ -1530,6 +1539,7 @@ struct netvsc_device *netvsc_device_add(struct hv_dev= ice *device, netvsc_poll, NAPI_POLL_WEIGHT); =20 /* Open the channel */ + device->channel->rqstor_size =3D netvsc_rqstor_size(netvsc_ring_bytes); ret =3D vmbus_open(device->channel, netvsc_ring_bytes, netvsc_ring_bytes, NULL, 0, netvsc_channel_cb, net_device->chan_table); diff --git a/drivers/net/hyperv/rndis_filter.c b/drivers/net/hyperv/rndis_f= ilter.c index 90bc0008fa2fd..13f62950eeb9f 100644 --- a/drivers/net/hyperv/rndis_filter.c +++ b/drivers/net/hyperv/rndis_filter.c @@ -1170,6 +1170,7 @@ static void netvsc_sc_open(struct vmbus_channel *new_= sc) /* Set the channel before opening.*/ nvchan->channel =3D new_sc; =20 + new_sc->rqstor_size =3D netvsc_rqstor_size(netvsc_ring_bytes); ret =3D vmbus_open(new_sc, netvsc_ring_bytes, netvsc_ring_bytes, NULL, 0, netvsc_channel_cb, nvchan); diff --git a/include/linux/hyperv.h b/include/linux/hyperv.h index 4cb65a79d92f6..2aaf450c8d800 100644 --- a/include/linux/hyperv.h +++ b/include/linux/hyperv.h @@ -779,6 +779,7 @@ struct vmbus_requestor { =20 #define VMBUS_NO_RQSTOR U64_MAX #define VMBUS_RQST_ERROR (U64_MAX - 1) +#define VMBUS_RQST_ID_NO_RESPONSE (U64_MAX - 2) =20 struct vmbus_device { u16 dev_type; --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4F7A615E5A1; Wed, 13 Mar 2024 16:47:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348461; cv=none; b=Xjo7VpSzOGpRuzpI/zsowAgtHdphoYsTIfSMbfPytnmX+gCMzQdqSm4Hsq6cQGJ2R44Gci8kmxOmeJlSmo7UtoC/z6XtK41O+yF+g8P94qY7Ak5JqTbRiAE2wlofFEkojWhOx+ZFcxzlitorP29rcMrUjawg+Tt3O+c/YaAPuLQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348461; c=relaxed/simple; bh=vgRMZG9xgkjHsd1YI558si+2khyZ0254KjZZLGoJkFE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BCSZ5oWL4fslqCUok+yU8pYAlcDgw/BHWUhNM8yUUF4zii72mxpwEcdGYb2nMgjYZvEk8HIbDHUGc8K0f4TwC+t6DBkT55ldJ0hSN7U4oJfs5D701S7XQaHg5vSPm04oyeYetIGF25i4EpeVEPHMYN6tW/CRVr8wPrWW9F0gbyo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ILcwp6b3; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="ILcwp6b3" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5F44EC433C7; Wed, 13 Mar 2024 16:47:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348461; bh=vgRMZG9xgkjHsd1YI558si+2khyZ0254KjZZLGoJkFE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ILcwp6b3HQdhsAsoUN1vYeHcON7Q7g+ZMnqwg2TKki3sDBZpIo/mW4h3jaYDQfeMg eSBfRaZ+5NXsJZFKYhrkeoajuyziLlIdx6bJprzFXI0dE6ZQ8Y37DzALMmQXsp7SEf yLH635V2BLFOuyMBVBFEiWFtyh3urGSi4XWKcnUwkGnuQH3gB5MQL355cv8sLJ0CXt J0v4ySt9V9b0eIvi9ZGdVFY7ZcAVXsfj55eTeJ4Znfb512Th9HsgA4MXm6j86uUG6m /wvqANhT1yaICVeLN/TkAbYlgpUKjomLV2U0MJxEXJx88JbT6UctykA0ZmaW+1Wzw5 uvhh9CArBJl/Q== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Long Li , kernel test robot , Jakub Kicinski , Sasha Levin Subject: [PATCH 5.10 53/73] hv_netvsc: Wait for completion on request SWITCH_DATA_PATH Date: Wed, 13 Mar 2024 12:46:20 -0400 Message-ID: <20240313164640.616049-54-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Long Li [ Upstream commit 8b31f8c982b738e4130539e47f03967c599d8e22 ] The completion indicates if NVSP_MSG4_TYPE_SWITCH_DATA_PATH has been processed by the VSP. The traffic is steered to VF or synthetic after we receive this completion. Signed-off-by: Long Li Reported-by: kernel test robot Signed-off-by: Jakub Kicinski Stable-dep-of: 9cae43da9867 ("hv_netvsc: Register VF in netvsc_probe if NET= _DEVICE_REGISTER missed") Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- drivers/net/hyperv/netvsc.c | 37 ++++++++++++++++++++++++++++++--- drivers/net/hyperv/netvsc_drv.c | 1 - 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/drivers/net/hyperv/netvsc.c b/drivers/net/hyperv/netvsc.c index c9b73a0448813..03333a4136bf4 100644 --- a/drivers/net/hyperv/netvsc.c +++ b/drivers/net/hyperv/netvsc.c @@ -37,6 +37,10 @@ void netvsc_switch_datapath(struct net_device *ndev, boo= l vf) struct netvsc_device *nv_dev =3D rtnl_dereference(net_device_ctx->nvdev); struct nvsp_message *init_pkt =3D &nv_dev->channel_init_pkt; =20 + /* Block sending traffic to VF if it's about to be gone */ + if (!vf) + net_device_ctx->data_path_is_vf =3D vf; + memset(init_pkt, 0, sizeof(struct nvsp_message)); init_pkt->hdr.msg_type =3D NVSP_MSG4_TYPE_SWITCH_DATA_PATH; if (vf) @@ -50,8 +54,11 @@ void netvsc_switch_datapath(struct net_device *ndev, boo= l vf) =20 vmbus_sendpacket(dev->channel, init_pkt, sizeof(struct nvsp_message), - VMBUS_RQST_ID_NO_RESPONSE, - VM_PKT_DATA_INBAND, 0); + (unsigned long)init_pkt, + VM_PKT_DATA_INBAND, + VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED); + wait_for_completion(&nv_dev->channel_init_wait); + net_device_ctx->data_path_is_vf =3D vf; } =20 /* Worker to setup sub channels on initial setup @@ -757,8 +764,31 @@ static void netvsc_send_completion(struct net_device *= ndev, const struct vmpacket_descriptor *desc, int budget) { - const struct nvsp_message *nvsp_packet =3D hv_pkt_data(desc); + const struct nvsp_message *nvsp_packet; u32 msglen =3D hv_pkt_datalen(desc); + struct nvsp_message *pkt_rqst; + u64 cmd_rqst; + + /* First check if this is a VMBUS completion without data payload */ + if (!msglen) { + cmd_rqst =3D vmbus_request_addr(&incoming_channel->requestor, + (u64)desc->trans_id); + if (cmd_rqst =3D=3D VMBUS_RQST_ERROR) { + netdev_err(ndev, "Invalid transaction id\n"); + return; + } + + pkt_rqst =3D (struct nvsp_message *)(uintptr_t)cmd_rqst; + switch (pkt_rqst->hdr.msg_type) { + case NVSP_MSG4_TYPE_SWITCH_DATA_PATH: + complete(&net_device->channel_init_wait); + break; + + default: + netdev_err(ndev, "Unexpected VMBUS completion!!\n"); + } + return; + } =20 /* Ensure packet is big enough to read header fields */ if (msglen < sizeof(struct nvsp_message_header)) { @@ -766,6 +796,7 @@ static void netvsc_send_completion(struct net_device *n= dev, return; } =20 + nvsp_packet =3D hv_pkt_data(desc); switch (nvsp_packet->hdr.msg_type) { case NVSP_MSG_TYPE_INIT_COMPLETE: if (msglen < sizeof(struct nvsp_message_header) + diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_dr= v.c index 790bf750281ad..57a5ec098e7e0 100644 --- a/drivers/net/hyperv/netvsc_drv.c +++ b/drivers/net/hyperv/netvsc_drv.c @@ -2429,7 +2429,6 @@ static int netvsc_vf_changed(struct net_device *vf_ne= tdev) =20 if (net_device_ctx->data_path_is_vf =3D=3D vf_is_up) return NOTIFY_OK; - net_device_ctx->data_path_is_vf =3D vf_is_up; =20 if (vf_is_up && !net_device_ctx->vf_alloc) { netdev_info(ndev, "Waiting for the VF association from host\n"); --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6E6A415E5B9; Wed, 13 Mar 2024 16:47:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348462; cv=none; b=KkhqOTHvgche6QxW7/dDoNSD3gqC6g1/OOWwRpPdkoPPTf1NuiYcrSRpWTmG2S6vMYshR2AWwdsEbEO8gMSTVTxGQ29RUaSe2o1ONzSpAm4ZoNq6E6Ks2vSw7r1FRcU5z+HVLWGvTAVd0QN+lzD9BAqOOL+bRk6AqgAiL2jbrmw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348462; c=relaxed/simple; bh=nhbKbEX9nHakPLpkOIH63yejM4HifZj5GXSMu2I7y9o=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=AtYCoatYWaJZ7NkCkLADFEQGghImn+SIzIVsyde34tSeXqbJodnQ+uSXwvlmvYCOKr65eATTwem8M2HOYs04yAGxvEGm/uptuf0/L73sQs7l1pL1X2UqsAetLnpCLXXjzduLzNwwLeom6WqrqZHuFAp9ESDYVdwqhxxXwWOqh90= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ijPTWkF7; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="ijPTWkF7" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 79DB9C433F1; Wed, 13 Mar 2024 16:47:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348462; bh=nhbKbEX9nHakPLpkOIH63yejM4HifZj5GXSMu2I7y9o=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ijPTWkF7TGi52oKap6TAmKdGpaZOMbi+n7cm54b3La3+jEhBRi+TLNUTf75opL3xT tFtsDw3+aTEj8FVvuR5FxOmlGKB1mg1ReHF/EmKPyytqAA2cS1BshUE8YALP6nTcOB 6B6FLWI40E7aPZ1/QizAnkaISy0KCZ+5fgvQ0RR20AI67Gil48eyEuaAYun4wfWu52 bXscbzWS5uDXSvJqSZTh11TtuJhBEXyvFaGCI2L32jT0ZmFfDsAV0zAa1lekL+SN+U jQSofgz7qb3/QLvpG+cJ/5wigtc8SAONfevNklVni4pWONEc+rCguORhJH04btmlxg wsJW1Y5W+2a4Q== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Long Li , Haiyang Zhang , Jakub Kicinski , Sasha Levin Subject: [PATCH 5.10 54/73] hv_netvsc: Process NETDEV_GOING_DOWN on VF hot remove Date: Wed, 13 Mar 2024 12:46:21 -0400 Message-ID: <20240313164640.616049-55-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Long Li [ Upstream commit 34b06a2eee44d469f2e2c013a83e6dac3aff6411 ] On VF hot remove, NETDEV_GOING_DOWN is sent to notify the VF is about to go down. At this time, the VF is still sending/receiving traffic and we request the VSP to switch datapath. On completion, the datapath is switched to synthetic and we can proceed with VF hot remove. Signed-off-by: Long Li Reviewed-by: Haiyang Zhang Signed-off-by: Jakub Kicinski Stable-dep-of: 9cae43da9867 ("hv_netvsc: Register VF in netvsc_probe if NET= _DEVICE_REGISTER missed") Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- drivers/net/hyperv/netvsc_drv.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_dr= v.c index 57a5ec098e7e0..057b1a9dde153 100644 --- a/drivers/net/hyperv/netvsc_drv.c +++ b/drivers/net/hyperv/netvsc_drv.c @@ -2411,12 +2411,15 @@ static int netvsc_register_vf(struct net_device *vf= _netdev) * During hibernation, if a VF NIC driver (e.g. mlx5) preserves the network * interface, there is only the CHANGE event and no UP or DOWN event. */ -static int netvsc_vf_changed(struct net_device *vf_netdev) +static int netvsc_vf_changed(struct net_device *vf_netdev, unsigned long e= vent) { struct net_device_context *net_device_ctx; struct netvsc_device *netvsc_dev; struct net_device *ndev; - bool vf_is_up =3D netif_running(vf_netdev); + bool vf_is_up =3D false; + + if (event !=3D NETDEV_GOING_DOWN) + vf_is_up =3D netif_running(vf_netdev); =20 ndev =3D get_netvsc_byref(vf_netdev); if (!ndev) @@ -2762,7 +2765,8 @@ static int netvsc_netdev_event(struct notifier_block = *this, case NETDEV_UP: case NETDEV_DOWN: case NETDEV_CHANGE: - return netvsc_vf_changed(event_dev); + case NETDEV_GOING_DOWN: + return netvsc_vf_changed(event_dev, event); default: return NOTIFY_DONE; } --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 281D515F30A; Wed, 13 Mar 2024 16:47:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348464; cv=none; b=VnfuURmWIs3OkGU33rEaGvK0/UscNEy6/MBwDNhvoEyjFmzzX1swWNNap+3ajEyN97oBbhBHj08jojdkJKWYgva2m7exiVxeyhyOR/jmQM0p+PPwHyullHGXmLjEhDhZqifhlq07t82U1K58vE4vu1yCFFslTcjVlbcjyv/TCjs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348464; c=relaxed/simple; bh=h/rVP4ZfvNZ4dNRYln8ZY9JBuriyDowmAoAa1SmtD9s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=pt2Zq5P7iMue0j3OpEJhpBG4+wB+6Ev2ulOp86bSGpRYF9Grpnl+P2EVP2QouOS88cCTsxMN1bvpxRqzgiwgy8rZdl/4ldGbazeGq5hueFYwK1zJkaG//ylPTztjJfX89Pcy20MRpgKjqvClUZJzokE0cd/RxWJQ8ZJ+UlOjuHk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=blsca1cv; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="blsca1cv" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 99B99C433F1; Wed, 13 Mar 2024 16:47:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348463; bh=h/rVP4ZfvNZ4dNRYln8ZY9JBuriyDowmAoAa1SmtD9s=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=blsca1cvDHD+2OT6OseKfP0Ymh8+9UysdJivv5vivA1p9Uoap10uxg8ONH4YvBEyu bOnJ96aG2GpCZGqYBdXj1tBVRcDV9ttaWNTMG6fvF3eg2U+HJ/vdZAI5JdSkgoZ0/U z+TsDINK8wkKk6Xow69x5UeR+IjWZQ35b2t2NpNk/t2PoO030RfFmLcyyNLO1KUMs+ NTdrLwR8+51H/r8ccndgpTbENFicSNHGzxjAYBPhoi+Z6KMaNxXODX9RcGDmnkZ5ie KWdQeOnJWKhKoaLX05BeObsUX3moOHztozJfI26rfytvYVA/pjS/W4xblyA28XqQAQ RLnVYw3SG7Stg== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Dexuan Cui , Haiyang Zhang , Shachar Raindel , Stephen Hemminger , "David S . Miller" , Sasha Levin Subject: [PATCH 5.10 55/73] hv_netvsc: Make netvsc/VF binding check both MAC and serial number Date: Wed, 13 Mar 2024 12:46:22 -0400 Message-ID: <20240313164640.616049-56-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Dexuan Cui [ Upstream commit 64ff412ad41fe3a5bf759ff4844dc1382176485c ] Currently the netvsc/VF binding logic only checks the PCI serial number. The Microsoft Azure Network Adapter (MANA) supports multiple net_device interfaces (each such interface is called a "vPort", and has its unique MAC address) which are backed by the same VF PCI device, so the binding logic should check both the MAC address and the PCI serial number. The change should not break any other existing VF drivers, because Hyper-V NIC SR-IOV implementation requires the netvsc network interface and the VF network interface have the same MAC address. Co-developed-by: Haiyang Zhang Signed-off-by: Haiyang Zhang Co-developed-by: Shachar Raindel Signed-off-by: Shachar Raindel Acked-by: Stephen Hemminger Signed-off-by: Dexuan Cui Signed-off-by: David S. Miller Stable-dep-of: 9cae43da9867 ("hv_netvsc: Register VF in netvsc_probe if NET= _DEVICE_REGISTER missed") Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- drivers/net/hyperv/netvsc_drv.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_dr= v.c index 057b1a9dde153..9ec1633b89b48 100644 --- a/drivers/net/hyperv/netvsc_drv.c +++ b/drivers/net/hyperv/netvsc_drv.c @@ -2310,8 +2310,17 @@ static struct net_device *get_netvsc_byslot(const st= ruct net_device *vf_netdev) if (!ndev_ctx->vf_alloc) continue; =20 - if (ndev_ctx->vf_serial =3D=3D serial) - return hv_get_drvdata(ndev_ctx->device_ctx); + if (ndev_ctx->vf_serial !=3D serial) + continue; + + ndev =3D hv_get_drvdata(ndev_ctx->device_ctx); + if (ndev->addr_len !=3D vf_netdev->addr_len || + memcmp(ndev->perm_addr, vf_netdev->perm_addr, + ndev->addr_len) !=3D 0) + continue; + + return ndev; + } =20 /* Fallback path to check synthetic vf with help of mac addr. --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 36632160872; Wed, 13 Mar 2024 16:47:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348465; cv=none; b=HlePAOApzmEX/5z9pEScjIRHZN/ie3NPsoaM5am+2ZZ7QVavKxII5GrrWpyQXCphKUuZ7hrG7Oo6wqrtvEiRG9H79Q17krb0FkliBeZQeAcNv/v1Py63mtYAe1f2pYVRQo7Tm9IJ5HnDcDtGvnuUnjcGL//N+PAnSOTozamIIPE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348465; c=relaxed/simple; bh=XkzCCer+yg7bRJIGIcsOqFfJw8qAfM9xMxSRoTXkuSU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=PQxi3ODERdgaqAPRYACz9aEj6GftMpTrTm/1bYAvBSPmIC+YNK0fIjURiD42zDhGhJoqnk3clj5N7sxcB+LZy6JCxjnnfI5Lnzujp5n86jS9vtwlMDBNGAFun9RklfkoVp6IYAp3imJO0cgdwDrY5kDM0GBQMtbHdjgl5aKdN18= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=kn4zTSJy; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="kn4zTSJy" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E719DC433C7; Wed, 13 Mar 2024 16:47:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348464; bh=XkzCCer+yg7bRJIGIcsOqFfJw8qAfM9xMxSRoTXkuSU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=kn4zTSJykKjiAdyMMVysD135je5a+5S7/NVX787AAT0X2w+iLh40gRfJWluxm2fSg YlpAIbth22/Z/2196oKXbeLHeDdAoaKI7u2qJ5m5/7AqmGk35eiQ8Ro/u6lDeWLVq1 hIT3bJKQK30HRMwo0HnMBWTPxn/y3fSUwsIsZBaHs5Yg1VQdwgNJX7LvhmEtNKN/iS W4yg5iiFOsxVZ7KuEBp0cThRQTkvZpOSENqVXJJGudrbt8fRNmXbH9R2znoMSOqCRW M3PPb6fvMzalAdZ72RMSQp3uK4pWYASfY3z6Vpxc2JhuWjBnGVK9wSBrmiGi82Vbsq kHk7zjSrfQ1wg== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Juhee Kang , "David S . Miller" , Sasha Levin Subject: [PATCH 5.10 56/73] hv_netvsc: use netif_is_bond_master() instead of open code Date: Wed, 13 Mar 2024 12:46:23 -0400 Message-ID: <20240313164640.616049-57-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Juhee Kang [ Upstream commit c60882a4566a0a62dc3a40c85131103aad83dcb3 ] Use netif_is_bond_master() function instead of open code, which is ((event_dev->priv_flags & IFF_BONDING) && (event_dev->flags & IFF_MASTER)). This patch doesn't change logic. Signed-off-by: Juhee Kang Signed-off-by: David S. Miller Stable-dep-of: 9cae43da9867 ("hv_netvsc: Register VF in netvsc_probe if NET= _DEVICE_REGISTER missed") Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- drivers/net/hyperv/netvsc_drv.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_dr= v.c index 9ec1633b89b48..e8efcc6a0b05a 100644 --- a/drivers/net/hyperv/netvsc_drv.c +++ b/drivers/net/hyperv/netvsc_drv.c @@ -2760,8 +2760,7 @@ static int netvsc_netdev_event(struct notifier_block = *this, return NOTIFY_DONE; =20 /* Avoid Bonding master dev with same MAC registering as VF */ - if ((event_dev->priv_flags & IFF_BONDING) && - (event_dev->flags & IFF_MASTER)) + if (netif_is_bond_master(event_dev)) return NOTIFY_DONE; =20 switch (event) { --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 344A0161B54; Wed, 13 Mar 2024 16:47:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348466; cv=none; b=gO6BW76OzZtOWG4Ld7eU0mBa34p2hQe0MN7E4/Wz/ZAiuLwKpm+k0eduv9I1Ww+WcDH27TNEFoXRGrssHbBEN92FgxSduyv8f+CEuO+1KUSPavYeUTXFlTyJL/x4xnoKz5qIwolbfQ4U5MShybX8FXdBfd5Onskd3/Jbj6BJ1gk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348466; c=relaxed/simple; bh=SO10NYY2rFlZKfrtasX2qxmzBJJJrpWGsfzvhZ2o1io=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZJR5ZfP/TO9TYpq0Y4RvPwy5XfyM92jR8dNvWtLeOLvXoxakbsPJNGjs0dCzwMRPMlfqYpkGYnuukwnMS1VrDP0hEChjIrhdCNwthWMS6kzWJYX1yoGzSCnQyh1EPHhGfqAOvnWzMH9+dc7BoNzUpt298w/MIahDlbxVe5Sxlu0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=K+CkS2TP; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="K+CkS2TP" Received: by smtp.kernel.org (Postfix) with ESMTPSA id F3D1BC43399; Wed, 13 Mar 2024 16:47:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348466; bh=SO10NYY2rFlZKfrtasX2qxmzBJJJrpWGsfzvhZ2o1io=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=K+CkS2TPZ9JPHWgHn5BLP/xPgNprVbd51+vQInnCgLeEj7uP8PhAW66evqV4UjHFD UmV92idviCYxNDS4VJ8g1OnOR52Zj9KKrBtOWdPMTN7OVtIE15huj80VYjRuGWIjtY eAErdLdTeQtGhH/E8mi2hyNyPoUQPVMEtCmMqJsEuwpY5fi2D90gZ57/lBvNovQkFd RLutZhGroWRVhT8S2fAv0qp4aQPQQjW3CirhX1ZPcHQHeBSnLxyOjMUdf85e3h2Lq9 9rutn7gnT8Y7uQ7mdaZ7AJJSgjqpusLBbZoEdGmPjMYG6wicZJgYz1+E+xZQxrlWHJ tHgzgf666I+HQ== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Shradha Gupta , Dexuan Cui , Haiyang Zhang , "David S . Miller" , Sasha Levin Subject: [PATCH 5.10 57/73] hv_netvsc: Register VF in netvsc_probe if NET_DEVICE_REGISTER missed Date: Wed, 13 Mar 2024 12:46:24 -0400 Message-ID: <20240313164640.616049-58-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Shradha Gupta [ Upstream commit 9cae43da9867412f8bd09aee5c8a8dc5e8dc3dc2 ] If hv_netvsc driver is unloaded and reloaded, the NET_DEVICE_REGISTER handler cannot perform VF register successfully as the register call is received before netvsc_probe is finished. This is because we register register_netdevice_notifier() very early( even before vmbus_driver_register()). To fix this, we try to register each such matching VF( if it is visible as a netdevice) at the end of netvsc_probe. Cc: stable@vger.kernel.org Fixes: 85520856466e ("hv_netvsc: Fix race of register_netdevice_notifier an= d VF register") Suggested-by: Dexuan Cui Signed-off-by: Shradha Gupta Reviewed-by: Haiyang Zhang Reviewed-by: Dexuan Cui Signed-off-by: David S. Miller Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- drivers/net/hyperv/netvsc_drv.c | 82 +++++++++++++++++++++++++-------- 1 file changed, 62 insertions(+), 20 deletions(-) diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_dr= v.c index e8efcc6a0b05a..0fc0f9cb3f34b 100644 --- a/drivers/net/hyperv/netvsc_drv.c +++ b/drivers/net/hyperv/netvsc_drv.c @@ -44,6 +44,10 @@ #define LINKCHANGE_INT (2 * HZ) #define VF_TAKEOVER_INT (HZ / 10) =20 +/* Macros to define the context of vf registration */ +#define VF_REG_IN_PROBE 1 +#define VF_REG_IN_NOTIFIER 2 + static unsigned int ring_size __ro_after_init =3D 128; module_param(ring_size, uint, 0444); MODULE_PARM_DESC(ring_size, "Ring buffer size (# of pages)"); @@ -2194,7 +2198,7 @@ static rx_handler_result_t netvsc_vf_handle_frame(str= uct sk_buff **pskb) } =20 static int netvsc_vf_join(struct net_device *vf_netdev, - struct net_device *ndev) + struct net_device *ndev, int context) { struct net_device_context *ndev_ctx =3D netdev_priv(ndev); int ret; @@ -2217,7 +2221,11 @@ static int netvsc_vf_join(struct net_device *vf_netd= ev, goto upper_link_failed; } =20 - schedule_delayed_work(&ndev_ctx->vf_takeover, VF_TAKEOVER_INT); + /* If this registration is called from probe context vf_takeover + * is taken care of later in probe itself. + */ + if (context =3D=3D VF_REG_IN_NOTIFIER) + schedule_delayed_work(&ndev_ctx->vf_takeover, VF_TAKEOVER_INT); =20 call_netdevice_notifiers(NETDEV_JOIN, vf_netdev); =20 @@ -2355,7 +2363,7 @@ static int netvsc_prepare_bonding(struct net_device *= vf_netdev) return NOTIFY_DONE; } =20 -static int netvsc_register_vf(struct net_device *vf_netdev) +static int netvsc_register_vf(struct net_device *vf_netdev, int context) { struct net_device_context *net_device_ctx; struct netvsc_device *netvsc_dev; @@ -2395,7 +2403,7 @@ static int netvsc_register_vf(struct net_device *vf_n= etdev) =20 netdev_info(ndev, "VF registering: %s\n", vf_netdev->name); =20 - if (netvsc_vf_join(vf_netdev, ndev) !=3D 0) + if (netvsc_vf_join(vf_netdev, ndev, context) !=3D 0) return NOTIFY_DONE; =20 dev_hold(vf_netdev); @@ -2479,10 +2487,31 @@ static int netvsc_unregister_vf(struct net_device *= vf_netdev) return NOTIFY_OK; } =20 +static int check_dev_is_matching_vf(struct net_device *event_ndev) +{ + /* Skip NetVSC interfaces */ + if (event_ndev->netdev_ops =3D=3D &device_ops) + return -ENODEV; + + /* Avoid non-Ethernet type devices */ + if (event_ndev->type !=3D ARPHRD_ETHER) + return -ENODEV; + + /* Avoid Vlan dev with same MAC registering as VF */ + if (is_vlan_dev(event_ndev)) + return -ENODEV; + + /* Avoid Bonding master dev with same MAC registering as VF */ + if (netif_is_bond_master(event_ndev)) + return -ENODEV; + + return 0; +} + static int netvsc_probe(struct hv_device *dev, const struct hv_vmbus_device_id *dev_id) { - struct net_device *net =3D NULL; + struct net_device *net =3D NULL, *vf_netdev; struct net_device_context *net_device_ctx; struct netvsc_device_info *device_info =3D NULL; struct netvsc_device *nvdev; @@ -2590,6 +2619,30 @@ static int netvsc_probe(struct hv_device *dev, } =20 list_add(&net_device_ctx->list, &netvsc_dev_list); + + /* When the hv_netvsc driver is unloaded and reloaded, the + * NET_DEVICE_REGISTER for the vf device is replayed before probe + * is complete. This is because register_netdevice_notifier() gets + * registered before vmbus_driver_register() so that callback func + * is set before probe and we don't miss events like NETDEV_POST_INIT + * So, in this section we try to register the matching vf device that + * is present as a netdevice, knowing that its register call is not + * processed in the netvsc_netdev_notifier(as probing is progress and + * get_netvsc_byslot fails). + */ + for_each_netdev(dev_net(net), vf_netdev) { + ret =3D check_dev_is_matching_vf(vf_netdev); + if (ret !=3D 0) + continue; + + if (net !=3D get_netvsc_byslot(vf_netdev)) + continue; + + netvsc_prepare_bonding(vf_netdev); + netvsc_register_vf(vf_netdev, VF_REG_IN_PROBE); + __netvsc_vf_setup(net, vf_netdev); + break; + } rtnl_unlock(); =20 netvsc_devinfo_put(device_info); @@ -2746,28 +2799,17 @@ static int netvsc_netdev_event(struct notifier_bloc= k *this, unsigned long event, void *ptr) { struct net_device *event_dev =3D netdev_notifier_info_to_dev(ptr); + int ret =3D 0; =20 - /* Skip our own events */ - if (event_dev->netdev_ops =3D=3D &device_ops) - return NOTIFY_DONE; - - /* Avoid non-Ethernet type devices */ - if (event_dev->type !=3D ARPHRD_ETHER) - return NOTIFY_DONE; - - /* Avoid Vlan dev with same MAC registering as VF */ - if (is_vlan_dev(event_dev)) - return NOTIFY_DONE; - - /* Avoid Bonding master dev with same MAC registering as VF */ - if (netif_is_bond_master(event_dev)) + ret =3D check_dev_is_matching_vf(event_dev); + if (ret !=3D 0) return NOTIFY_DONE; =20 switch (event) { case NETDEV_POST_INIT: return netvsc_prepare_bonding(event_dev); case NETDEV_REGISTER: - return netvsc_register_vf(event_dev); + return netvsc_register_vf(event_dev, VF_REG_IN_NOTIFIER); case NETDEV_UNREGISTER: return netvsc_unregister_vf(event_dev); case NETDEV_UP: --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D611858AA4; Wed, 13 Mar 2024 16:47:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348467; cv=none; b=m64xEibxge5ubGcxxml3e9G8VNHPVO5adKYJTR+7PzEC3bHmMoKIryP5A/ELCELVgeAtuFUqhzarFv9tgQokpdLTHaPNUkcSMzb7ewK5ifacfGG097iVrq/MtHG0seKTTykrzfR00HynFazCxKvcJmo5qd4sXuF+/ZwbRZ4Jml4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348467; c=relaxed/simple; bh=8DrZe4V/PmgJG0xFr0P5OAc30m8lwJITKLM3iheY4xI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=I2sZn+VN1BlNYPbp3otKfW17PtmsMJX7VyHoBLmmbR1CX7VLJVFM3qulydkyXqOTTEoHGMYiftAQPpQOQMq8kBmmFM30gvDMdquQTdWIsb3CN6lkRvyVXhCIx5in7sZQKNchqIZpXNMDhBoVJHqq1hA2xrB0WI6GuD/rZXBPz7k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=knQ/BFSi; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="knQ/BFSi" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 61523C433C7; Wed, 13 Mar 2024 16:47:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348467; bh=8DrZe4V/PmgJG0xFr0P5OAc30m8lwJITKLM3iheY4xI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=knQ/BFSiQji/VgVw44LELxq/pIZNRZep1ZtIBJx1moVHLjc6BaIEuszQuj0NuVswj n0TibKt+i8phOi4ANqW1y+fUyt4m0zJ6erpTnGURUW1md4HGlTYIoDi6xPZslpgfy3 xZ+xWCpd7PuLca/ZOWHDOy8a8fGWst/8yT8K9PVuF4n2liCOWWje07CFVFtogMr15T UCeT7uWzuHQlxUQKtVO1fyYtnX7Jw99AIlDEF4E1njUfxW20nVhbm0GQUqmEnXBbFg FmQaTedKWsDwhrA4R7xGtH4osizcjhDUlKQONR7ciLIkfyGgO+yWdpCXWRaTWItatu kUzXr9AlaN/Xg== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Mike Kravetz , Matthew Wilcox , David Hildenbrand , Dan Carpenter , Michal Hocko , Davidlohr Bueso , Andrew Morton , Linus Torvalds , Sasha Levin Subject: [PATCH 5.10 58/73] mm/hugetlb: change hugetlb_reserve_pages() to type bool Date: Wed, 13 Mar 2024 12:46:25 -0400 Message-ID: <20240313164640.616049-59-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Mike Kravetz [ Upstream commit 33b8f84a4ee78491a8f4f9e4c5520c9da4a10983 ] While reviewing a bug in hugetlb_reserve_pages, it was noticed that all callers ignore the return value. Any failure is considered an ENOMEM error by the callers. Change the function to be of type bool. The function will return true if the reservation was successful, false otherwise. Callers currently assume a zero return code indicates success. Change the callers to look for true to indicate success. No functional change, only code cleanup. Link: https://lkml.kernel.org/r/20201221192542.15732-1-mike.kravetz@oracle.= com Signed-off-by: Mike Kravetz Reviewed-by: Matthew Wilcox (Oracle) Cc: David Hildenbrand Cc: Dan Carpenter Cc: Michal Hocko Cc: Davidlohr Bueso Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds Stable-dep-of: e656c7a9e596 ("mm: hugetlb pages should not be reserved by s= hmat() if SHM_NORESERVE") Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- fs/hugetlbfs/inode.c | 4 ++-- include/linux/hugetlb.h | 2 +- mm/hugetlb.c | 37 ++++++++++++++----------------------- 3 files changed, 17 insertions(+), 26 deletions(-) diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index a0edd4b8fa189..c3e9fa7ce75f7 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c @@ -176,7 +176,7 @@ static int hugetlbfs_file_mmap(struct file *file, struc= t vm_area_struct *vma) file_accessed(file); =20 ret =3D -ENOMEM; - if (hugetlb_reserve_pages(inode, + if (!hugetlb_reserve_pages(inode, vma->vm_pgoff >> huge_page_order(h), len >> huge_page_shift(h), vma, vma->vm_flags)) @@ -1500,7 +1500,7 @@ struct file *hugetlb_file_setup(const char *name, siz= e_t size, inode->i_size =3D size; clear_nlink(inode); =20 - if (hugetlb_reserve_pages(inode, 0, + if (!hugetlb_reserve_pages(inode, 0, size >> huge_page_shift(hstate_inode(inode)), NULL, acctflag)) file =3D ERR_PTR(-ENOMEM); diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h index 99b73fc4a8246..90c66b9458c31 100644 --- a/include/linux/hugetlb.h +++ b/include/linux/hugetlb.h @@ -140,7 +140,7 @@ int hugetlb_mcopy_atomic_pte(struct mm_struct *dst_mm, = pte_t *dst_pte, unsigned long dst_addr, unsigned long src_addr, struct page **pagep); -int hugetlb_reserve_pages(struct inode *inode, long from, long to, +bool hugetlb_reserve_pages(struct inode *inode, long from, long to, struct vm_area_struct *vma, vm_flags_t vm_flags); long hugetlb_unreserve_pages(struct inode *inode, long start, long end, diff --git a/mm/hugetlb.c b/mm/hugetlb.c index 81949f6d29af5..02b7c8f9b0e87 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -5108,12 +5108,13 @@ unsigned long hugetlb_change_protection(struct vm_a= rea_struct *vma, return pages << h->order; } =20 -int hugetlb_reserve_pages(struct inode *inode, +/* Return true if reservation was successful, false otherwise. */ +bool hugetlb_reserve_pages(struct inode *inode, long from, long to, struct vm_area_struct *vma, vm_flags_t vm_flags) { - long ret, chg, add =3D -1; + long chg, add =3D -1; struct hstate *h =3D hstate_inode(inode); struct hugepage_subpool *spool =3D subpool_inode(inode); struct resv_map *resv_map; @@ -5123,7 +5124,7 @@ int hugetlb_reserve_pages(struct inode *inode, /* This should never happen */ if (from > to) { VM_WARN(1, "%s called with a negative range\n", __func__); - return -EINVAL; + return false; } =20 /* @@ -5132,7 +5133,7 @@ int hugetlb_reserve_pages(struct inode *inode, * without using reserves */ if (vm_flags & VM_NORESERVE) - return 0; + return true; =20 /* * Shared mappings base their reservation on the number of pages that @@ -5154,7 +5155,7 @@ int hugetlb_reserve_pages(struct inode *inode, /* Private mapping. */ resv_map =3D resv_map_alloc(); if (!resv_map) - return -ENOMEM; + return false; =20 chg =3D to - from; =20 @@ -5162,18 +5163,12 @@ int hugetlb_reserve_pages(struct inode *inode, set_vma_resv_flags(vma, HPAGE_RESV_OWNER); } =20 - if (chg < 0) { - ret =3D chg; + if (chg < 0) goto out_err; - } - - ret =3D hugetlb_cgroup_charge_cgroup_rsvd( - hstate_index(h), chg * pages_per_huge_page(h), &h_cg); =20 - if (ret < 0) { - ret =3D -ENOMEM; + if (hugetlb_cgroup_charge_cgroup_rsvd(hstate_index(h), + chg * pages_per_huge_page(h), &h_cg) < 0) goto out_err; - } =20 if (vma && !(vma->vm_flags & VM_MAYSHARE) && h_cg) { /* For private mappings, the hugetlb_cgroup uncharge info hangs @@ -5188,19 +5183,15 @@ int hugetlb_reserve_pages(struct inode *inode, * reservations already in place (gbl_reserve). */ gbl_reserve =3D hugepage_subpool_get_pages(spool, chg); - if (gbl_reserve < 0) { - ret =3D -ENOSPC; + if (gbl_reserve < 0) goto out_uncharge_cgroup; - } =20 /* * Check enough hugepages are available for the reservation. * Hand the pages back to the subpool if there are not */ - ret =3D hugetlb_acct_memory(h, gbl_reserve); - if (ret < 0) { + if (hugetlb_acct_memory(h, gbl_reserve) < 0) goto out_put_pages; - } =20 /* * Account for the reservations made. Shared mappings record regions @@ -5218,7 +5209,6 @@ int hugetlb_reserve_pages(struct inode *inode, =20 if (unlikely(add < 0)) { hugetlb_acct_memory(h, -gbl_reserve); - ret =3D add; goto out_put_pages; } else if (unlikely(chg > add)) { /* @@ -5251,7 +5241,8 @@ int hugetlb_reserve_pages(struct inode *inode, hugetlb_cgroup_put_rsvd_cgroup(h_cg); } } - return 0; + return true; + out_put_pages: /* put back original number of pages, chg */ (void)hugepage_subpool_put_pages(spool, chg); @@ -5267,7 +5258,7 @@ int hugetlb_reserve_pages(struct inode *inode, region_abort(resv_map, from, to, regions_needed); if (vma && is_vma_resv_set(vma, HPAGE_RESV_OWNER)) kref_put(&resv_map->refs, resv_map_release); - return ret; + return false; } =20 long hugetlb_unreserve_pages(struct inode *inode, long start, long end, --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EC7626FE02; Wed, 13 Mar 2024 16:47:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348469; cv=none; b=E+Z6l2+gJWW3sZTjQdv7X0bS55Fsee/1pJWjdelGvYusEF9f8RlUHV2tgpeUuCk98lMbzC6Je2R2uQMggQCVQkCDdknchKyEvlPiEL6ZqBm1KotDKFH9npFo1ziF2tC+JUkoIE5EbMw6BP+I3fR9xzLd8sYlLrAY0qVR8H+CVcs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348469; c=relaxed/simple; bh=GVU3b2m2MSnTEGBcFRcMvG/E+T4QoRdGny2PkMtzVi4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BL82fa+Vo3mWkeY64mtepiTb0a+CEvzJRmXnOidIsJ++qSAx6OLk8NOM60DLGFVbvIelA0bd9faRjtZxmbrB60QKSMpH4PyZPLhhYkoNdq4us47DEkXvvt2UixGvTUmSTrCNK0Qi1qF8VYIKs7gYHuXWQ8iSr3G35ZamLkpyR1U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=kUM9xHkq; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="kUM9xHkq" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0BC69C43390; Wed, 13 Mar 2024 16:47:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348468; bh=GVU3b2m2MSnTEGBcFRcMvG/E+T4QoRdGny2PkMtzVi4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=kUM9xHkqB4IP5CpjKrHkPvt3n/cIZHMg+7zLq2WGaWTbHlq1Y9hv+2QmJ/dLzbiyr /m+tQSU0Zn4xD+k527SbW68u3q6AtygGKJIvhg2O7a4rsvsKWtznk8yLHdxN6yj0Cd KSJRF39ZbX9dMUFHn1CwGUNsyj32TLUU/CPFIf4necF4IZfY42jdSQElDyGMmc0lqi +apZeCUhzSWTE4yCBcsLrIlGz8wEJSDkYZtAkTacHpENJTAWd45kJPdYQZTlUT5Sse F6RKByG2fo8BivD11bx7cBlLRxb/ZsLZiYcrfn9kJ3HNNMdV/4TrAdjIOYhBzcR5R8 sZ2oMg1MAZOLw== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Prakash Sangappa , Muchun Song , Andrew Morton , Sasha Levin Subject: [PATCH 5.10 59/73] mm: hugetlb pages should not be reserved by shmat() if SHM_NORESERVE Date: Wed, 13 Mar 2024 12:46:26 -0400 Message-ID: <20240313164640.616049-60-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Prakash Sangappa [ Upstream commit e656c7a9e59607d1672d85ffa9a89031876ffe67 ] For shared memory of type SHM_HUGETLB, hugetlb pages are reserved in shmget() call. If SHM_NORESERVE flags is specified then the hugetlb pages are not reserved. However when the shared memory is attached with the shmat() call the hugetlb pages are getting reserved incorrectly for SHM_HUGETLB shared memory created with SHM_NORESERVE which is a bug. Acked-by: Muchun Song Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot ------------------------------- Following test shows the issue. $cat shmhtb.c int main() { int shmflags =3D 0660 | IPC_CREAT | SHM_HUGETLB | SHM_NORESERVE; int shmid; shmid =3D shmget(SKEY, SHMSZ, shmflags); if (shmid < 0) { printf("shmat: shmget() failed, %d\n", errno); return 1; } printf("After shmget()\n"); system("cat /proc/meminfo | grep -i hugepages_"); shmat(shmid, NULL, 0); printf("\nAfter shmat()\n"); system("cat /proc/meminfo | grep -i hugepages_"); shmctl(shmid, IPC_RMID, NULL); return 0; } #sysctl -w vm.nr_hugepages=3D20 #./shmhtb After shmget() HugePages_Total: 20 HugePages_Free: 20 HugePages_Rsvd: 0 HugePages_Surp: 0 After shmat() HugePages_Total: 20 HugePages_Free: 20 HugePages_Rsvd: 5 <-- HugePages_Surp: 0 -------------------------------- Fix is to ensure that hugetlb pages are not reserved for SHM_HUGETLB shared memory in the shmat() call. Link: https://lkml.kernel.org/r/1706040282-12388-1-git-send-email-prakash.s= angappa@oracle.com Signed-off-by: Prakash Sangappa Acked-by: Muchun Song Cc: Signed-off-by: Andrew Morton Signed-off-by: Sasha Levin --- fs/hugetlbfs/inode.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index c3e9fa7ce75f7..bf3cda4989623 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c @@ -135,6 +135,7 @@ static int hugetlbfs_file_mmap(struct file *file, struc= t vm_area_struct *vma) loff_t len, vma_len; int ret; struct hstate *h =3D hstate_file(file); + vm_flags_t vm_flags; =20 /* * vma address alignment (but not the pgoff alignment) has @@ -176,10 +177,20 @@ static int hugetlbfs_file_mmap(struct file *file, str= uct vm_area_struct *vma) file_accessed(file); =20 ret =3D -ENOMEM; + + vm_flags =3D vma->vm_flags; + /* + * for SHM_HUGETLB, the pages are reserved in the shmget() call so skip + * reserving here. Note: only for SHM hugetlbfs file, the inode + * flag S_PRIVATE is set. + */ + if (inode->i_flags & S_PRIVATE) + vm_flags |=3D VM_NORESERVE; + if (!hugetlb_reserve_pages(inode, vma->vm_pgoff >> huge_page_order(h), len >> huge_page_shift(h), vma, - vma->vm_flags)) + vm_flags)) goto out; =20 ret =3D 0; --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 17FE36FE1E; Wed, 13 Mar 2024 16:47:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348470; cv=none; b=CBQDsBo2be55hJjAtzKmoQOOg8Ak3NbkjCjAxSf2hpTiJi+TUmuRdDWdQni4N22DC3uRkN9Vq5lLbnyBkig+Gbtk+Qq7LKE6mIwZyfRq5c+4oe9BotaUrUrZHl0yqMuD2xzlE2hKU+LusmlksdnUojfnZaeygDDNHoM1WqLOLSQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348470; c=relaxed/simple; bh=nOLn3S4rg43w66t96mcY9QG+VPaxgLbxU/EajpfW+A0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=QJvNNb0F8ePOa3yOZ1rCyq4SJOpQo1cHlvrrymcTbEdh7RQPkvkQXt68oiDkZ3YNS13K5uWx+ppzxNNQMWVAtXVUImSmloqjcgkAHCv/rdlYDovTHlam4qQcTW5PNW/OPHOSr5ON18EHz7s51gtotqdM/KKM5ywEA6NdncSr6jA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=aaqnsgmT; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="aaqnsgmT" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 25DDBC433C7; Wed, 13 Mar 2024 16:47:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348470; bh=nOLn3S4rg43w66t96mcY9QG+VPaxgLbxU/EajpfW+A0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=aaqnsgmTZtTPPNJBRdbNzaGZcJZtxWQvmiWZaJUOmLEwsPb2BkoyRtLRlL7LsWeP/ hXAQL3K8QA9lER3DKHxRxTN+3qq875VzKSqOaIXQ3OKz1153OFUf0uOU3G9N7raP64 yLsXjGAboZoYw/KCa2VVXF5Tn5Ji6g9FwU7kiyRdeaUWjBtMKyd9fXkb1InjJUtLOa IcZfNUZminIXTl+PtWqvVLXf7XT+5YtccqpUZnGDHb1l+resG9JRxjI6eRxHizWcLA Dle7pmRjP5b7zXtR0i6E9wKdIZYrPSl1cnX4tXmnlipr9Nl3ac5KJgRq5Qo/k9Ok7Q 4ieYMiU3X0t7Q== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Oleg Nesterov , "Eric W . Biederman" , Andrew Morton , Sasha Levin Subject: [PATCH 5.10 60/73] getrusage: add the "signal_struct *sig" local variable Date: Wed, 13 Mar 2024 12:46:27 -0400 Message-ID: <20240313164640.616049-61-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Oleg Nesterov [ Upstream commit c7ac8231ace9b07306d0299969e42073b189c70a ] No functional changes, cleanup/preparation. Link: https://lkml.kernel.org/r/20230909172554.GA20441@redhat.com Signed-off-by: Oleg Nesterov Cc: Eric W. Biederman Signed-off-by: Andrew Morton Stable-dep-of: daa694e41375 ("getrusage: move thread_group_cputime_adjusted= () outside of lock_task_sighand()") Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- kernel/sys.c | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/kernel/sys.c b/kernel/sys.c index bff14910b9262..8a53d858d7375 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -1737,6 +1737,7 @@ void getrusage(struct task_struct *p, int who, struct= rusage *r) unsigned long flags; u64 tgutime, tgstime, utime, stime; unsigned long maxrss =3D 0; + struct signal_struct *sig =3D p->signal; =20 memset((char *)r, 0, sizeof (*r)); utime =3D stime =3D 0; @@ -1744,7 +1745,7 @@ void getrusage(struct task_struct *p, int who, struct= rusage *r) if (who =3D=3D RUSAGE_THREAD) { task_cputime_adjusted(current, &utime, &stime); accumulate_thread_rusage(p, r); - maxrss =3D p->signal->maxrss; + maxrss =3D sig->maxrss; goto out; } =20 @@ -1754,15 +1755,15 @@ void getrusage(struct task_struct *p, int who, stru= ct rusage *r) switch (who) { case RUSAGE_BOTH: case RUSAGE_CHILDREN: - utime =3D p->signal->cutime; - stime =3D p->signal->cstime; - r->ru_nvcsw =3D p->signal->cnvcsw; - r->ru_nivcsw =3D p->signal->cnivcsw; - r->ru_minflt =3D p->signal->cmin_flt; - r->ru_majflt =3D p->signal->cmaj_flt; - r->ru_inblock =3D p->signal->cinblock; - r->ru_oublock =3D p->signal->coublock; - maxrss =3D p->signal->cmaxrss; + utime =3D sig->cutime; + stime =3D sig->cstime; + r->ru_nvcsw =3D sig->cnvcsw; + r->ru_nivcsw =3D sig->cnivcsw; + r->ru_minflt =3D sig->cmin_flt; + r->ru_majflt =3D sig->cmaj_flt; + r->ru_inblock =3D sig->cinblock; + r->ru_oublock =3D sig->coublock; + maxrss =3D sig->cmaxrss; =20 if (who =3D=3D RUSAGE_CHILDREN) break; @@ -1772,14 +1773,14 @@ void getrusage(struct task_struct *p, int who, stru= ct rusage *r) thread_group_cputime_adjusted(p, &tgutime, &tgstime); utime +=3D tgutime; stime +=3D tgstime; - r->ru_nvcsw +=3D p->signal->nvcsw; - r->ru_nivcsw +=3D p->signal->nivcsw; - r->ru_minflt +=3D p->signal->min_flt; - r->ru_majflt +=3D p->signal->maj_flt; - r->ru_inblock +=3D p->signal->inblock; - r->ru_oublock +=3D p->signal->oublock; - if (maxrss < p->signal->maxrss) - maxrss =3D p->signal->maxrss; + r->ru_nvcsw +=3D sig->nvcsw; + r->ru_nivcsw +=3D sig->nivcsw; + r->ru_minflt +=3D sig->min_flt; + r->ru_majflt +=3D sig->maj_flt; + r->ru_inblock +=3D sig->inblock; + r->ru_oublock +=3D sig->oublock; + if (maxrss < sig->maxrss) + maxrss =3D sig->maxrss; t =3D p; do { accumulate_thread_rusage(t, r); --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4EC7E6FE3F; Wed, 13 Mar 2024 16:47:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348471; cv=none; b=ieuoPtSUkaru/HgeACkJfsrXdXxKhXcWaYyxOe0XJrr68oJ8nGj6g4t6uBsXF/Wc5+sWYzB+CXLt2kbcG6qVLTQjCspz6K6PYM7BVXgZdj/k4GTn/HqHUzH2Uv1aZ0xOnWXhxLo5N2z5mEnpcIqzCmvIS9LLAbAkRh7nBiq+Owk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348471; c=relaxed/simple; bh=hnIjlYPTknFCqZsr7fqhnFrv6OB7rf2f6hhyOXu6sLs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=DD9cuxCtVCT2HAAtgGLJAwzW4/YUOEZcjRlCeyvRcxjCjcIpJgm81FStYkNLfg2kcHmQTgMFuhR9yMMwS1kCU55pPLIvMoZrbY9vwt6oegmsLl0kTAGh5ZSR0P15w3cCEvy5R+x5TI/NhSzFDRywnBTk+aOSyamuOeIoyNvb7Bo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=nJBTfxNR; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="nJBTfxNR" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 440C6C43390; Wed, 13 Mar 2024 16:47:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348471; bh=hnIjlYPTknFCqZsr7fqhnFrv6OB7rf2f6hhyOXu6sLs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=nJBTfxNRjmam5KP1hy4Jw3rzimGUO/DAEHZiu0thJ8V7Ya2HiqoZv8eY+F6P8DDWY MnJyg0syOy3q65Hi6uO3zpeo6BiuDFG6HKM1AHcyxyPEYuDRf4OfIwkmTkaL0Leo/7 a8E3f1xHX2FRqsLyDPiQYHnYS0KQQclWjoEnMUR8j4GVblsSqxHBCMRrLHyRWLWxev kCovex1f6fp+TriXHwmCKHzBst6qH3nSCSWE7A6/TGwUrWXHlhnJcOTecfPYlqmt2d S1ZT+69c+gUUTS1pDKUbJuWeYmjRpvgQN4EyXTVYxxe1lPwwzll+CRuvzxcYyEx4UX UJO7fiLpv2vZg== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Oleg Nesterov , Dylan Hatch , "Eric W . Biederman" , Andrew Morton , Sasha Levin Subject: [PATCH 5.10 61/73] getrusage: move thread_group_cputime_adjusted() outside of lock_task_sighand() Date: Wed, 13 Mar 2024 12:46:28 -0400 Message-ID: <20240313164640.616049-62-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Oleg Nesterov [ Upstream commit daa694e4137571b4ebec330f9a9b4d54aa8b8089 ] Patch series "getrusage: use sig->stats_lock", v2. This patch (of 2): thread_group_cputime() does its own locking, we can safely shift thread_group_cputime_adjusted() which does another for_each_thread loop outside of ->siglock protected section. This is also preparation for the next patch which changes getrusage() to use stats_lock instead of siglock, thread_group_cputime() takes the same lock. With the current implementation recursive read_seqbegin_or_lock() is fine, thread_group_cputime() can't enter the slow mode if the caller holds stats_lock, yet this looks more safe and better performance-wise. Link: https://lkml.kernel.org/r/20240122155023.GA26169@redhat.com Link: https://lkml.kernel.org/r/20240122155050.GA26205@redhat.com Signed-off-by: Oleg Nesterov Reported-by: Dylan Hatch Tested-by: Dylan Hatch Cc: Eric W. Biederman Cc: Signed-off-by: Andrew Morton Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- kernel/sys.c | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/kernel/sys.c b/kernel/sys.c index 8a53d858d7375..26c8783bd0757 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -1736,17 +1736,19 @@ void getrusage(struct task_struct *p, int who, stru= ct rusage *r) struct task_struct *t; unsigned long flags; u64 tgutime, tgstime, utime, stime; - unsigned long maxrss =3D 0; + unsigned long maxrss; + struct mm_struct *mm; struct signal_struct *sig =3D p->signal; =20 - memset((char *)r, 0, sizeof (*r)); + memset(r, 0, sizeof(*r)); utime =3D stime =3D 0; + maxrss =3D 0; =20 if (who =3D=3D RUSAGE_THREAD) { task_cputime_adjusted(current, &utime, &stime); accumulate_thread_rusage(p, r); maxrss =3D sig->maxrss; - goto out; + goto out_thread; } =20 if (!lock_task_sighand(p, &flags)) @@ -1770,9 +1772,6 @@ void getrusage(struct task_struct *p, int who, struct= rusage *r) fallthrough; =20 case RUSAGE_SELF: - thread_group_cputime_adjusted(p, &tgutime, &tgstime); - utime +=3D tgutime; - stime +=3D tgstime; r->ru_nvcsw +=3D sig->nvcsw; r->ru_nivcsw +=3D sig->nivcsw; r->ru_minflt +=3D sig->min_flt; @@ -1792,19 +1791,24 @@ void getrusage(struct task_struct *p, int who, stru= ct rusage *r) } unlock_task_sighand(p, &flags); =20 -out: - r->ru_utime =3D ns_to_kernel_old_timeval(utime); - r->ru_stime =3D ns_to_kernel_old_timeval(stime); + if (who =3D=3D RUSAGE_CHILDREN) + goto out_children; =20 - if (who !=3D RUSAGE_CHILDREN) { - struct mm_struct *mm =3D get_task_mm(p); + thread_group_cputime_adjusted(p, &tgutime, &tgstime); + utime +=3D tgutime; + stime +=3D tgstime; =20 - if (mm) { - setmax_mm_hiwater_rss(&maxrss, mm); - mmput(mm); - } +out_thread: + mm =3D get_task_mm(p); + if (mm) { + setmax_mm_hiwater_rss(&maxrss, mm); + mmput(mm); } + +out_children: r->ru_maxrss =3D maxrss * (PAGE_SIZE / 1024); /* convert pages to KBs */ + r->ru_utime =3D ns_to_kernel_old_timeval(utime); + r->ru_stime =3D ns_to_kernel_old_timeval(stime); } =20 SYSCALL_DEFINE2(getrusage, int, who, struct rusage __user *, ru) --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6C97718BDBC; Wed, 13 Mar 2024 16:47:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348472; cv=none; b=ETPq/tzz+bcU6c8E93PEoXME9pgluPF2Wf7NW4EGWijzpET6p04Y1m38mSaY5VFr2onMXjAR2KRQHhQgnNap8eMzTa/yUnjJQozUt6hims+J9xvsSFi9ch8LJWxARLziD/H+TIIr0sAh7Aerw/R/X3TV8fcWittq+yzzMbweyfo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348472; c=relaxed/simple; bh=EQtMrThS3/qOAKgjVAXRTKvz+c3AvAO/ciTDn8MHz+c=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=IuFl1nOfeLowxuk6/ZMGk9TDFdtNSy9HS+XGlZcxJj6yoa/HUwhj6ViUPIpn4791Az4QwJHxup09qz6C9KqsKEP2mBwOHX4gvyVhtiulTN9P8T3dBEBeD7juErsEY6fEUwO4JRny/mJmcwpIRg+8yTv6rZwZBlrXat1Y53zPtao= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=pt5Go2TT; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="pt5Go2TT" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7C4D9C433C7; Wed, 13 Mar 2024 16:47:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348472; bh=EQtMrThS3/qOAKgjVAXRTKvz+c3AvAO/ciTDn8MHz+c=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=pt5Go2TThD6bN7YB/znaCGpZfKzcZBnsivFxugGaroM97dk3x8nghBkvya8TcMMCu 9RzlFwlUs1WSQkTlBP9uWvyixdvghLKshcShXKMo6rvFN0cKfdPOOAH3ZST1to7nVk Awqq2V8N4iDQNhuRN5RtU4HW4dqkK9yl5oAfNM9czgFC9JscoJQ4NddaW5gcGNzwfC xR8IFdt8VJhytQgJdhu83LQTbRiZ1u9AXOCjSHHfMPUZxhlONCO/qrK+MC5bbXlkbi coglNlbHWQfl7yWHl0QVPYLRi+om8s/2PR/xBIas4kN4MlbpfOjE+m+5pFaSZOH9C1 vtvB21/wvS1Jg== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Oleg Nesterov , "Eric W . Biederman" , Andrew Morton , Sasha Levin Subject: [PATCH 5.10 62/73] getrusage: use __for_each_thread() Date: Wed, 13 Mar 2024 12:46:29 -0400 Message-ID: <20240313164640.616049-63-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Oleg Nesterov [ Upstream commit 13b7bc60b5353371460a203df6c38ccd38ad7a3a ] do/while_each_thread should be avoided when possible. Plus this change allows to avoid lock_task_sighand(), we can use rcu and/or sig->stats_lock instead. Link: https://lkml.kernel.org/r/20230909172629.GA20454@redhat.com Signed-off-by: Oleg Nesterov Cc: Eric W. Biederman Signed-off-by: Andrew Morton Stable-dep-of: f7ec1cd5cc7e ("getrusage: use sig->stats_lock rather than lo= ck_task_sighand()") Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- kernel/sys.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/kernel/sys.c b/kernel/sys.c index 26c8783bd0757..f1ae8fa627145 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -1780,10 +1780,8 @@ void getrusage(struct task_struct *p, int who, struc= t rusage *r) r->ru_oublock +=3D sig->oublock; if (maxrss < sig->maxrss) maxrss =3D sig->maxrss; - t =3D p; - do { + __for_each_thread(sig, t) accumulate_thread_rusage(t, r); - } while_each_thread(p, t); break; =20 default: --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9ADE618BDDC; Wed, 13 Mar 2024 16:47:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348473; cv=none; b=smMjY2KTGGeo2e2G3M40l0QeCMCHVIsJcOdZZDa4vBkmkWLTfV0nPcXaWnSOkyccVyRRLKpG5GhrgoPGJQmWQkr7kln6xxaMzI9GGdgWM1gaLRzLH+V5cd9/DRJs+NLpG15M36uYa+EoUn/aWEyLhLomtAO1p08zhvCtkvabLos= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348473; c=relaxed/simple; bh=9ppfcAmk5ARlmOn1RywsrvxcJ1ZO4QB48VYdpXKkrlY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qqJSXJjKeVxptLA4e+kGbR52y5I+YBHbjjjpHOW5/GOOk6Jg4q8d8eFJ9ZeRk1ChWRlOaWnom0XzV3PBUDl3LCuQyBJs9XTVFDVL5rYhtyE1JmUTMb3T9S4Bqyay/PEk7ydTbKAlRRud+URZHdY50M+zDCjbVs6GVrUpFjTRcEE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=pt5iMp4T; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="pt5iMp4T" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 95571C43394; Wed, 13 Mar 2024 16:47:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348473; bh=9ppfcAmk5ARlmOn1RywsrvxcJ1ZO4QB48VYdpXKkrlY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=pt5iMp4TaIwNv8VMrGJwR3kJHfEG6cdBAsaBpOTYe7PZnEcduBcHHa/xUlzw8cwQp EeXh1oqfBGu25LG7/SHQmnQKeZdIefAv19Hh2yeaXrAgkSXJ+0RfHBYCfU30/DRQgw IVAwk4yyTeBcj7IA0QtUPlMivZTL/6/5y1n/gqdWhRYV/uRIvB5dmEdlhYtZdArak/ SzIE7J7lEp6jd6vDc0o6pOy94xiurWalseBXc01mG90QcsTd9k7gXBCbWGgoG1APel qNMTGPN5EowzIAGrHdjolhX6UKUo9kWidCPDZG5RqoGL3aCcIGt6A5MyNVFS5NLbDE /r1apsQYXZE7g== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Oleg Nesterov , Dylan Hatch , "Eric W . Biederman" , Andrew Morton , Sasha Levin Subject: [PATCH 5.10 63/73] getrusage: use sig->stats_lock rather than lock_task_sighand() Date: Wed, 13 Mar 2024 12:46:30 -0400 Message-ID: <20240313164640.616049-64-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Oleg Nesterov [ Upstream commit f7ec1cd5cc7ef3ad964b677ba82b8b77f1c93009 ] lock_task_sighand() can trigger a hard lockup. If NR_CPUS threads call getrusage() at the same time and the process has NR_THREADS, spin_lock_irq will spin with irqs disabled O(NR_CPUS * NR_THREADS) time. Change getrusage() to use sig->stats_lock, it was specifically designed for this type of use. This way it runs lockless in the likely case. TODO: - Change do_task_stat() to use sig->stats_lock too, then we can remove spin_lock_irq(siglock) in wait_task_zombie(). - Turn sig->stats_lock into seqcount_rwlock_t, this way the readers in the slow mode won't exclude each other. See https://lore.kernel.org/all/20230913154907.GA26210@redhat.com/ - stats_lock has to disable irqs because ->siglock can be taken in irq context, it would be very nice to change __exit_signal() to avoid the siglock->stats_lock dependency. Link: https://lkml.kernel.org/r/20240122155053.GA26214@redhat.com Signed-off-by: Oleg Nesterov Reported-by: Dylan Hatch Tested-by: Dylan Hatch Cc: Eric W. Biederman Cc: Signed-off-by: Andrew Morton Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- kernel/sys.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/kernel/sys.c b/kernel/sys.c index f1ae8fa627145..efc213ae4c5ad 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -1739,7 +1739,9 @@ void getrusage(struct task_struct *p, int who, struct= rusage *r) unsigned long maxrss; struct mm_struct *mm; struct signal_struct *sig =3D p->signal; + unsigned int seq =3D 0; =20 +retry: memset(r, 0, sizeof(*r)); utime =3D stime =3D 0; maxrss =3D 0; @@ -1751,8 +1753,7 @@ void getrusage(struct task_struct *p, int who, struct= rusage *r) goto out_thread; } =20 - if (!lock_task_sighand(p, &flags)) - return; + flags =3D read_seqbegin_or_lock_irqsave(&sig->stats_lock, &seq); =20 switch (who) { case RUSAGE_BOTH: @@ -1780,14 +1781,23 @@ void getrusage(struct task_struct *p, int who, stru= ct rusage *r) r->ru_oublock +=3D sig->oublock; if (maxrss < sig->maxrss) maxrss =3D sig->maxrss; + + rcu_read_lock(); __for_each_thread(sig, t) accumulate_thread_rusage(t, r); + rcu_read_unlock(); + break; =20 default: BUG(); } - unlock_task_sighand(p, &flags); + + if (need_seqretry(&sig->stats_lock, seq)) { + seq =3D 1; + goto retry; + } + done_seqretry_irqrestore(&sig->stats_lock, seq, flags); =20 if (who =3D=3D RUSAGE_CHILDREN) goto out_children; --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7DBA318C6CB; Wed, 13 Mar 2024 16:47:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348474; cv=none; b=QMMNmfWOTkJP0i1jyGKaeGNXEwmpj9HT7EzsEZ4kIep3X2uMPdjxn7ZtzYLfTYL1JOxu70lmax1BsBmCQA/E9v58Td3RLreqwq/b/m4p0Gwgw6o2DEQkemFgvmPM7BxmL0tQ7gF4M8ooUvSd5744kgENckdWiQLGHvcDa75rUdw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348474; c=relaxed/simple; bh=+zfMy0qysLkMPDNujoAlE44iCOdr8QUi6rrAux7OqQM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Z0J01X1TsM2ypfb9ZvCW/TzItDJUJ5Td3q9QM9F80+n1B8Fuan1+r7NphHZbPlDL+heZaQ3YheWjqK8s4eM+OSnpPuqrITlnjkgmFrAku16wMXlUMoOIyqZ4F8lbzCTXlLRIQTmopOlBEt6c8lv68SABdfybb7+0TzQUG75MS14= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=qAtXVKcr; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="qAtXVKcr" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C597DC433C7; Wed, 13 Mar 2024 16:47:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348474; bh=+zfMy0qysLkMPDNujoAlE44iCOdr8QUi6rrAux7OqQM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=qAtXVKcryVhpfRzSTWBCWqIZoTLQf1KNPTdES2BSdv9Ayl6g3GgDu/wBHSWKND87F /kNDCLT96mdd8anZUKsomNV/CYMJeZtHn+ciPXuxTGsqmRyTCfVbCBC54kXvGPwNOE p95ZwvYFvvmfXT7GFTvHLWgPlsvztc0AzB90trTuqghupoEZ34EW6VfpqTrilATJyb TrxOjKOFRm+/6uZuFAZarms0m41TQHM2i3OtvWiJ5CLu7tJDv37xLd1d0g/7sFQLym H3S0Wod6PZcUh2/0s3zk1EWupB4AYxjMnnl8oRcldOT2H9fequyT9OyfvHq4MM+Mt7 gHeg3JLMucWFw== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Ingo Molnar , Sasha Levin Subject: [PATCH 5.10 64/73] exit: Fix typo in comment: s/sub-theads/sub-threads Date: Wed, 13 Mar 2024 12:46:31 -0400 Message-ID: <20240313164640.616049-65-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Ingo Molnar [ Upstream commit dcca34754a3f5290406403b8066e3b15dda9f4bf ] Cc: linux-kernel@vger.kernel.org Signed-off-by: Ingo Molnar Stable-dep-of: c1be35a16b2f ("exit: wait_task_zombie: kill the no longer ne= cessary spin_lock_irq(siglock)") Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- kernel/exit.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/exit.c b/kernel/exit.c index bacdaf980933b..c41bdc0a7f06b 100644 --- a/kernel/exit.c +++ b/kernel/exit.c @@ -1105,7 +1105,7 @@ static int wait_task_zombie(struct wait_opts *wo, str= uct task_struct *p) * p->signal fields because the whole thread group is dead * and nobody can change them. * - * psig->stats_lock also protects us from our sub-theads + * psig->stats_lock also protects us from our sub-threads * which can reap other children at the same time. Until * we change k_getrusage()-like users to rely on this lock * we have to take ->siglock as well. --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AB76C18C6EE; Wed, 13 Mar 2024 16:47:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348475; cv=none; b=K3yCj8KPB3qzyHN0E7ei+ileeaLvqimOsujSkfRHX9DhuVv8QeoRvJbnDrVnhEDhttUvRejWmVMfMLvJMUl79x+bBlbwO3rpmDXmkSf1YALQVSA9rvMBavLS0CX5MmUSo6Lxj69PSJueoaFzj8Cyw9GF+mqLadRrqBjvSqQujYc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348475; c=relaxed/simple; bh=Chwo63+CUgFsse9hE2Vrekasq4uLyH88xEX6ey5kJcU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=MLQgHQVQJo2NdzRSxMRyJWSBaSASJskW4dzDmTcZ7hlrqAqqtRxswLH3VMmme8unY/yAqIskk8LJ3RcUFllwmeuS79+g3hrksNEHzIAHeo4HMIOD2S1IOwQXdWKsQy9dZQB2HlTMXGNj8IZIAKLtAq/6ZzJErmtFmjak0FpMRVQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=lG0jEBNT; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="lG0jEBNT" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A82B5C433F1; Wed, 13 Mar 2024 16:47:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348475; bh=Chwo63+CUgFsse9hE2Vrekasq4uLyH88xEX6ey5kJcU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=lG0jEBNTmzTkB+KN+QGY2tNmL3atzF3hneXDsiNymN7Bv+C77/gGt1WSgtld+2CpV sm6S2Yb6vn8qXY49xoos9kY0Dq0h82S7hsWVJmJWxMdjH1DlTbHPRlVZJKScxcQEWQ IE9/i9HBO608j0er31eRg6by3YIeAZ0mA8GZLfwvBuR/t0SU4z/yxZZWQ8gfZipaxG L3ptvEHz09qQxlMvldz8WwQ+DnfxkX/RVDQsrjxgv1pLxaMJvcui5b370ejxrxh1/P NATLhdftlnb8TWH2jSDq0VanxRnU2HoA5ERkZ9YOqfbPWfRZo68LHeFpJntw67Lmj1 keU36DFJ/dktg== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Oleg Nesterov , Dylan Hatch , "Eric W . Biederman" , Andrew Morton , Sasha Levin Subject: [PATCH 5.10 65/73] exit: wait_task_zombie: kill the no longer necessary spin_lock_irq(siglock) Date: Wed, 13 Mar 2024 12:46:32 -0400 Message-ID: <20240313164640.616049-66-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Oleg Nesterov [ Upstream commit c1be35a16b2f1fe21f4f26f9de030ad6eaaf6a25 ] After the recent changes nobody use siglock to read the values protected by stats_lock, we can kill spin_lock_irq(¤t->sighand->siglock) and update the comment. With this patch only __exit_signal() and thread_group_start_cputime() take stats_lock under siglock. Link: https://lkml.kernel.org/r/20240123153359.GA21866@redhat.com Signed-off-by: Oleg Nesterov Signed-off-by: Dylan Hatch Cc: Eric W. Biederman Cc: Signed-off-by: Andrew Morton Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- kernel/exit.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/kernel/exit.c b/kernel/exit.c index c41bdc0a7f06b..8f25abdd5fa7d 100644 --- a/kernel/exit.c +++ b/kernel/exit.c @@ -1106,17 +1106,14 @@ static int wait_task_zombie(struct wait_opts *wo, s= truct task_struct *p) * and nobody can change them. * * psig->stats_lock also protects us from our sub-threads - * which can reap other children at the same time. Until - * we change k_getrusage()-like users to rely on this lock - * we have to take ->siglock as well. + * which can reap other children at the same time. * * We use thread_group_cputime_adjusted() to get times for * the thread group, which consolidates times for all threads * in the group including the group leader. */ thread_group_cputime_adjusted(p, &tgutime, &tgstime); - spin_lock_irq(¤t->sighand->siglock); - write_seqlock(&psig->stats_lock); + write_seqlock_irq(&psig->stats_lock); psig->cutime +=3D tgutime + sig->cutime; psig->cstime +=3D tgstime + sig->cstime; psig->cgtime +=3D task_gtime(p) + sig->gtime + sig->cgtime; @@ -1139,8 +1136,7 @@ static int wait_task_zombie(struct wait_opts *wo, str= uct task_struct *p) psig->cmaxrss =3D maxrss; task_io_accounting_add(&psig->ioac, &p->ioac); task_io_accounting_add(&psig->ioac, &sig->ioac); - write_sequnlock(&psig->stats_lock); - spin_unlock_irq(¤t->sighand->siglock); + write_sequnlock_irq(&psig->stats_lock); } =20 if (wo->wo_rusage) --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C589A18CE88; Wed, 13 Mar 2024 16:47:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348476; cv=none; b=nhfQgvedj04YMCRqWAsLvSRhflx576g05jIYZsvPGmF3xa3qe4Z0vwBmsaGIIL+Uv7wFctWLBMDvzegilNMWE/tlqL5pDW8eJUmQitkEvooLJNnNO5g/PgfmZWrsTXYfHv0/SGq5TGB4K2SRMHbUYVcawKHL+DKwrUQn0x47yN0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348476; c=relaxed/simple; bh=AwSfW00Oqx1S8JYMbz0iz8+zYd9ifGgR8q1OwaY3Cls=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CZDDeAEKakrGhY++ChLja+dpOLOYBgvkSCZe9Tnl76htq8t1lGJ9UGYByotW1eExugBOt84WU93MSZpAHgTS5nTfVmj1gHwAsVyGHotbXlPvZh/sb3xAB6orE9i6GRg/7yxhSeKKk12D8CP9Vl7Kx/zz1JdJr61jKcNW1nQkIjg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=DgwFB9ta; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="DgwFB9ta" Received: by smtp.kernel.org (Postfix) with ESMTPSA id D7524C43399; Wed, 13 Mar 2024 16:47:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348476; bh=AwSfW00Oqx1S8JYMbz0iz8+zYd9ifGgR8q1OwaY3Cls=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=DgwFB9tamHTJ+uJE7KVFyTfnoKR52mhVZYldsYgTRlzq/OeYNtDfeSOS14IS14/YA brXueKtAApPJSyhuipGfcapgqLZXYPCScPTKtLreMHrnD/s2MxhyXUZX8V7OFFdEXI dM383uYYBClCZydgBPSJce6I1ltPrXvJ+nGoZYyK/5pxWVkhO44b+DwKtsjMRTJtI1 h3IP8H993omHy2fOcNJsX9AEbiIprgoml5WYGtkZ6F9wtjvURNI37jVzeutfzfzlf6 EzdUdSZG34mYQdUApgKMpM31RKbTTsNPMPDsVtuWeBRCWEo75ko3oI2o2YWScf0WyM MiR2tsT4Ssm+Q== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Andy Shevchenko , Dan Carpenter , Greg Kroah-Hartman , Sasha Levin Subject: [PATCH 5.10 66/73] serial: max310x: Unprepare and disable clock in error path Date: Wed, 13 Mar 2024 12:46:33 -0400 Message-ID: <20240313164640.616049-67-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Andy Shevchenko [ Upstream commit 61acabaae5ba58b3c32e6e90d24c2c0827fd27a8 ] In one error case the clock may be left prepared and enabled. Unprepare and disable clock in that case to balance state of the hardware. Fixes: d4d6f03c4fb3 ("serial: max310x: Try to get crystal clock rate from p= roperty") Reported-by: Dan Carpenter Signed-off-by: Andy Shevchenko Link: https://lore.kernel.org/r/20210625153733.12911-1-andriy.shevchenko@li= nux.intel.com Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- drivers/tty/serial/max310x.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/tty/serial/max310x.c b/drivers/tty/serial/max310x.c index 978d9d93127e5..a09ec46e0310d 100644 --- a/drivers/tty/serial/max310x.c +++ b/drivers/tty/serial/max310x.c @@ -1293,7 +1293,8 @@ static int max310x_probe(struct device *dev, const st= ruct max310x_devtype *devty freq =3D uartclk; if (freq =3D=3D 0) { dev_err(dev, "Cannot get clock rate\n"); - return -EINVAL; + ret =3D -EINVAL; + goto out_clk; } =20 if (xtal) { --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E1D7E18CEA7; Wed, 13 Mar 2024 16:47:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348478; cv=none; b=VFiZAW72m2RdtAh4eiJcCIyL+figzg7BTgLGQVbGNdk38FZlPgGjyPHE8oSq0sCEhwmBEhCpoZZxVlWvn2R2mzJd4YGZ2DfbHQV+0y5deFn2j/kHae/MCUtmznAZVmv8neb3KGfk5p98mv49G4Rkw2lkWjqTE7+lbPZDvZ/XNao= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348478; c=relaxed/simple; bh=XuQhqZUrOCgjE5sn6FggSkuNapMlOOqVxZbhbkA4jrY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=HeiUyAyE1V9X0K7Q6gY8OkC6U2NPWjzR29ApNAJWCo4irOhxidcjUvRE1jdbCtaNSFUBWrES8Xgmtp57Genf9XAbDfD7+9BY21sVqVQwN8eI5tk87VPNjcUEn61mo3JVi3gc1M3H/ScJ3pGrI6qeN4LzIre6KwkF5Tmc1wjJeHc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=SUYPNu7X; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="SUYPNu7X" Received: by smtp.kernel.org (Postfix) with ESMTPSA id F2B45C43394; Wed, 13 Mar 2024 16:47:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348477; bh=XuQhqZUrOCgjE5sn6FggSkuNapMlOOqVxZbhbkA4jrY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=SUYPNu7XlogvB77vc13dBPB61lDFEh4qjCZ7H++C7V5ytilMhiWhyCVdnvInRYPlq v3gU/JJQd7Mx5CNaTMfd2U3LDWJgIaYFaOQvIEzuobbLDJTvXvVnyp+OogL3Oj4TUg Xtzql7etY68EopUeEjJKv/BOGg6FPCaJEkQYnWzCz6spF2aAFfWbDGhjrr5wlpJODh tc65YB1A0CkH6rfFN15zbgg+ePFOFLDcByIl5D3EMJG+y1z+UGuev89J9MhHxFRbn4 JDp+piyi31NRKgpeKgz1sszODcfbQX5wrbHjZ9zmtQxXrxIhlFnNWGoXjBegsHnG3Q S4ytB20bPAy3A== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: "Andrea Parri (Microsoft)" , Michael Kelley , Wei Liu , Sasha Levin Subject: [PATCH 5.10 67/73] Drivers: hv: vmbus: Drop error message when 'No request id available' Date: Wed, 13 Mar 2024 12:46:34 -0400 Message-ID: <20240313164640.616049-68-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: "Andrea Parri (Microsoft)" [ Upstream commit 0c85c54bf7faeb80c6b76901ed77d93acef0207d ] Running out of request IDs on a channel essentially produces the same effect as running out of space in the ring buffer, in that -EAGAIN is returned. The error message in hv_ringbuffer_write() should either be dropped (since we don't output a message when the ring buffer is full) or be made conditional/debug-only. Suggested-by: Michael Kelley Signed-off-by: Andrea Parri (Microsoft) Fixes: e8b7db38449ac ("Drivers: hv: vmbus: Add vmbus_requestor data structu= re for VMBus hardening") Link: https://lore.kernel.org/r/20210301191348.196485-1-parri.andrea@gmail.= com Signed-off-by: Wei Liu Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- drivers/hv/ring_buffer.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/hv/ring_buffer.c b/drivers/hv/ring_buffer.c index a0ba6ac487368..a49cc69c56af0 100644 --- a/drivers/hv/ring_buffer.c +++ b/drivers/hv/ring_buffer.c @@ -326,7 +326,6 @@ int hv_ringbuffer_write(struct vmbus_channel *channel, rqst_id =3D vmbus_next_request_id(&channel->requestor, requestid); if (rqst_id =3D=3D VMBUS_RQST_ERROR) { spin_unlock_irqrestore(&outring_info->ring_lock, flags); - pr_err("No request id available\n"); return -EAGAIN; } } --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EF58759172; Wed, 13 Mar 2024 16:47:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348479; cv=none; b=SOn9JYrq9CtUOm+fEtubhV2JkQ3eW4NXHkVgre+xaIDnx9sgDD625UMEAy2BE6kEpQ1gBlfo9Y8qoQL1hgI/e3lSbP1msmmtZ3OvFWm1hkecHUvJlbf81/ON8oVSyjxTaJ0ObDfKYHBfa+CAwdmPWtB4mmoB0ktcKhO5MtVKAgk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348479; c=relaxed/simple; bh=nn5a3Fq9a0BrlTENyoAijgRD2DIHNw/iyg0oC7+hBpM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mRvbq5VjINzPpbDVHAATJ4hnPp95KsDJBkN55NCeuWkJsKQ4zvoif570YOs2j76y+hqFoN0OMZVsTOE/EeKpFu+XfyUsqg+TLOKIiXAm2TR1HroEjjZuVnu1p+6/u0QENQjEvePbST/AsDtftU9FTCKptrPIMZxGwxQ1/l0eJAU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=LNnWjLFo; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="LNnWjLFo" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1689FC43390; Wed, 13 Mar 2024 16:47:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348478; bh=nn5a3Fq9a0BrlTENyoAijgRD2DIHNw/iyg0oC7+hBpM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=LNnWjLFo+3Ds2Ag+ozkEefmSfvywGz39ZI3myvR5TvL+V18Mpsj0oJXDKSzZLlRY2 u9x2r45TGllbeDslxEPM2/0wlDLCII/2m+J2ZLH7zE7ZpdX+HStt2oxs3cz7W4RMXr aSi2ZcOJa8VTvEdmqhNLLiGEP58DibZnZrZuiJ3Te4rSDu/BZMtScjsei/916MAQkB f8b3c8KWe6x4mIO2gYqVJM9krGCvwkU6QlMpgykgnXAsb/pB8bcs4bwcBpGt4oyVUE 2t3bEcPeVWA1bN4JkvdwQYvyXUatxou/7VxEjGOy3YOOYzYPIq8KZdcVnYjovFzJdy G8mBuZmad8eyg== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Ansuel Smith , Mark Brown , Sasha Levin Subject: [PATCH 5.10 68/73] regmap: allow to define reg_update_bits for no bus configuration Date: Wed, 13 Mar 2024 12:46:35 -0400 Message-ID: <20240313164640.616049-69-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Ansuel Smith [ Upstream commit 02d6fdecb9c38de19065f6bed8d5214556fd061d ] Some device requires a special handling for reg_update_bits and can't use the normal regmap read write logic. An example is when locking is handled by the device and rmw operations requires to do atomic operations. Allow to declare a dedicated function in regmap_config for reg_update_bits in no bus configuration. Signed-off-by: Ansuel Smith Link: https://lore.kernel.org/r/20211104150040.1260-1-ansuelsmth@gmail.com Signed-off-by: Mark Brown Stable-dep-of: 3f42b142ea11 ("serial: max310x: fix IO data corruption in ba= tched operations") Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- drivers/base/regmap/regmap.c | 1 + include/linux/regmap.h | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c index 7bc603145bd98..8f39aacdad0dc 100644 --- a/drivers/base/regmap/regmap.c +++ b/drivers/base/regmap/regmap.c @@ -842,6 +842,7 @@ struct regmap *__regmap_init(struct device *dev, if (!bus) { map->reg_read =3D config->reg_read; map->reg_write =3D config->reg_write; + map->reg_update_bits =3D config->reg_update_bits; =20 map->defer_caching =3D false; goto skip_format_initialization; diff --git a/include/linux/regmap.h b/include/linux/regmap.h index e7834d98207f7..d6f0d876fa424 100644 --- a/include/linux/regmap.h +++ b/include/linux/regmap.h @@ -289,6 +289,11 @@ typedef void (*regmap_unlock)(void *); * read operation on a bus such as SPI, I2C, etc. Most of the * devices do not need this. * @reg_write: Same as above for writing. + * @reg_update_bits: Optional callback that if filled will be used to perf= orm + * all the update_bits(rmw) operation. Should only be provided + * if the function require special handling with lock and reg + * handling and the operation cannot be represented as a simple + * update_bits operation on a bus such as SPI, I2C, etc. * @fast_io: Register IO is fast. Use a spinlock instead of a mutex * to perform locking. This field is ignored if custom lock/unlock * functions are used (see fields lock/unlock of struct regmap_con= fig). @@ -366,6 +371,8 @@ struct regmap_config { =20 int (*reg_read)(void *context, unsigned int reg, unsigned int *val); int (*reg_write)(void *context, unsigned int reg, unsigned int val); + int (*reg_update_bits)(void *context, unsigned int reg, + unsigned int mask, unsigned int val); =20 bool fast_io; =20 --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CB91218D3FC; Wed, 13 Mar 2024 16:48:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348480; cv=none; b=TKbmTeSLYi5o/7P23tGl/dTGvpMIiCQUc0lrswWm4mzTwrGpaQ+sKfzNtkfrJUgUE2+pRyroQpA+wQ+VbAwOvUbzlwPD9kTBcoa/UfzqEF7P2+3iv7A7IdydBpf/u5SMPVXM3sTVRxZNAfI0UG+rb+RPmPxe4+j0CUVJ8IthhVY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348480; c=relaxed/simple; bh=LJY5AinarXB+c+JK7G+QroadqR6FgM/S3F7mni6LNL0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=f9rsXtwM5uF2ncxbL6e2jyvIW10sLuDltme/URm7Fy/3sRvEQTD2pUaWPf76x7YIdUgdpdsTZxpW7uXTnNEe5YCqPJ+5RFwtAg31NV7LV8e1ZeG3THhmfTRG7VbaFFtacaJlediQIEfUxehmMqW08nBD2yEbF0AciDGQEC8mYZo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=to4VCg57; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="to4VCg57" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 22F94C433C7; Wed, 13 Mar 2024 16:47:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348480; bh=LJY5AinarXB+c+JK7G+QroadqR6FgM/S3F7mni6LNL0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=to4VCg57jZ7U8GlGM8TCp/WtgE1TpqI3KhpEok73jTkgunhxIuZ8E1MhDrC1OXmES UnKHlJFZYUClmkaLeUi01Gwf6z99nswPlrxzXyCKJuwv4U8hK/iQI388YYEdvrF071 R1L3xNPcJ42N58BHSqvicWTSqP8oxMdzJlUTQo8x07BQgdqquwgqJuDmVAr73nxKTX EiGqkYcqPfTzaYRavJ/pA7PTL+7kLkbWXRYv5W3kCaI5LnMOxPvjmAE8bSUcj5JHtO V5RaL6gbZ6GEETcpkzgtgb71aGu4mgcRTgDIihb9jxQItc5r7aEHUh8XIgLHZGtjZp vTjaSC4TIHs+w== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Marek Vasut , Jagan Teki , Mark Brown , Maxime Ripard , Robert Foss , Sam Ravnborg , Thomas Zimmermann , Sasha Levin Subject: [PATCH 5.10 69/73] regmap: Add bulk read/write callbacks into regmap_config Date: Wed, 13 Mar 2024 12:46:36 -0400 Message-ID: <20240313164640.616049-70-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Marek Vasut [ Upstream commit d77e745613680c54708470402e2b623dcd769681 ] Currently the regmap_config structure only allows the user to implement single element register read/write using .reg_read/.reg_write callbacks. The regmap_bus already implements bulk counterparts of both, and is being misused as a workaround for the missing bulk read/write callbacks in regmap_config by a couple of drivers. To stop this misuse, add the bulk read/write callbacks to regmap_config and call them from the regmap core code. Signed-off-by: Marek Vasut Cc: Jagan Teki Cc: Mark Brown Cc: Maxime Ripard Cc: Robert Foss Cc: Sam Ravnborg Cc: Thomas Zimmermann To: dri-devel@lists.freedesktop.org Link: https://lore.kernel.org/r/20220430025145.640305-1-marex@denx.de Signed-off-by: Mark Brown Stable-dep-of: 3f42b142ea11 ("serial: max310x: fix IO data corruption in ba= tched operations") Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- drivers/base/regmap/internal.h | 4 ++ drivers/base/regmap/regmap.c | 76 ++++++++++++++++++---------------- include/linux/regmap.h | 12 ++++++ 3 files changed, 56 insertions(+), 36 deletions(-) diff --git a/drivers/base/regmap/internal.h b/drivers/base/regmap/internal.h index 0097696c31de2..2720d8d7bbfc9 100644 --- a/drivers/base/regmap/internal.h +++ b/drivers/base/regmap/internal.h @@ -104,6 +104,10 @@ struct regmap { int (*reg_write)(void *context, unsigned int reg, unsigned int val); int (*reg_update_bits)(void *context, unsigned int reg, unsigned int mask, unsigned int val); + /* Bulk read/write */ + int (*read)(void *context, const void *reg_buf, size_t reg_size, + void *val_buf, size_t val_size); + int (*write)(void *context, const void *data, size_t count); =20 bool defer_caching; =20 diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c index 8f39aacdad0dc..2dfd6aa600450 100644 --- a/drivers/base/regmap/regmap.c +++ b/drivers/base/regmap/regmap.c @@ -800,12 +800,15 @@ struct regmap *__regmap_init(struct device *dev, map->reg_stride_order =3D ilog2(map->reg_stride); else map->reg_stride_order =3D -1; - map->use_single_read =3D config->use_single_read || !bus || !bus->read; - map->use_single_write =3D config->use_single_write || !bus || !bus->write; - map->can_multi_write =3D config->can_multi_write && bus && bus->write; + map->use_single_read =3D config->use_single_read || !(config->read || (bu= s && bus->read)); + map->use_single_write =3D config->use_single_write || !(config->write || = (bus && bus->write)); + map->can_multi_write =3D config->can_multi_write && (config->write || (bu= s && bus->write)); if (bus) { map->max_raw_read =3D bus->max_raw_read; map->max_raw_write =3D bus->max_raw_write; + } else if (config->max_raw_read && config->max_raw_write) { + map->max_raw_read =3D config->max_raw_read; + map->max_raw_write =3D config->max_raw_write; } map->dev =3D dev; map->bus =3D bus; @@ -839,7 +842,16 @@ struct regmap *__regmap_init(struct device *dev, map->read_flag_mask =3D bus->read_flag_mask; } =20 - if (!bus) { + if (config && config->read && config->write) { + map->reg_read =3D _regmap_bus_read; + + /* Bulk read/write */ + map->read =3D config->read; + map->write =3D config->write; + + reg_endian =3D REGMAP_ENDIAN_NATIVE; + val_endian =3D REGMAP_ENDIAN_NATIVE; + } else if (!bus) { map->reg_read =3D config->reg_read; map->reg_write =3D config->reg_write; map->reg_update_bits =3D config->reg_update_bits; @@ -856,10 +868,13 @@ struct regmap *__regmap_init(struct device *dev, } else { map->reg_read =3D _regmap_bus_read; map->reg_update_bits =3D bus->reg_update_bits; - } + /* Bulk read/write */ + map->read =3D bus->read; + map->write =3D bus->write; =20 - reg_endian =3D regmap_get_reg_endian(bus, config); - val_endian =3D regmap_get_val_endian(dev, bus, config); + reg_endian =3D regmap_get_reg_endian(bus, config); + val_endian =3D regmap_get_val_endian(dev, bus, config); + } =20 switch (config->reg_bits + map->reg_shift) { case 2: @@ -1628,8 +1643,6 @@ static int _regmap_raw_write_impl(struct regmap *map,= unsigned int reg, size_t len; int i; =20 - WARN_ON(!map->bus); - /* Check for unwritable or noinc registers in range * before we start */ @@ -1711,7 +1724,7 @@ static int _regmap_raw_write_impl(struct regmap *map,= unsigned int reg, val =3D work_val; } =20 - if (map->async && map->bus->async_write) { + if (map->async && map->bus && map->bus->async_write) { struct regmap_async *async; =20 trace_regmap_async_write_start(map, reg, val_len); @@ -1779,10 +1792,10 @@ static int _regmap_raw_write_impl(struct regmap *ma= p, unsigned int reg, * write. */ if (val =3D=3D work_val) - ret =3D map->bus->write(map->bus_context, map->work_buf, - map->format.reg_bytes + - map->format.pad_bytes + - val_len); + ret =3D map->write(map->bus_context, map->work_buf, + map->format.reg_bytes + + map->format.pad_bytes + + val_len); else if (map->bus->gather_write) ret =3D map->bus->gather_write(map->bus_context, map->work_buf, map->format.reg_bytes + @@ -1801,7 +1814,7 @@ static int _regmap_raw_write_impl(struct regmap *map,= unsigned int reg, memcpy(buf, map->work_buf, map->format.reg_bytes); memcpy(buf + map->format.reg_bytes + map->format.pad_bytes, val, val_len); - ret =3D map->bus->write(map->bus_context, buf, len); + ret =3D map->write(map->bus_context, buf, len); =20 kfree(buf); } else if (ret !=3D 0 && !map->cache_bypass && map->format.parse_val) { @@ -1858,7 +1871,7 @@ static int _regmap_bus_formatted_write(void *context,= unsigned int reg, struct regmap_range_node *range; struct regmap *map =3D context; =20 - WARN_ON(!map->bus || !map->format.format_write); + WARN_ON(!map->format.format_write); =20 range =3D _regmap_range_lookup(map, reg); if (range) { @@ -1871,8 +1884,7 @@ static int _regmap_bus_formatted_write(void *context,= unsigned int reg, =20 trace_regmap_hw_write_start(map, reg, 1); =20 - ret =3D map->bus->write(map->bus_context, map->work_buf, - map->format.buf_size); + ret =3D map->write(map->bus_context, map->work_buf, map->format.buf_size); =20 trace_regmap_hw_write_done(map, reg, 1); =20 @@ -1892,7 +1904,7 @@ static int _regmap_bus_raw_write(void *context, unsig= ned int reg, { struct regmap *map =3D context; =20 - WARN_ON(!map->bus || !map->format.format_val); + WARN_ON(!map->format.format_val); =20 map->format.format_val(map->work_buf + map->format.reg_bytes + map->format.pad_bytes, val, 0); @@ -1906,7 +1918,7 @@ static int _regmap_bus_raw_write(void *context, unsig= ned int reg, =20 static inline void *_regmap_map_get_context(struct regmap *map) { - return (map->bus) ? map : map->bus_context; + return (map->bus || (!map->bus && map->read)) ? map : map->bus_context; } =20 int _regmap_write(struct regmap *map, unsigned int reg, @@ -2313,7 +2325,7 @@ static int _regmap_raw_multi_reg_write(struct regmap = *map, u8 =3D buf; *u8 |=3D map->write_flag_mask; =20 - ret =3D map->bus->write(map->bus_context, buf, len); + ret =3D map->write(map->bus_context, buf, len); =20 kfree(buf); =20 @@ -2619,9 +2631,7 @@ static int _regmap_raw_read(struct regmap *map, unsig= ned int reg, void *val, struct regmap_range_node *range; int ret; =20 - WARN_ON(!map->bus); - - if (!map->bus || !map->bus->read) + if (!map->read) return -EINVAL; =20 range =3D _regmap_range_lookup(map, reg); @@ -2637,9 +2647,9 @@ static int _regmap_raw_read(struct regmap *map, unsig= ned int reg, void *val, map->read_flag_mask); trace_regmap_hw_read_start(map, reg, val_len / map->format.val_bytes); =20 - ret =3D map->bus->read(map->bus_context, map->work_buf, - map->format.reg_bytes + map->format.pad_bytes, - val, val_len); + ret =3D map->read(map->bus_context, map->work_buf, + map->format.reg_bytes + map->format.pad_bytes, + val, val_len); =20 trace_regmap_hw_read_done(map, reg, val_len / map->format.val_bytes); =20 @@ -2750,8 +2760,6 @@ int regmap_raw_read(struct regmap *map, unsigned int = reg, void *val, unsigned int v; int ret, i; =20 - if (!map->bus) - return -EINVAL; if (val_len % map->format.val_bytes) return -EINVAL; if (!IS_ALIGNED(reg, map->reg_stride)) @@ -2766,7 +2774,7 @@ int regmap_raw_read(struct regmap *map, unsigned int = reg, void *val, size_t chunk_count, chunk_bytes; size_t chunk_regs =3D val_count; =20 - if (!map->bus->read) { + if (!map->read) { ret =3D -ENOTSUPP; goto out; } @@ -2826,7 +2834,7 @@ EXPORT_SYMBOL_GPL(regmap_raw_read); * @val: Pointer to data buffer * @val_len: Length of output buffer in bytes. * - * The regmap API usually assumes that bulk bus read operations will read a + * The regmap API usually assumes that bulk read operations will read a * range of registers. Some devices have certain registers for which a read * operation read will read from an internal FIFO. * @@ -2844,10 +2852,6 @@ int regmap_noinc_read(struct regmap *map, unsigned i= nt reg, size_t read_len; int ret; =20 - if (!map->bus) - return -EINVAL; - if (!map->bus->read) - return -ENOTSUPP; if (val_len % map->format.val_bytes) return -EINVAL; if (!IS_ALIGNED(reg, map->reg_stride)) @@ -2961,7 +2965,7 @@ int regmap_bulk_read(struct regmap *map, unsigned int= reg, void *val, if (val_count =3D=3D 0) return -EINVAL; =20 - if (map->bus && map->format.parse_inplace && (vol || map->cache_type =3D= =3D REGCACHE_NONE)) { + if (map->format.parse_inplace && (vol || map->cache_type =3D=3D REGCACHE_= NONE)) { ret =3D regmap_raw_read(map, reg, val, val_bytes * val_count); if (ret !=3D 0) return ret; diff --git a/include/linux/regmap.h b/include/linux/regmap.h index d6f0d876fa424..83a7485de78fb 100644 --- a/include/linux/regmap.h +++ b/include/linux/regmap.h @@ -294,6 +294,12 @@ typedef void (*regmap_unlock)(void *); * if the function require special handling with lock and reg * handling and the operation cannot be represented as a simple * update_bits operation on a bus such as SPI, I2C, etc. + * @read: Optional callback that if filled will be used to perform all the + * bulk reads from the registers. Data is returned in the buffer us= ed + * to transmit data. + * @write: Same as above for writing. + * @max_raw_read: Max raw read size that can be used on the device. + * @max_raw_write: Max raw write size that can be used on the device. * @fast_io: Register IO is fast. Use a spinlock instead of a mutex * to perform locking. This field is ignored if custom lock/unlock * functions are used (see fields lock/unlock of struct regmap_con= fig). @@ -373,6 +379,12 @@ struct regmap_config { int (*reg_write)(void *context, unsigned int reg, unsigned int val); int (*reg_update_bits)(void *context, unsigned int reg, unsigned int mask, unsigned int val); + /* Bulk read/write */ + int (*read)(void *context, const void *reg_buf, size_t reg_size, + void *val_buf, size_t val_size); + int (*write)(void *context, const void *data, size_t count); + size_t max_raw_read; + size_t max_raw_write; =20 bool fast_io; =20 --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9713718DC8E; Wed, 13 Mar 2024 16:48:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348481; cv=none; b=rgdL4BLVHv42MK7MssctMb5eQzrjOf5IeQzmmbY+99Ls7tUnzr7mePmT2esHi+78IOaLSDrSxUMvYWwK3TJ4uHztpYI7shJCFi8DqpHTfpi0kvB/3c0h7nImjWv5cdwt8eaegQo5aVAvtn4ddhnFRG4tfkeHe1TjNqGL7wFXgoA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348481; c=relaxed/simple; bh=9lzwCHS6A32+VxdmU1FhUsZBTyFFxCDk4Ecv5s2kmnk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=QGdgJuxbkheS/Ln3MPLklhGiWdFSYlgQbsmwOyYxzjlQQaL9O8ADwzpJIe/gjm0kDlq3poaEl2DzXUyEc+veQPT644X/xKtnDn+73e0lGZHl15tHE5sPJtv0kYTo7OC2JyVTjIS+iw74noCxqQoBHXbRY1QpGFb/8xiZ4Lxj7Ho= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=jbHrL0xi; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="jbHrL0xi" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A5644C43394; Wed, 13 Mar 2024 16:48:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348481; bh=9lzwCHS6A32+VxdmU1FhUsZBTyFFxCDk4Ecv5s2kmnk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=jbHrL0xiGhLyDksWIfHoB3oKru/DusjKae7jC3lNf7OTuRcuW0S1Vgl01SPDNN/mn vcT1q4bQ+2DiEx17bx/tX4zDaz6kr7PtblvsrgHnjE7COksVYAEd80WkPAW4fBBvZb TdIiOMEp23LDTtIaoPAA7DcouyPs2kkVchV4J/6/Tc5JtJezuuDWQ4hr94vvVLUVBi H6UE5faV4gmQu+CVFjANknehv5BwyPw232BO4ZdrndxTRayUHkWvJ9lLSJhplCHFZm /vVm+EQx9wmJnC+FSWbL2KLHkLgaJyP+PA4wrY3hhb+u7wKOPSy3mPsfGqN3bMWh+H KgOHr1bKi476A== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Cosmin Tanislav , Andy Shevchenko , Greg Kroah-Hartman , Sasha Levin Subject: [PATCH 5.10 70/73] serial: max310x: make accessing revision id interface-agnostic Date: Wed, 13 Mar 2024 12:46:37 -0400 Message-ID: <20240313164640.616049-71-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Cosmin Tanislav [ Upstream commit b3883ab5e95713e479f774ea68be275413e8e5b2 ] SPI can only use 5 address bits, since one bit is reserved for specifying R/W and 2 bits are used to specify the UART port. To access registers that have addresses past 0x1F, an extended register space can be enabled by writing to the GlobalCommand register (address 0x1F). I2C uses 8 address bits. The R/W bit is placed in the slave address, and so is the UART port. Because of this, registers that have addresses higher than 0x1F can be accessed normally. To access the RevID register, on SPI, 0xCE must be written to the 0x1F address to enable the extended register space, after which the RevID register is accessible at address 0x5. 0xCD must be written to the 0x1F address to disable the extended register space. On I2C, the RevID register is accessible at address 0x25. Create an interface config struct, and add a method for toggling the extended register space and a member for the RevId register address. Implement these for SPI. Reviewed-by: Andy Shevchenko Signed-off-by: Cosmin Tanislav Link: https://lore.kernel.org/r/20220605144659.4169853-4-demonsingur@gmail.= com Signed-off-by: Greg Kroah-Hartman Stable-dep-of: 3f42b142ea11 ("serial: max310x: fix IO data corruption in ba= tched operations") Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- drivers/tty/serial/max310x.c | 40 +++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/drivers/tty/serial/max310x.c b/drivers/tty/serial/max310x.c index a09ec46e0310d..b90281ac54c85 100644 --- a/drivers/tty/serial/max310x.c +++ b/drivers/tty/serial/max310x.c @@ -72,7 +72,7 @@ #define MAX310X_GLOBALCMD_REG MAX310X_REG_1F /* Global Command (WO) */ =20 /* Extended registers */ -#define MAX310X_REVID_EXTREG MAX310X_REG_05 /* Revision ID */ +#define MAX310X_SPI_REVID_EXTREG MAX310X_REG_05 /* Revision ID */ =20 /* IRQ register bits */ #define MAX310X_IRQ_LSR_BIT (1 << 0) /* LSR interrupt */ @@ -253,6 +253,12 @@ #define MAX14830_BRGCFG_CLKDIS_BIT (1 << 6) /* Clock Disable */ #define MAX14830_REV_ID (0xb0) =20 +struct max310x_if_cfg { + int (*extended_reg_enable)(struct device *dev, bool enable); + + unsigned int rev_id_reg; +}; + struct max310x_devtype { char name[9]; int nr; @@ -275,6 +281,7 @@ struct max310x_one { =20 struct max310x_port { const struct max310x_devtype *devtype; + const struct max310x_if_cfg *if_cfg; struct regmap *regmap; struct clk *clk; #ifdef CONFIG_GPIOLIB @@ -364,13 +371,12 @@ static int max3109_detect(struct device *dev) unsigned int val =3D 0; int ret; =20 - ret =3D regmap_write(s->regmap, MAX310X_GLOBALCMD_REG, - MAX310X_EXTREG_ENBL); + ret =3D s->if_cfg->extended_reg_enable(dev, true); if (ret) return ret; =20 - regmap_read(s->regmap, MAX310X_REVID_EXTREG, &val); - regmap_write(s->regmap, MAX310X_GLOBALCMD_REG, MAX310X_EXTREG_DSBL); + regmap_read(s->regmap, s->if_cfg->rev_id_reg, &val); + s->if_cfg->extended_reg_enable(dev, false); if (((val & MAX310x_REV_MASK) !=3D MAX3109_REV_ID)) { dev_err(dev, "%s ID 0x%02x does not match\n", s->devtype->name, val); @@ -395,13 +401,12 @@ static int max14830_detect(struct device *dev) unsigned int val =3D 0; int ret; =20 - ret =3D regmap_write(s->regmap, MAX310X_GLOBALCMD_REG, - MAX310X_EXTREG_ENBL); + ret =3D s->if_cfg->extended_reg_enable(dev, true); if (ret) return ret; =09 - regmap_read(s->regmap, MAX310X_REVID_EXTREG, &val); - regmap_write(s->regmap, MAX310X_GLOBALCMD_REG, MAX310X_EXTREG_DSBL); + regmap_read(s->regmap, s->if_cfg->rev_id_reg, &val); + s->if_cfg->extended_reg_enable(dev, false); if (((val & MAX310x_REV_MASK) !=3D MAX14830_REV_ID)) { dev_err(dev, "%s ID 0x%02x does not match\n", s->devtype->name, val); @@ -1250,6 +1255,7 @@ static int max310x_gpio_set_config(struct gpio_chip *= chip, unsigned int offset, #endif =20 static int max310x_probe(struct device *dev, const struct max310x_devtype = *devtype, + const struct max310x_if_cfg *if_cfg, struct regmap *regmaps[], int irq) { int i, ret, fmin, fmax, freq; @@ -1313,6 +1319,7 @@ static int max310x_probe(struct device *dev, const st= ruct max310x_devtype *devty =20 s->regmap =3D regmaps[0]; s->devtype =3D devtype; + s->if_cfg =3D if_cfg; dev_set_drvdata(dev, s); =20 /* Check device to ensure we are talking to what we expect */ @@ -1482,6 +1489,19 @@ static struct regmap_config regcfg =3D { }; =20 #ifdef CONFIG_SPI_MASTER +static int max310x_spi_extended_reg_enable(struct device *dev, bool enable) +{ + struct max310x_port *s =3D dev_get_drvdata(dev); + + return regmap_write(s->regmap, MAX310X_GLOBALCMD_REG, + enable ? MAX310X_EXTREG_ENBL : MAX310X_EXTREG_DSBL); +} + +static const struct max310x_if_cfg __maybe_unused max310x_spi_if_cfg =3D { + .extended_reg_enable =3D max310x_spi_extended_reg_enable, + .rev_id_reg =3D MAX310X_SPI_REVID_EXTREG, +}; + static int max310x_spi_probe(struct spi_device *spi) { const struct max310x_devtype *devtype; @@ -1508,7 +1528,7 @@ static int max310x_spi_probe(struct spi_device *spi) regmaps[i] =3D devm_regmap_init_spi(spi, ®cfg); } =20 - return max310x_probe(&spi->dev, devtype, regmaps, spi->irq); + return max310x_probe(&spi->dev, devtype, &max310x_spi_if_cfg, regmaps, sp= i->irq); } =20 static int max310x_spi_remove(struct spi_device *spi) --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B054A18DCAD; Wed, 13 Mar 2024 16:48:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348482; cv=none; b=V4dYQUGueXhFbOxcQeesSj/Na1fZGM/Sf2BRMzXSj1qLDXPxoJ5OQRDxUGuCfLrGd+TvN23DH5S9fk4FYnAizHRoCBjwpnsCVUYtQZQmkF7sgzKwgmRyYtxF0rBc3bYvWvz9dmyejEbG+rVQqLi5ZkdGECRMX/FL4oZ8kd5LKd4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348482; c=relaxed/simple; bh=eOlpb8iMAKzy8WrW44dMic3hxz+RlvALRQg0AlBF7VM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mn2AQ7hrRmCn7nJFPbg16NLfbPUHylbEGpzQzUKKGcYV2MrcoM4aPkfRxukxKD/IPM6TZ4HvFKrlZkLkPJh01XKKWcwIlkV5POJ/uwtv2PCRk+1VEaQNDms3C46v/ihE88jDqBzBCGS6Z4XXhKCNthRmUQxH5mzkQyY+1yj7/Gs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=iI13i0R7; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="iI13i0R7" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C3316C433A6; Wed, 13 Mar 2024 16:48:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348482; bh=eOlpb8iMAKzy8WrW44dMic3hxz+RlvALRQg0AlBF7VM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=iI13i0R7kaWO87r9hJl9sPmDWE4lVlCMZkvTKf+ycQwvR9XguvaHQw8PLX56qh0Em gdVhawxK4BtHhCcEGVyHm23KD1libMCc/Yo2ut3c094iMgBI7z6rfZtnsjhvi4ESd0 +r94YIhFn/QZ2ABtieBXh7BuaYmC8dwVXxsaj5iWVrG/nhCu2r1VoplwItjD2cGxLP WeD6j2kB9QF8SDlp5nNJhj661a8/MLDA7V5jr4SQu4gmR7CImF8Z9iLPs2P/xotyxp 1kb5DXjo2SKy4sDPTmMXqcPi+2ctMWV5UEIgbgCxgiWkObMI71vSSaaR6KH98Bpk7P bn5+O9zaBuZoQ== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Cosmin Tanislav , Andy Shevchenko , Greg Kroah-Hartman , Sasha Levin Subject: [PATCH 5.10 71/73] serial: max310x: implement I2C support Date: Wed, 13 Mar 2024 12:46:38 -0400 Message-ID: <20240313164640.616049-72-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Cosmin Tanislav [ Upstream commit 2e1f2d9a9bdbe12ee475c82a45ac46a278e8049a ] I2C implementation on this chip has a few key differences compared to SPI, as described in previous patches. * extended register space access needs no extra logic * slave address is used to select which UART to communicate with To accommodate these differences, add an I2C interface config, set the RevID register address and implement an empty method for setting the GlobalCommand register, since no special handling is needed for the extended register space. To handle the port-specific slave address, create an I2C dummy device for each port, except the base one (UART0), which is expected to be the one specified in firmware, and create a regmap for each I2C device. Add minimum and maximum slave addresses to each devtype for sanity checking. Also, use a separate regmap config with no write_flag_mask, since I2C has a R/W bit in its slave address, and set the max register to the address of the RevID register, since the extended register space needs no extra logic. Finally, add the I2C driver. Reviewed-by: Andy Shevchenko Signed-off-by: Cosmin Tanislav Link: https://lore.kernel.org/r/20220605144659.4169853-5-demonsingur@gmail.= com Signed-off-by: Greg Kroah-Hartman Stable-dep-of: 3f42b142ea11 ("serial: max310x: fix IO data corruption in ba= tched operations") Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- drivers/tty/serial/Kconfig | 1 + drivers/tty/serial/max310x.c | 135 ++++++++++++++++++++++++++++++++++- 2 files changed, 135 insertions(+), 1 deletion(-) diff --git a/drivers/tty/serial/Kconfig b/drivers/tty/serial/Kconfig index 28f22e58639c6..bd30ae9751bf5 100644 --- a/drivers/tty/serial/Kconfig +++ b/drivers/tty/serial/Kconfig @@ -343,6 +343,7 @@ config SERIAL_MAX310X depends on SPI_MASTER select SERIAL_CORE select REGMAP_SPI if SPI_MASTER + select REGMAP_I2C if I2C help This selects support for an advanced UART from Maxim (Dallas). Supported ICs are MAX3107, MAX3108, MAX3109, MAX14830. diff --git a/drivers/tty/serial/max310x.c b/drivers/tty/serial/max310x.c index b90281ac54c85..ed1aaa19854fd 100644 --- a/drivers/tty/serial/max310x.c +++ b/drivers/tty/serial/max310x.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -73,6 +74,7 @@ =20 /* Extended registers */ #define MAX310X_SPI_REVID_EXTREG MAX310X_REG_05 /* Revision ID */ +#define MAX310X_I2C_REVID_EXTREG (0x25) /* Revision ID */ =20 /* IRQ register bits */ #define MAX310X_IRQ_LSR_BIT (1 << 0) /* LSR interrupt */ @@ -260,6 +262,10 @@ struct max310x_if_cfg { }; =20 struct max310x_devtype { + struct { + unsigned short min; + unsigned short max; + } slave_addr; char name[9]; int nr; u8 mode1; @@ -431,6 +437,10 @@ static const struct max310x_devtype max3107_devtype = =3D { .mode1 =3D MAX310X_MODE1_AUTOSLEEP_BIT | MAX310X_MODE1_IRQSEL_BIT, .detect =3D max3107_detect, .power =3D max310x_power, + .slave_addr =3D { + .min =3D 0x2c, + .max =3D 0x2f, + }, }; =20 static const struct max310x_devtype max3108_devtype =3D { @@ -439,6 +449,10 @@ static const struct max310x_devtype max3108_devtype = =3D { .mode1 =3D MAX310X_MODE1_AUTOSLEEP_BIT, .detect =3D max3108_detect, .power =3D max310x_power, + .slave_addr =3D { + .min =3D 0x60, + .max =3D 0x6f, + }, }; =20 static const struct max310x_devtype max3109_devtype =3D { @@ -447,6 +461,10 @@ static const struct max310x_devtype max3109_devtype = =3D { .mode1 =3D MAX310X_MODE1_AUTOSLEEP_BIT, .detect =3D max3109_detect, .power =3D max310x_power, + .slave_addr =3D { + .min =3D 0x60, + .max =3D 0x6f, + }, }; =20 static const struct max310x_devtype max14830_devtype =3D { @@ -455,6 +473,10 @@ static const struct max310x_devtype max14830_devtype = =3D { .mode1 =3D MAX310X_MODE1_IRQSEL_BIT, .detect =3D max14830_detect, .power =3D max14830_power, + .slave_addr =3D { + .min =3D 0x60, + .max =3D 0x6f, + }, }; =20 static bool max310x_reg_writeable(struct device *dev, unsigned int reg) @@ -1557,6 +1579,97 @@ static struct spi_driver max310x_spi_driver =3D { }; #endif =20 +#ifdef CONFIG_I2C +static int max310x_i2c_extended_reg_enable(struct device *dev, bool enable) +{ + return 0; +} + +static struct regmap_config regcfg_i2c =3D { + .reg_bits =3D 8, + .val_bits =3D 8, + .cache_type =3D REGCACHE_RBTREE, + .writeable_reg =3D max310x_reg_writeable, + .volatile_reg =3D max310x_reg_volatile, + .precious_reg =3D max310x_reg_precious, + .max_register =3D MAX310X_I2C_REVID_EXTREG, +}; + +static const struct max310x_if_cfg max310x_i2c_if_cfg =3D { + .extended_reg_enable =3D max310x_i2c_extended_reg_enable, + .rev_id_reg =3D MAX310X_I2C_REVID_EXTREG, +}; + +static unsigned short max310x_i2c_slave_addr(unsigned short addr, + unsigned int nr) +{ + /* + * For MAX14830 and MAX3109, the slave address depends on what the + * A0 and A1 pins are tied to. + * See Table I2C Address Map of the datasheet. + * Based on that table, the following formulas were determined. + * UART1 - UART0 =3D 0x10 + * UART2 - UART1 =3D 0x20 + 0x10 + * UART3 - UART2 =3D 0x10 + */ + + addr -=3D nr * 0x10; + + if (nr >=3D 2) + addr -=3D 0x20; + + return addr; +} + +static int max310x_i2c_probe(struct i2c_client *client) +{ + const struct max310x_devtype *devtype =3D + device_get_match_data(&client->dev); + struct i2c_client *port_client; + struct regmap *regmaps[4]; + unsigned int i; + u8 port_addr; + + if (client->addr < devtype->slave_addr.min || + client->addr > devtype->slave_addr.max) + return dev_err_probe(&client->dev, -EINVAL, + "Slave addr 0x%x outside of range [0x%x, 0x%x]\n", + client->addr, devtype->slave_addr.min, + devtype->slave_addr.max); + + regmaps[0] =3D devm_regmap_init_i2c(client, ®cfg_i2c); + + for (i =3D 1; i < devtype->nr; i++) { + port_addr =3D max310x_i2c_slave_addr(client->addr, i); + port_client =3D devm_i2c_new_dummy_device(&client->dev, + client->adapter, + port_addr); + + regmaps[i] =3D devm_regmap_init_i2c(port_client, ®cfg_i2c); + } + + return max310x_probe(&client->dev, devtype, &max310x_i2c_if_cfg, + regmaps, client->irq); +} + +static int max310x_i2c_remove(struct i2c_client *client) +{ + max310x_remove(&client->dev); + + return 0; +} + +static struct i2c_driver max310x_i2c_driver =3D { + .driver =3D { + .name =3D MAX310X_NAME, + .of_match_table =3D max310x_dt_ids, + .pm =3D &max310x_pm_ops, + }, + .probe_new =3D max310x_i2c_probe, + .remove =3D max310x_i2c_remove, +}; +#endif + static int __init max310x_uart_init(void) { int ret; @@ -1570,15 +1683,35 @@ static int __init max310x_uart_init(void) #ifdef CONFIG_SPI_MASTER ret =3D spi_register_driver(&max310x_spi_driver); if (ret) - uart_unregister_driver(&max310x_uart); + goto err_spi_register; +#endif + +#ifdef CONFIG_I2C + ret =3D i2c_add_driver(&max310x_i2c_driver); + if (ret) + goto err_i2c_register; #endif =20 + return 0; + +#ifdef CONFIG_I2C +err_i2c_register: + spi_unregister_driver(&max310x_spi_driver); +#endif + +err_spi_register: + uart_unregister_driver(&max310x_uart); + return ret; } module_init(max310x_uart_init); =20 static void __exit max310x_uart_exit(void) { +#ifdef CONFIG_I2C + i2c_del_driver(&max310x_i2c_driver); +#endif + #ifdef CONFIG_SPI_MASTER spi_unregister_driver(&max310x_spi_driver); #endif --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3607D18E74E; Wed, 13 Mar 2024 16:48:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348484; cv=none; b=EPPqrUXg+XCpUFQIkeXz2snUAaaHHgSn1Xyp6a9ZBIi1+vLrStfAJ08uS2JaRAKCUotpMGlcG5H+dOCMVNKKyOVshM5mUXuOFgE/OzWYUB8O04CAae+RWjaJVwUXQrQnGhV8HSIk318KoIBU6wLZDRfWAVQgwKzVPxOOIbL2x28= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348484; c=relaxed/simple; bh=bN6FyHWve+cJ69LrHSPDI7ih6sH5X6u68hczeQ7NoUs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=FaO29euk0dDugUDLH9mS6n8a03wyZyGycSuOr0EO89yzqS086Esmew6/YZ3H+VWYVLuMRnQFLkg/n8XpA4+K8u4yZ/dCHXXLeVn5MDgr7zXEMIBFoSf69Uye2I4qE4IrIOOGWIGyyyXKpWVSK2JCo7MlWBPhll8fmsr7mVBrMpo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Dlnh8GXf; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Dlnh8GXf" Received: by smtp.kernel.org (Postfix) with ESMTPSA id DDB12C433C7; Wed, 13 Mar 2024 16:48:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348483; bh=bN6FyHWve+cJ69LrHSPDI7ih6sH5X6u68hczeQ7NoUs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Dlnh8GXfKm3qMIorABkpoGP/gpEYSTIzUMNJm7HcnxQGSgUnxIm1T+Nzve5e8uoVD Zny+2tCeKq0xgZsBDqOZd5c0OADfNUCo+4elmZXO7t2iEKuAKa39Z7kAb2BG376yUj KbsUTFarJHDlVJqiuIlWjaF5XsQwWPHV6ZecB7IKn9teIDsTse8OSHqxxsR68qhlas hkh+E6jHbTPPfWT9J2j8g0oW+WYlI0ciqWx83lyiiwB0XoIUgyqXNPJH4TCV48srSM cdmZEfJzX/oUQA0qvU1MtnW1DzTqxTW0Kz7nrfEhfB7/7wHtdZn2pGLOQCTY29w2KD q3HAv+dh2surg== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: =?UTF-8?q?Jan=20Kundr=C3=A1t?= , Andy Shevchenko , Greg Kroah-Hartman , Sasha Levin Subject: [PATCH 5.10 72/73] serial: max310x: fix IO data corruption in batched operations Date: Wed, 13 Mar 2024 12:46:39 -0400 Message-ID: <20240313164640.616049-73-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable From: Jan Kundr=C3=A1t [ Upstream commit 3f42b142ea1171967e40e10e4b0241c0d6d28d41 ] After upgrading from 5.16 to 6.1, our board with a MAX14830 started producing lots of garbage data over UART. Bisection pointed out commit 285e76fc049c as the culprit. That patch tried to replace hand-written code which I added in 2b4bac48c1084 ("serial: max310x: Use batched reads when reasonably safe") with the generic regmap infrastructure for batched operations. Unfortunately, the `regmap_raw_read` and `regmap_raw_write` which were used are actually functions which perform IO over *multiple* registers. That's not what is needed for accessing these Tx/Rx FIFOs; the appropriate functions are the `_noinc_` versions, not the `_raw_` ones. Fix this regression by using `regmap_noinc_read()` and `regmap_noinc_write()` along with the necessary `regmap_config` setup; with this patch in place, our board communicates happily again. Since our board uses SPI for talking to this chip, the I2C part is completely untested. Fixes: 285e76fc049c ("serial: max310x: use regmap methods for SPI batch ope= rations") Cc: stable@vger.kernel.org Reviewed-by: Andy Shevchenko Signed-off-by: Jan Kundr=C3=A1t Link: https://lore.kernel.org/r/79db8e82aadb0e174bc82b9996423c3503c8fb37.16= 80732084.git.jan.kundrat@cesnet.cz Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- drivers/tty/serial/max310x.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/drivers/tty/serial/max310x.c b/drivers/tty/serial/max310x.c index ed1aaa19854fd..2f88eae8a55a1 100644 --- a/drivers/tty/serial/max310x.c +++ b/drivers/tty/serial/max310x.c @@ -533,6 +533,11 @@ static bool max310x_reg_precious(struct device *dev, u= nsigned int reg) return false; } =20 +static bool max310x_reg_noinc(struct device *dev, unsigned int reg) +{ + return reg =3D=3D MAX310X_RHR_REG; +} + static int max310x_set_baud(struct uart_port *port, int baud) { unsigned int mode =3D 0, div =3D 0, frac =3D 0, c =3D 0, F =3D 0; @@ -667,14 +672,14 @@ static void max310x_batch_write(struct uart_port *por= t, u8 *txbuf, unsigned int { struct max310x_one *one =3D to_max310x_port(port); =20 - regmap_raw_write(one->regmap, MAX310X_THR_REG, txbuf, len); + regmap_noinc_write(one->regmap, MAX310X_THR_REG, txbuf, len); } =20 static void max310x_batch_read(struct uart_port *port, u8 *rxbuf, unsigned= int len) { struct max310x_one *one =3D to_max310x_port(port); =20 - regmap_raw_read(one->regmap, MAX310X_RHR_REG, rxbuf, len); + regmap_noinc_read(one->regmap, MAX310X_RHR_REG, rxbuf, len); } =20 static void max310x_handle_rx(struct uart_port *port, unsigned int rxlen) @@ -1508,6 +1513,10 @@ static struct regmap_config regcfg =3D { .writeable_reg =3D max310x_reg_writeable, .volatile_reg =3D max310x_reg_volatile, .precious_reg =3D max310x_reg_precious, + .writeable_noinc_reg =3D max310x_reg_noinc, + .readable_noinc_reg =3D max310x_reg_noinc, + .max_raw_read =3D MAX310X_FIFO_SIZE, + .max_raw_write =3D MAX310X_FIFO_SIZE, }; =20 #ifdef CONFIG_SPI_MASTER @@ -1593,6 +1602,10 @@ static struct regmap_config regcfg_i2c =3D { .volatile_reg =3D max310x_reg_volatile, .precious_reg =3D max310x_reg_precious, .max_register =3D MAX310X_I2C_REVID_EXTREG, + .writeable_noinc_reg =3D max310x_reg_noinc, + .readable_noinc_reg =3D max310x_reg_noinc, + .max_raw_read =3D MAX310X_FIFO_SIZE, + .max_raw_write =3D MAX310X_FIFO_SIZE, }; =20 static const struct max310x_if_cfg max310x_i2c_if_cfg =3D { --=20 2.43.0 From nobody Fri Dec 19 20:12:00 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F1A0F18E765; Wed, 13 Mar 2024 16:48:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348485; cv=none; b=dfodiuRrqpdhAyigulPoanzk8PIefm+g7k/SEfnNhqPU7cb5fDUX9FykWIihX1zEv+RQTnl+A6aezpkls66XW8XqclvjS17Vw3FEhDpHlMKCzSY51G2SqEV6EyvJQaaTiwPADffoudGT/k46SmNws+nGlLS+8JA8RGttObSR69c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710348485; c=relaxed/simple; bh=W9xFk2aGKq23BRvIDavZFLWHtpgTel/LJN8fQNnslCI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=PFjCH9XXizB02rrcxU/3bMzsrrUpsp3VusA5QSRj1mgcpPa3LmGUEqwZ5Xn/6yOL51487SItnKrdImiEiiH+ZzeUKF9W5ddDtW2JEjAEYwHc5aMvir/m90AwOeWhBkczwckZ9jw3+2owZk6t0Bp7ZkGNDOWlRcnUARJbUm/98R0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=lL6qwwwl; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="lL6qwwwl" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 034FBC433B1; Wed, 13 Mar 2024 16:48:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710348484; bh=W9xFk2aGKq23BRvIDavZFLWHtpgTel/LJN8fQNnslCI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=lL6qwwwltJ5Dt+5NEv7q8FxsMM78YBd3dReQJAndX0kswXPzFJlbSN8NdiVLGK5oU 8KXDbK2yBsKkWJFsmOpgrGK5knCn4nlMsYQwfP4+OhclAUqigOoK3FcAcnJVjwSQ4X OTLzOCZA9Xd/WrkmU2Id6MzcBcnGo+8x3eaIQr9v5bHcr6w4lFd1gNv+3LaQlJO7Hq /yJu7GoqtZIq24zUZs+J8LLFPygnU1tt5BczIXkOcGC9vNtxL9tYKcpJNzH2o2KtQt XNgf7Ls8K+487JXBLZqTFUHOW9nxiIQpcZGM34zotcy/UvHskLK8YQpElCIEfs7BzM S47sY0K3hKW9w== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Sasha Levin Subject: [PATCH 5.10 73/73] Linux 5.10.213-rc1 Date: Wed, 13 Mar 2024 12:46:40 -0400 Message-ID: <20240313164640.616049-74-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240313164640.616049-1-sashal@kernel.org> References: <20240313164640.616049-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.213-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.213-rc1 X-KernelTest-Deadline: 2024-03-15T16:46+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Signed-off-by: Sasha Levin Reported-by: Linux Kernel Functional Testing Tested-by: Dominique Martinet Tested-by: Florian Fainelli Tested-by: Linux Kernel Functional Testing Tested-by: Pavel Machek (CIP) Tested-by: kernelci.org bot --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index d7ec0be4cd791..fe73c377e5e47 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,8 @@ # SPDX-License-Identifier: GPL-2.0 VERSION =3D 5 PATCHLEVEL =3D 10 -SUBLEVEL =3D 212 -EXTRAVERSION =3D +SUBLEVEL =3D 213 +EXTRAVERSION =3D -rc1 NAME =3D Dare mighty things =20 # *DOCUMENTATION* --=20 2.43.0