From nobody Tue Apr 7 07:09:04 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8831FECAAD5 for ; Tue, 30 Aug 2022 03:33:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229824AbiH3Dd4 (ORCPT ); Mon, 29 Aug 2022 23:33:56 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38124 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229659AbiH3Ddg (ORCPT ); Mon, 29 Aug 2022 23:33:36 -0400 Received: from m12-17.163.com (m12-17.163.com [220.181.12.17]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id C194F6AA13 for ; Mon, 29 Aug 2022 20:33:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=163.com; s=s110527; h=From:Subject:Date:Message-Id:MIME-Version; bh=QP8HW uzvK/XpdKlS+HMadL+ojObm+N5qHMzgCFkYqug=; b=fQyuKO2G6niXW3NBOsFUs 3HfQWjBSNhizPcMFPocsWBNRXKTZ04tJGUJEOaP3ozIURak+JuU47pPyHSm0BmK1 /bq8nVhWTpBbvunBpGkFupC3on60PNSywBiFJEUylWQnqQspPkPq/0x2S8ouvZ9u Gmb86V7wcsRu5XLCtFFlYg= Received: from DESKTOP-B1R4FVG.localdomain (unknown [218.201.129.20]) by smtp13 (Coremail) with SMTP id EcCowACHfpHqhA1jauj7YQ--.16609S2; Tue, 30 Aug 2022 11:33:01 +0800 (CST) From: qianfanguijin@163.com To: linux-kernel@vger.kernel.org, linux-sunxi@lists.linux.dev Cc: Maxime Ripard , Chen-Yu Tsai , Evgeny Boger , Andre Przywara , qianfan Zhao Subject: [PATCH] net: allwinner: emac: Fix double spinlock in emac_timeout Date: Tue, 30 Aug 2022 11:32:58 +0800 Message-Id: <20220830033258.8105-1-qianfanguijin@163.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: EcCowACHfpHqhA1jauj7YQ--.16609S2 X-Coremail-Antispam: 1Uf129KBjvJXoWxCw15tr4xAF48JryfXFW7XFb_yoWrAF43pr yjya4rCw4xX3Wqvw4xtrWvqFWjq3Z2y34xCrs7Aw4fuFn3G34rXFy8tFy2kFWYyrZrAay7 KF1qyrWSkF4kXaUanT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x0piU73kUUUUU= X-Originating-IP: [218.201.129.20] X-CM-SenderInfo: htld0w5dqj3xxmlqqiywtou0bp/xtbB2Alt7WBHLzAuEgAAsV Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: qianfan Zhao The system will dead due to double lock if sometings trigger emac_timeout, next is the kernel logs: WARNING: CPU: 2 PID: 0 at net/sched/sch_generic.c:478 dev_watchdog+0x2e4/0x2e8 NETDEV WATCHDOG: FE0 (sun4i-emac): transmit queue 0 timed out Modules linked in: CPU: 2 PID: 0 Comm: swapper/2 Tainted: G W 5.15.0-00047-g0848e4aeb313 Hardware name: Wisdom T3 based CCT Family [] (unwind_backtrace) from [] (show_stack+0x10/0x14) [] (show_stack) from [] (dump_stack_lvl+0x40/0x4c) [] (dump_stack_lvl) from [] (__warn+0x104/0x108) [] (__warn) from [] (warn_slowpath_fmt+0x78/0xbc) [] (warn_slowpath_fmt) from [] (dev_watchdog+0x2e4/0x2e8) [] (dev_watchdog) from [] (call_timer_fn+0x3c/0x178) [] (call_timer_fn) from [] (run_timer_softirq+0x540/0x624) [] (run_timer_softirq) from [] (__do_softirq+0x130/0x3bc) [] (__do_softirq) from [] (irq_exit+0xbc/0x100) [] (irq_exit) from [] (handle_domain_irq+0x60/0x78) [] (handle_domain_irq) from [] (gic_handle_irq+0x7c/0x90) [] (gic_handle_irq) from [] (__irq_svc+0x5c/0x78) Exception stack(0xc14f3f70 to 0xc14f3fb8) 3f60: 0003475c 00000000 00000001 c01188a0 3f80: c107b200 c0f06b4c c0f06b90 00000004 c1079ff8 c0c62774 00000000 00000000 3fa0: c10b2198 c14f3fc0 c0107fcc c0107fd0 60030013 ffffffff [] (__irq_svc) from [] (arch_cpu_idle+0x38/0x3c) [] (arch_cpu_idle) from [] (default_idle_call+0x3c/0xcc) [] (default_idle_call) from [] (do_idle+0xdc/0x13c) [] (do_idle) from [] (cpu_startup_entry+0x18/0x1c) [] (cpu_startup_entry) from [<401015d0>] (0x401015d0) ---[ end trace a70942a1265338f1 ]--- rcu: INFO: rcu_sched detected stalls on CPUs/tasks: rcu: \x092-...0: (1 GPs behind) idle=3D75d/0/0x1 softirq=3D8288/8289 fqs=3D= 931 \x09(detected by 0, t=3D2102 jiffies, g=3D13485, q=3D1635) Sending NMI from CPU 0 to CPUs 2: spi_master spi2: spi2.1: timeout transferring 4 bytes@100000Hz for 110(100)ms spidev spi2.1: SPI transfer failed: -110 Fix it. Signed-off-by: qianfan Zhao --- drivers/net/ethernet/allwinner/sun4i-emac.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/drivers/net/ethernet/allwinner/sun4i-emac.c b/drivers/net/ethe= rnet/allwinner/sun4i-emac.c index 49759deeed8e..d49c2c18f39d 100644 --- a/drivers/net/ethernet/allwinner/sun4i-emac.c +++ b/drivers/net/ethernet/allwinner/sun4i-emac.c @@ -378,14 +378,11 @@ static int emac_set_mac_address(struct net_device *de= v, void *p) } =20 /* Initialize emac board */ -static void emac_init_device(struct net_device *dev) +static void emac_init_device_without_lock(struct net_device *dev) { struct emac_board_info *db =3D netdev_priv(dev); - unsigned long flags; unsigned int reg_val; =20 - spin_lock_irqsave(&db->lock, flags); - emac_update_speed(dev); emac_update_duplex(dev); =20 @@ -398,7 +395,15 @@ static void emac_init_device(struct net_device *dev) reg_val =3D readl(db->membase + EMAC_INT_CTL_REG); reg_val |=3D (0xf << 0) | (0x01 << 8); writel(reg_val, db->membase + EMAC_INT_CTL_REG); +} + +static void emac_init_device(struct net_device *dev) +{ + struct emac_board_info *db =3D netdev_priv(dev); + unsigned long flags; =20 + spin_lock_irqsave(&db->lock, flags); + emac_init_device_without_lock(dev); spin_unlock_irqrestore(&db->lock, flags); } =20 @@ -416,7 +421,7 @@ static void emac_timeout(struct net_device *dev, unsign= ed int txqueue) =20 netif_stop_queue(dev); emac_reset(db); - emac_init_device(dev); + emac_init_device_without_lock(dev); /* We can accept TX packets again */ netif_trans_update(dev); netif_wake_queue(dev); --=20 2.25.1