Received: by 2002:a05:6a10:16a7:0:0:0:0 with SMTP id gp39csp587284pxb; Thu, 12 Nov 2020 11:01:54 -0800 (PST) X-Google-Smtp-Source: ABdhPJxACBWrEN69y6H9u2yY70QoMGk/wXfbvyq27Ia0XeP+1AL6hAYtPxajcAqqzNNM8t9gipk/ X-Received: by 2002:a19:5e4b:: with SMTP id z11mr317669lfi.305.1605207714211; Thu, 12 Nov 2020 11:01:54 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1605207714; cv=none; d=google.com; s=arc-20160816; b=T7p8RjDxXgqCQM5Mp+wmgIdqGSWI16IW7g67re2sk5PvZcOTUqz//z4ervEWmf0lcH z+SWpgiZuN7S2fYyCkJRJWxxIOcbnBNcrBhlNmlkJjgHJ5M5mYNMTMjEP5W93TePhmLu 6g09YtcDkw3n5S93694h0SBC/YPnQRug28tJg45NVyBbacT0BDmDry7WUWddLkCO/oC6 7KhInvi+H0xXVGzrEgW3Df41EE7OdfJ2J8JRVUaCrkaesZKu+Q8MPAdvmX4/dnXa6YDX iJPlSSLiyw3D2nff3UMpw6UMNJNr9cLxwJk4uiz200R6+7WC0jdj9hCu22xdsuKa3STA EY2Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:message-id:date:subject:cc:to:from :dkim-signature; bh=IDS5Oufash5YwJYyq/CZbnqZxwavmq4JVvZ9D8fSXfI=; b=r1oy5M6x18iZxfx45ivZV7k+OpnL8uFIDdBOFM9IrT+mZAFsPcamqnpwes88M9Dyxe mIfLIGlxHIjU1bBncyuYETClZbvCgYn1YvWPVf2Nau++00ayCKage3W+CSoUJIl1YpT4 5Sme/y9q65IRlQzu2EEHb/h+ECEVKk9QGymuRHrW0WW5PIx15Bh9hKylpOgbElJhyu6O cN/1kfMwD1VjVm4AagAU4Xth2MLU9/c7fp1SK2bnYBiMF052Bvctsnre6lZd/aG9Dsuq 5hgfAul9Trpmr1eyEmT31QU/l06J8ymHJzm/V/qLU3PFbDEzleTYaMMdrHLbYT53tzDI JASQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=WqdwiYj7; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id lx2si4186037ejb.316.2020.11.12.11.01.28; Thu, 12 Nov 2020 11:01:54 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=WqdwiYj7; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726473AbgKLS74 (ORCPT + 99 others); Thu, 12 Nov 2020 13:59:56 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44674 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726310AbgKLS7z (ORCPT ); Thu, 12 Nov 2020 13:59:55 -0500 Received: from mail-qk1-x741.google.com (mail-qk1-x741.google.com [IPv6:2607:f8b0:4864:20::741]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3EB26C0613D1; Thu, 12 Nov 2020 10:59:54 -0800 (PST) Received: by mail-qk1-x741.google.com with SMTP id l2so6380250qkf.0; Thu, 12 Nov 2020 10:59:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=IDS5Oufash5YwJYyq/CZbnqZxwavmq4JVvZ9D8fSXfI=; b=WqdwiYj7UK0daVrfpTcgvYX1w3ciXnhHTmQPRf6rN9hmaSOGUbeqOi7g/ry7+ZYJoW 9uUms5XZkvXZrULPCVfii8vzqTqqXUXt0cCQUSQGstokUexSKpbIO2Ini1MYzdiIGsVF CeHsTETP2esEwXGDJONxGJUbsDOSkQb+5cxyiKZRdrDo7vuFwe+QimjHv3SqPMMaxw4Q nxqfldUPU+H2TtCJKcJnvlY92B3zu6n1U2HNAbsSvUL4kdAiYwUDI33PZimwfbRVnrpc MEY7oNYdlphYRYVBkY1M1KzNKVcGB0wuWYolSAdfhO09Cz2nEtQzY/42ebA8J/awhNwg lQEA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=IDS5Oufash5YwJYyq/CZbnqZxwavmq4JVvZ9D8fSXfI=; b=Kvq39EiHG05FYN08wIfMuairfhRAPvNv4l+fdrYp8pvRi+/ZAAbv23cfn5MF5S4Po/ M57l/HRgZcxGX1VsnVVRiPq7tXJ7u7nc0/RSj50iiSliqg7lTEirNtY3PcXDHFlQ7nZp 1HbIlTa3w+RJG1sXtUUNnYW6/C44J3DVvy8nST7rAhM2jODKi0rfQ9UBgCZuDUIYIpco tWz8hmDNGkeFZaDIcpWrV3c6B3XCo3tiF1ULP0kn/XCRqnEur0Wx9npbpuZaM+3Hyvg+ PbLEO+86HQuc/ROJNv0gcZLcu0pdT6kzi2a+pNPpgd7HV6V2g4xIW/qQsZiEp0llyTfy R4XA== X-Gm-Message-State: AOAM531VUMou6pYfPe1pI8hLcRazhHWvxThux/DahYHYbCKT+pPB9ovQ azr6MIll1X0qG0m717yHvyD3hWMaDx4= X-Received: by 2002:a37:d16:: with SMTP id 22mr1188669qkn.335.1605207593310; Thu, 12 Nov 2020 10:59:53 -0800 (PST) Received: from localhost.localdomain ([198.52.185.246]) by smtp.gmail.com with ESMTPSA id g70sm5055192qke.8.2020.11.12.10.59.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Nov 2020 10:59:52 -0800 (PST) From: Sven Van Asbroeck X-Google-Original-From: Sven Van Asbroeck To: Jakub Kicinski , Bryan Whitehead , David S Miller Cc: Sven Van Asbroeck , Microchip Linux Driver Support , Andrew Lunn , netdev@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH net v1] lan743x: fix issue causing intermittent kernel log warnings Date: Thu, 12 Nov 2020 13:59:49 -0500 Message-Id: <20201112185949.11315-1-TheSven73@gmail.com> X-Mailer: git-send-email 2.17.1 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Sven Van Asbroeck When running this chip on arm imx6, we intermittently observe the following kernel warning in the log, especially when the system is under high load: [ 50.119484] ------------[ cut here ]------------ [ 50.124377] WARNING: CPU: 0 PID: 303 at kernel/softirq.c:169 __local_bh_enable_ip+0x100/0x184 [ 50.132925] IRQs not enabled as expected [ 50.159250] CPU: 0 PID: 303 Comm: rngd Not tainted 5.7.8 #1 [ 50.164837] Hardware name: Freescale i.MX6 Quad/DualLite (Device Tree) [ 50.171395] [] (unwind_backtrace) from [] (show_stack+0x10/0x14) [ 50.179162] [] (show_stack) from [] (dump_stack+0xac/0xd8) [ 50.186408] [] (dump_stack) from [] (__warn+0xd0/0x10c) [ 50.193391] [] (__warn) from [] (warn_slowpath_fmt+0x98/0xc4) [ 50.200892] [] (warn_slowpath_fmt) from [] (__local_bh_enable_ip+0x100/0x184) [ 50.209860] [] (__local_bh_enable_ip) from [] (destroy_conntrack+0x48/0xd8 [nf_conntrack]) [ 50.220038] [] (destroy_conntrack [nf_conntrack]) from [] (nf_conntrack_destroy+0x94/0x168) [ 50.230160] [] (nf_conntrack_destroy) from [] (skb_release_head_state+0xa0/0xd0) [ 50.239314] [] (skb_release_head_state) from [] (skb_release_all+0xc/0x24) [ 50.247946] [] (skb_release_all) from [] (consume_skb+0x74/0x17c) [ 50.255796] [] (consume_skb) from [] (lan743x_tx_release_desc+0x120/0x124) [ 50.264428] [] (lan743x_tx_release_desc) from [] (lan743x_tx_napi_poll+0x5c/0x18c) [ 50.273755] [] (lan743x_tx_napi_poll) from [] (net_rx_action+0x118/0x4a4) [ 50.282306] [] (net_rx_action) from [] (__do_softirq+0x13c/0x53c) [ 50.290157] [] (__do_softirq) from [] (irq_exit+0x150/0x17c) [ 50.297575] [] (irq_exit) from [] (__handle_domain_irq+0x60/0xb0) [ 50.305423] [] (__handle_domain_irq) from [] (gic_handle_irq+0x4c/0x90) [ 50.313790] [] (gic_handle_irq) from [] (__irq_usr+0x54/0x80) [ 50.321287] Exception stack(0xecd99fb0 to 0xecd99ff8) [ 50.326355] 9fa0: 1cf1aa74 00000001 00000001 00000000 [ 50.334547] 9fc0: 00000001 00000000 00000000 00000000 00000000 00000000 00004097 b6d17d14 [ 50.342738] 9fe0: 00000001 b6d17c60 00000000 b6e71f94 800b0010 ffffffff [ 50.349364] irq event stamp: 2525027 [ 50.352955] hardirqs last enabled at (2525026): [] net_rx_action+0xb4/0x4a4 [ 50.360892] hardirqs last disabled at (2525027): [] _raw_spin_lock_irqsave+0x1c/0x50 [ 50.369517] softirqs last enabled at (2524660): [] __do_softirq+0x38c/0x53c [ 50.377446] softirqs last disabled at (2524693): [] irq_exit+0x150/0x17c [ 50.385027] ---[ end trace c0b571db4bc8087d ]--- The driver is calling dev_kfree_skb() from code inside a spinlock, where h/w interrupts are disabled. This is forbidden, as documented in include/linux/netdevice.h. The correct function to use dev_kfree_skb_irq(), or dev_kfree_skb_any(). Fix by using the correct dev_kfree_skb_xxx() functions: in lan743x_tx_release_desc(): called by lan743x_tx_release_completed_descriptors() called by in lan743x_tx_napi_poll() which holds a spinlock called by lan743x_tx_release_all_descriptors() called by lan743x_tx_close() which can-sleep conclusion: use dev_kfree_skb_any() in lan743x_tx_xmit_frame(): which holds a spinlock conclusion: use dev_kfree_skb_irq() in lan743x_tx_close(): which can-sleep conclusion: use dev_kfree_skb() in lan743x_rx_release_ring_element(): called by lan743x_rx_close() which can-sleep called by lan743x_rx_open() which can-sleep conclusion: use dev_kfree_skb() Fixes: 23f0703c125b ("lan743x: Add main source files for new lan743x driver") Signed-off-by: Sven Van Asbroeck --- Tree: git://git.kernel.org/pub/scm/linux/kernel/git/davem/net.git # edbc21113bde To: Jakub Kicinski To: Bryan Whitehead To: "David S. Miller" Cc: Microchip Linux Driver Support Cc: Andrew Lunn Cc: netdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org drivers/net/ethernet/microchip/lan743x_main.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/ethernet/microchip/lan743x_main.c index 9de970ec2056..a9fda2e6e715 100644 --- a/drivers/net/ethernet/microchip/lan743x_main.c +++ b/drivers/net/ethernet/microchip/lan743x_main.c @@ -1291,13 +1291,13 @@ static void lan743x_tx_release_desc(struct lan743x_tx *tx, goto clear_active; if (!(buffer_info->flags & TX_BUFFER_INFO_FLAG_TIMESTAMP_REQUESTED)) { - dev_kfree_skb(buffer_info->skb); + dev_kfree_skb_any(buffer_info->skb); goto clear_skb; } if (cleanup) { lan743x_ptp_unrequest_tx_timestamp(tx->adapter); - dev_kfree_skb(buffer_info->skb); + dev_kfree_skb_any(buffer_info->skb); } else { ignore_sync = (buffer_info->flags & TX_BUFFER_INFO_FLAG_IGNORE_SYNC) != 0; @@ -1607,7 +1607,7 @@ static netdev_tx_t lan743x_tx_xmit_frame(struct lan743x_tx *tx, if (required_number_of_descriptors > lan743x_tx_get_avail_desc(tx)) { if (required_number_of_descriptors > (tx->ring_size - 1)) { - dev_kfree_skb(skb); + dev_kfree_skb_irq(skb); } else { /* save to overflow buffer */ tx->overflow_skb = skb; @@ -1640,7 +1640,7 @@ static netdev_tx_t lan743x_tx_xmit_frame(struct lan743x_tx *tx, start_frame_length, do_timestamp, skb->ip_summed == CHECKSUM_PARTIAL)) { - dev_kfree_skb(skb); + dev_kfree_skb_irq(skb); goto unlock; } @@ -1659,7 +1659,7 @@ static netdev_tx_t lan743x_tx_xmit_frame(struct lan743x_tx *tx, * frame assembler clean up was performed inside * lan743x_tx_frame_add_fragment */ - dev_kfree_skb(skb); + dev_kfree_skb_irq(skb); goto unlock; } } -- 2.17.1