From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2F62060A260F for ; Sat, 7 Nov 2026 10:17:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20210309 header.b=SR12SQh0; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20260707 header.b=ix5i5jfs DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:Cc:To:In-Reply-To:References:Message-Id :MIME-Version:Subject:Date:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Unsubscribe-Post:List-Owner; bh=J1JG92u9zdV0iBDym67xsgMZg4f2GRfLGc4Rudivg58=; b=SR12SQh0UEJxtFgmSe3mY6q29f 4+rL9ZKbJ/fOUQ7jpS1GRN0jDEzdmFW7baFWQXfQUlgRMaBWQURPlaPBFGqWyKP8DNa0gvwCTBWUQ exAX4ukK9ay/3OjrhROyiIx7/X+T9tyQlhOnD5pCGMq8eHJI+wSfAjlYb6MzQ6W8NpSotum9Pdg/W nEMEQ9RxB7VLRsT6wJ6voLKzTrGXHHOfwm89ryOzQBgcfvIbGE41JrOk9gjbXkcb5UvdMvR1cH8kC DjztTQlCTC+uASFCF+6mCf+Hta1JXcPDV+3djWP0MCaBFzTKBGaq7pyMFtRWcdPBC72dHg7wC+3O2 pFMm+41w==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.100.1 #2 (Red Hat Linux)) id 1xPdTn-0000000ETQw-2GJs; Sat, 07 Nov 2026 10:16:59 +0000 Received: from mail-ot1-x332.google.com ([2607:f8b0:4864:20::332]) by bombadil.infradead.org with esmtps (Exim 4.100.1 #2 (Red Hat Linux)) id 1xPdTa-0000000ESwm-1bAb for linux-amlogic@lists.infradead.org; Sat, 07 Nov 2026 10:16:51 +0000 Received: by mail-ot1-x332.google.com with SMTP id 46e09a7af769-823b938464fso1112533a34.2 for ; Sat, 07 Nov 2026 02:16:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20260707; t=1794046605; x=1794651405; darn=lists.infradead.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=MlZnG/7Sna+U2qbkmqtYLFmIOLPlVRBG830dYMD5F3Y=; b=ix5i5jfsgFK4ousIeqxeXL5c9erjjepJ78EtGa/bhFaqM+2+25V1hegtueVoD1Q5mO wkSoiySdn4KsCPM2UoVB/fAdtO8vHd7j2FsR0LZ+9xK35IDZhOpWMJHgjx9L+MqHP7c/ XoOWOY0S1vgB3E5auFPGTek0yZBkJjS3SniVWJfZqww2d3nMQxpqZbOso8zW3vPGFD1S 6Dwy3f+6ZkBhlKicJwzyCVfpLF2/JWaIJH9x4dZuipAb8sUN/XXcMefqwW9szoo81AUk 5OqvvshnuAlsYlaKG01VO3ENtKwfkkiJnouNGmPcdAKx1yLtnWdcK3WgoOaEI17t1hb8 g2hw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1794046605; x=1794651405; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=MlZnG/7Sna+U2qbkmqtYLFmIOLPlVRBG830dYMD5F3Y=; b=aFXgm0TUGZJ523Ds/eU1e4Qheh+KSghDY1vjOUn/FMIdZZh8W9vkW4wq7JJlo1uRqN 5ulL7DXNJE9nUsBelAo6rs5V0ZQYlBW8jAxI+11NTm6Xnw9Fm0Bbj9y6/hZ6f+i1ItO1 oilFBhIH8tX+pXE+xfUZt4HZDzUHgWNVt2Xa15du64ZMj7GndhvN+dpDCZ1iLLN+Z5t6 J5uCHnVAMLHqyy+HDD+5RfXBdsVFKgn456D7laA1eYy9WxjR9iABBrb8oahLlxyB03vN kIjT7lnMbX+GYBFO/S1LR5H8UgMynVVXD18g0qOUr6760CnghvAYPh0t2mXzh41H1GJN DoAA== X-Forwarded-Encrypted: i=1; AKwUvByLULu6s/1hqLIDzj+37cviJ8FLfo11s3TtufCBO6Sj8dO8rE4GrrlplQzaVjaup60zFgYE9zq7MWBfOqaI@lists.infradead.org X-Gm-Message-State: APuU4Z8LApqRIK0Ceq57SPixME8kraASDPRNEJhaVrYau41CYjnS1NG3 GKnibdC8DXBqlPq3uxA8I3WiZPW4LaIi3apmNeGHWj7lxf4ZLh0WoA/b X-Gm-Gg: AYBFou0nR5lVksBcUP112bQpYunL7Zwq2DPZBks7rzy/qA5viyyiQumrHEoZjRt7QF1 iX9bvZ1hIy150iAs3e4gdy8C8VpL+hw3r20j9u2NO68dpJA/FQVuryhEqTqJs+vtQoPITG/+c2u 3r9doQ73a1R2Rg/OOECGhJ8htbqnymLL/GzKGsekOhm1kiQTIf7YNCI7qYH1RxMWIo+qFsd7x7L EHpUNoNoN6QXgeYBEiIbgLx4ACI1sn+USUpoupc+Pji2suI3tEbhhSBxCWul3t4OBNm3Cbv1p5u se40J//4PpiNpcPEaIYL+rvCdg2MRRpv2Pbxz4TkILs2IR2H0SiNtmzRMtepdZafADHcKzRQnXh 4uoAtnaop/VpsRmKXWUGAkitvgRl45VfLDF+7ULQzfSQV+dffNzRdl+NSkc0BUcrmW5MMpbN4yC BJ9hG+1j3sGGou9R9YECDEHlsjx1F0s8gm/tKGUU8AkcCWCRZbHk+zJvNSxXqP/6OdnYxyxAWwL FlWUREa26e16MZFhJOTX9OFNAtjpwFnXS3Dgr++XGspdxkXtn/vaAv/FkYuXASxFXD4tWunM1SD 39rPBOOOIu76EkGCmmsO9SQbHy6XVTrUu12mSGcygFsyXYu4VHMXjSvzWv8hftA7/n5xeE4Lk+K ZwvUkzOaaaj548CMFaegcY8Roe/tu0kHnoJUWOHtGN6fagyhNLkANWvm3q1CfSyOCaL9ZtO+9Q/ 1x+b9crcOGGJIvfMskBWdq8O7C8ft9ha/rLuWsn6LW3ZN+UoXnOdBD X-Received: by 2002:a05:6830:310b:b0:85f:31f:7643 with SMTP id 46e09a7af769-85f1cf3e2c4mr5316383a34.7.1794046605233; Sat, 07 Nov 2026 02:16:45 -0800 (PST) Received: from [127.0.1.1] (174-29-1-49.hlrn.qwest.net. [174.29.1.49]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-85f1dbef224sm3990269a34.12.2026.11.07.02.16.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 07 Nov 2026 02:16:44 -0800 (PST) From: James Hilliard Date: Sat, 07 Nov 2026 03:16:04 -0700 Subject: [PATCH 07/58] mtd: rawnand: sunxi: retain chip state until the final MTD put X-Archived-By: MIME-Version: 1.0 Message-Id: <20261107-submit-rawnand-retained-handle-lifetime-v1-v1-7-0181ef0cc4c8@gmail.com> References: <20261107-submit-rawnand-retained-handle-lifetime-v1-v1-0-0181ef0cc4c8@gmail.com> In-Reply-To: <20261107-submit-rawnand-retained-handle-lifetime-v1-v1-0-0181ef0cc4c8@gmail.com> To: Miquel Raynal , Richard Weinberger , Vignesh Raghavendra , Brian Norris , Boris Brezillon , Arseniy Krasnov , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Thomas Gleixner , Vitaly Wool , David Woodhouse , Russell King , David Woodhouse , Mike Rapoport , Maxime Coquelin , Alexandre Torgue , Christophe Kerello , Jason Roberts , Michal Simek , Boris Brezillon , Mason Yang , Ramuthevar Vadivel Murugan , Stefan Agner , Lucas Stach , Thierry Reding , Jonathan Hunter , Dmitry Osipenko , Matthias Brugger , AngeloGioacchino Del Regno , Jorge Ramirez-Ortiz , Heiko Stuebner , Yifeng Zhao , Nicolas Ferre , Alexandre Belloni , Claudiu Beznea , Keguang Zhang , Jacky Huang , Shan-Chun Hung , Frank Li , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , Han Xu , Liang Yang , Neil Armstrong , Kevin Hilman , Jerome Brunet , Martin Blumenstingl , Manivannan Sadhasivam , Kamal Dasu , Broadcom internal kernel review list , Vladimir Zapolskiy , Piotr Wojtaszczyk , Paul Cercueil , Harvey Hunt , Maxim Levitsky , Michael Walle , Srinivas Kandagatla Cc: Tze Yee Ng , linux-mtd@lists.infradead.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-tegra@vger.kernel.org, linux-mediatek@lists.infradead.org, linux-rockchip@lists.infradead.org, linux-mips@vger.kernel.org, imx@lists.linux.dev, linux-renesas-soc@vger.kernel.org, linux-amlogic@lists.infradead.org, linux-arm-msm@vger.kernel.org, James Hilliard X-Mailer: b4 0.15.2 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.9.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20261107_021646_534507_73AFEA5A X-CRM114-Status: GOOD ( 20.04 ) X-Spam-Score: -1.9 (-) X-BeenThere: linux-amlogic@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-amlogic" X-Spam-Status: No, score=-13.8 required=3.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_EF, FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=4.0.1 X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on aws-us-west-2-korg-listserv-alma10-1 sunxi_nand_chips_cleanup() unregisters each MTD device and immediately calls nand_cleanup(). Devres subsequently frees the chip and controller. An open MTD handle can outlive this sequence: another operation or even closing a writable handle reaches freed metadata and lock storage. Unregister each MTD device while removal notifiers can still finish I/O, then disconnect the chip and release the driver's initial MTD lifetime reference. Defer nand_cleanup() and chip destruction until the final MTD or device reference is released. Retain the chip name, flash node and per-sector user-data lengths along with the NAND metadata. Give the controller a reference for each retained chip and one owned by devres. Register that devres action first so the IRQ and hardware resources are released before the initial controller reference. The shared lock and parent device remain valid until the last chip is destroyed, while the disconnect gate prevents access to released hardware resources. Unwind heap allocations on probe failures, including attach failures for which nand_scan() does not invoke the detach callback. Fixes: 1fef62c1423b ("mtd: nand: add sunxi NAND flash controller support") Signed-off-by: James Hilliard --- drivers/mtd/nand/raw/sunxi_nand.c | 59 +++++++++++++++++++++++++++++---------- 1 file changed, 45 insertions(+), 14 deletions(-) diff --git a/drivers/mtd/nand/raw/sunxi_nand.c b/drivers/mtd/nand/raw/sunxi_nand.c index f41feebe4257..57894ce45065 100644 --- a/drivers/mtd/nand/raw/sunxi_nand.c +++ b/drivers/mtd/nand/raw/sunxi_nand.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #define NFC_REG_CTL 0x0000 @@ -405,6 +406,13 @@ static inline struct sunxi_nfc *to_sunxi_nfc(struct nand_controller *ctrl) return container_of(ctrl, struct sunxi_nfc, controller); } +static void sunxi_nfc_release(struct nand_controller *controller) +{ + struct sunxi_nfc *nfc = to_sunxi_nfc(controller); + + kfree(nfc); +} + static irqreturn_t sunxi_nfc_interrupt(int irq, void *dev_id) { struct sunxi_nfc *nfc = dev_id; @@ -2027,9 +2035,8 @@ static const struct mtd_ooblayout_ops sunxi_nand_ooblayout_ops = { static void sunxi_nand_detach_chip(struct nand_chip *nand) { struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand); - struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller); - devm_kfree(nfc->dev, sunxi_nand->user_data_bytes); + kfree(sunxi_nand->user_data_bytes); sunxi_nand->user_data_bytes = NULL; } @@ -2045,8 +2052,7 @@ static int sunxi_nfc_maximize_user_data(struct nand_chip *nand, uint32_t oobsize if (nsectors <= 0) return -EINVAL; - sunxi_nand->user_data_bytes = devm_kzalloc(nfc->dev, nsectors, - GFP_KERNEL); + sunxi_nand->user_data_bytes = kzalloc(nsectors, GFP_KERNEL); if (!sunxi_nand->user_data_bytes) return -ENOMEM; @@ -2427,6 +2433,13 @@ static const struct nand_controller_ops sunxi_nand_controller_ops = { .exec_op = sunxi_nfc_exec_op, }; +static void sunxi_nand_release(struct nand_chip *chip) +{ + struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(chip); + + kfree(sunxi_nand); +} + static void sunxi_nand_chips_cleanup(struct sunxi_nfc *nfc) { struct sunxi_nand_chip *sunxi_nand; @@ -2440,8 +2453,9 @@ static void sunxi_nand_chips_cleanup(struct sunxi_nfc *nfc) chip = &sunxi_nand->nand; ret = mtd_device_unregister(nand_to_mtd(chip)); WARN_ON(ret); - nand_cleanup(chip); + nand_disconnect(chip); list_del(&sunxi_nand->node); + mtd_put_master(nand_to_mtd(chip)); } } @@ -2465,8 +2479,7 @@ static int sunxi_nand_chip_init(struct device *dev, struct sunxi_nfc *nfc, return -EINVAL; } - sunxi_nand = devm_kzalloc(dev, struct_size(sunxi_nand, sels, nsels), - GFP_KERNEL); + sunxi_nand = kzalloc(struct_size(sunxi_nand, sels, nsels), GFP_KERNEL); if (!sunxi_nand) return -ENOMEM; @@ -2477,19 +2490,21 @@ static int sunxi_nand_chip_init(struct device *dev, struct sunxi_nfc *nfc, if (ret) { dev_err(dev, "could not retrieve reg property: %d\n", ret); - return ret; + goto err_free_chip; } if (tmp > NFC_MAX_CS) { dev_err(dev, "invalid reg value: %u (max CS = 7)\n", tmp); - return -EINVAL; + ret = -EINVAL; + goto err_free_chip; } if (test_and_set_bit(tmp, &nfc->assigned_cs)) { dev_err(dev, "CS %d already assigned\n", tmp); - return -EINVAL; + ret = -EINVAL; + goto err_free_chip; } sunxi_nand->sels[i].cs = tmp; @@ -2518,18 +2533,32 @@ static int sunxi_nand_chip_init(struct device *dev, struct sunxi_nfc *nfc, ret = nand_scan(nand, nsels); if (ret) - return ret; + goto err_free_chip; + + ret = nand_set_release(nand, sunxi_nand_release); + if (ret) + goto err_cleanup_nand; + mtd->owner = THIS_MODULE; ret = mtd_device_register(mtd, NULL, 0); if (ret) { dev_err(dev, "failed to register mtd device: %d\n", ret); - nand_cleanup(nand); + nand_disconnect(nand); + mtd_put_master(mtd); return ret; } list_add_tail(&sunxi_nand->node, &nfc->chips); return 0; + +err_cleanup_nand: + nand_cleanup(nand); +err_free_chip: + /* nand_scan() does not detach a chip whose attach callback failed. */ + kfree(sunxi_nand->user_data_bytes); + kfree(sunxi_nand); + return ret; } static int sunxi_nand_chips_init(struct device *dev, struct sunxi_nfc *nfc) @@ -2610,12 +2639,14 @@ static int sunxi_nfc_probe(struct platform_device *pdev) int irq; int ret; - nfc = devm_kzalloc(dev, sizeof(*nfc), GFP_KERNEL); + nfc = kzalloc_obj(*nfc); if (!nfc) return -ENOMEM; nfc->dev = dev; - nand_controller_init(&nfc->controller); + ret = devm_nand_controller_init(dev, &nfc->controller, sunxi_nfc_release); + if (ret) + return ret; INIT_LIST_HEAD(&nfc->chips); nfc->regs = devm_platform_get_and_ioremap_resource(pdev, 0, &r); -- 2.53.0 _______________________________________________ linux-amlogic mailing list linux-amlogic@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-amlogic