From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
stable@vger.kernel.org,
Sergei Miroshnichenko <sergeimir@emcraft.com>,
Marc Kleine-Budde <mkl@pengutronix.de>
Subject: [PATCH 4.4 04/93] can: dev: fix deadlock reported after bus-off
Date: Thu, 6 Oct 2016 10:28:34 +0200 [thread overview]
Message-ID: <20161006074731.340481814@linuxfoundation.org> (raw)
In-Reply-To: <20161006074731.150212126@linuxfoundation.org>
4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sergei Miroshnichenko <sergeimir@emcraft.com>
commit 9abefcb1aaa58b9d5aa40a8bb12c87d02415e4c8 upstream.
A timer was used to restart after the bus-off state, leading to a
relatively large can_restart() executed in an interrupt context,
which in turn sets up pinctrl. When this happens during system boot,
there is a high probability of grabbing the pinctrl_list_mutex,
which is locked already by the probe() of other device, making the
kernel suspect a deadlock condition [1].
To resolve this issue, the restart_timer is replaced by a delayed
work.
[1] https://github.com/victronenergy/venus/issues/24
Signed-off-by: Sergei Miroshnichenko <sergeimir@emcraft.com>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
drivers/net/can/dev.c | 27 +++++++++++++++++----------
include/linux/can/dev.h | 3 ++-
2 files changed, 19 insertions(+), 11 deletions(-)
--- a/drivers/net/can/dev.c
+++ b/drivers/net/can/dev.c
@@ -21,6 +21,7 @@
#include <linux/slab.h>
#include <linux/netdevice.h>
#include <linux/if_arp.h>
+#include <linux/workqueue.h>
#include <linux/can.h>
#include <linux/can/dev.h>
#include <linux/can/skb.h>
@@ -471,9 +472,8 @@ EXPORT_SYMBOL_GPL(can_free_echo_skb);
/*
* CAN device restart for bus-off recovery
*/
-static void can_restart(unsigned long data)
+static void can_restart(struct net_device *dev)
{
- struct net_device *dev = (struct net_device *)data;
struct can_priv *priv = netdev_priv(dev);
struct net_device_stats *stats = &dev->stats;
struct sk_buff *skb;
@@ -513,6 +513,14 @@ restart:
netdev_err(dev, "Error %d during restart", err);
}
+static void can_restart_work(struct work_struct *work)
+{
+ struct delayed_work *dwork = to_delayed_work(work);
+ struct can_priv *priv = container_of(dwork, struct can_priv, restart_work);
+
+ can_restart(priv->dev);
+}
+
int can_restart_now(struct net_device *dev)
{
struct can_priv *priv = netdev_priv(dev);
@@ -526,8 +534,8 @@ int can_restart_now(struct net_device *d
if (priv->state != CAN_STATE_BUS_OFF)
return -EBUSY;
- /* Runs as soon as possible in the timer context */
- mod_timer(&priv->restart_timer, jiffies);
+ cancel_delayed_work_sync(&priv->restart_work);
+ can_restart(dev);
return 0;
}
@@ -548,8 +556,8 @@ void can_bus_off(struct net_device *dev)
netif_carrier_off(dev);
if (priv->restart_ms)
- mod_timer(&priv->restart_timer,
- jiffies + (priv->restart_ms * HZ) / 1000);
+ schedule_delayed_work(&priv->restart_work,
+ msecs_to_jiffies(priv->restart_ms));
}
EXPORT_SYMBOL_GPL(can_bus_off);
@@ -658,6 +666,7 @@ struct net_device *alloc_candev(int size
return NULL;
priv = netdev_priv(dev);
+ priv->dev = dev;
if (echo_skb_max) {
priv->echo_skb_max = echo_skb_max;
@@ -667,7 +676,7 @@ struct net_device *alloc_candev(int size
priv->state = CAN_STATE_STOPPED;
- init_timer(&priv->restart_timer);
+ INIT_DELAYED_WORK(&priv->restart_work, can_restart_work);
return dev;
}
@@ -748,8 +757,6 @@ int open_candev(struct net_device *dev)
if (!netif_carrier_ok(dev))
netif_carrier_on(dev);
- setup_timer(&priv->restart_timer, can_restart, (unsigned long)dev);
-
return 0;
}
EXPORT_SYMBOL_GPL(open_candev);
@@ -764,7 +771,7 @@ void close_candev(struct net_device *dev
{
struct can_priv *priv = netdev_priv(dev);
- del_timer_sync(&priv->restart_timer);
+ cancel_delayed_work_sync(&priv->restart_work);
can_flush_echo_skb(dev);
}
EXPORT_SYMBOL_GPL(close_candev);
--- a/include/linux/can/dev.h
+++ b/include/linux/can/dev.h
@@ -32,6 +32,7 @@ enum can_mode {
* CAN common private data
*/
struct can_priv {
+ struct net_device *dev;
struct can_device_stats can_stats;
struct can_bittiming bittiming, data_bittiming;
@@ -47,7 +48,7 @@ struct can_priv {
u32 ctrlmode_static; /* static enabled options for driver/hardware */
int restart_ms;
- struct timer_list restart_timer;
+ struct delayed_work restart_work;
int (*do_set_bittiming)(struct net_device *dev);
int (*do_set_data_bittiming)(struct net_device *dev);
next prev parent reply other threads:[~2016-10-06 8:54 UTC|newest]
Thread overview: 95+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <CGME20161006085617uscas1p138247ef1e0fc1f67a8925f522d0aed06@uscas1p1.samsung.com>
2016-10-06 8:28 ` [PATCH 4.4 00/93] 4.4.24-stable review Greg Kroah-Hartman
2016-10-06 8:28 ` [PATCH 4.4 01/93] cpuset: handle race between CPU hotplug and cpuset_hotplug_work Greg Kroah-Hartman
2016-10-06 8:28 ` [PATCH 4.4 02/93] mtd: nand: davinci: Reinitialize the HW ECC engine in 4bit hwctl Greg Kroah-Hartman
2016-10-06 8:28 ` [PATCH 4.4 03/93] mm,ksm: fix endless looping in allocating memory when ksm enable Greg Kroah-Hartman
2016-10-06 8:28 ` Greg Kroah-Hartman [this message]
2016-10-06 8:28 ` [PATCH 4.4 05/93] x86/init: Fix cr4_init_shadow() on CR4-less machines Greg Kroah-Hartman
2016-10-06 8:28 ` [PATCH 4.4 06/93] x86/boot: Initialize FPU and X86_FEATURE_ALWAYS even if we dont have CPUID Greg Kroah-Hartman
2016-10-06 8:28 ` [PATCH 4.4 07/93] drm/nouveau/fifo/nv04: avoid ramht race against cookie insertion Greg Kroah-Hartman
2016-10-06 8:28 ` [PATCH 4.4 08/93] drm/radeon/si/dpm: add workaround for for Jet parts Greg Kroah-Hartman
2016-10-06 8:28 ` [PATCH 4.4 09/93] ARM: 8616/1: dt: Respect property size when parsing CPUs Greg Kroah-Hartman
2016-10-06 8:28 ` [PATCH 4.4 10/93] ARM: 8617/1: dma: fix dma_max_pfn() Greg Kroah-Hartman
2016-10-06 8:28 ` [PATCH 4.4 11/93] usb: musb: Fix DMA desired mode for Mentor DMA engine Greg Kroah-Hartman
2016-10-06 8:28 ` [PATCH 4.4 12/93] usb: musb: fix DMA for host mode Greg Kroah-Hartman
2016-10-06 8:28 ` [PATCH 4.4 13/93] iwlwifi: mvm: fix a few firmware capability checks Greg Kroah-Hartman
2016-10-06 8:28 ` [PATCH 4.4 14/93] perf/core: Fix pmu::filter_match for SW-led groups Greg Kroah-Hartman
2016-10-06 8:28 ` [PATCH 4.4 15/93] i40e: avoid null pointer dereference Greg Kroah-Hartman
2016-10-06 8:28 ` [PATCH 4.4 16/93] pinctrl: uniphier: fix .pin_dbg_show() callback Greg Kroah-Hartman
2016-10-06 8:28 ` [PATCH 4.4 17/93] pinctrl: Flag strict is a field in struct pinmux_ops Greg Kroah-Hartman
2016-10-06 8:28 ` [PATCH 4.4 18/93] drivers/perf: arm_pmu: Fix leak in error path Greg Kroah-Hartman
2016-10-06 8:28 ` [PATCH 4.4 19/93] mmc: pxamci: fix potential oops Greg Kroah-Hartman
2016-10-06 8:28 ` [PATCH 4.4 20/93] tools/vm/slabinfo: fix an unintentional printf Greg Kroah-Hartman
2016-10-06 8:28 ` [PATCH 4.4 21/93] ipvs: fix bind to link-local mcast IPv6 address in backup Greg Kroah-Hartman
2016-10-06 8:28 ` [PATCH 4.4 22/93] nvmem: Declare nvmem_cell_read() consistently Greg Kroah-Hartman
2016-10-06 8:28 ` [PATCH 4.4 23/93] hwmon: (adt7411) set bit 3 in CFG1 register Greg Kroah-Hartman
2016-10-06 8:28 ` [PATCH 4.4 24/93] spi: sh-msiof: Avoid invalid clock generator parameters Greg Kroah-Hartman
2016-10-06 8:28 ` [PATCH 4.4 25/93] iwlwifi: pcie: fix access to scratch buffer Greg Kroah-Hartman
2016-10-06 8:28 ` [PATCH 4.4 26/93] iwlwifi: mvm: dont use ret when not initialised Greg Kroah-Hartman
2016-10-06 8:28 ` [PATCH 4.4 27/93] ceph: fix race during filling readdir cache Greg Kroah-Hartman
2016-10-06 8:28 ` [PATCH 4.4 28/93] usb: gadget: fsl_qe_udc: signedness bug in qe_get_frame() Greg Kroah-Hartman
2016-10-06 8:28 ` [PATCH 4.4 29/93] gpio: sa1100: fix irq probing for ucb1x00 Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 30/93] irqchip/gicv3: Silence noisy DEBUG_PER_CPU_MAPS warning Greg Kroah-Hartman
2016-10-06 8:29 ` Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 31/93] ARM: 8618/1: decompressor: reset ttbcr fields to use TTBR0 on ARMv7 Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 32/93] arm64: debug: avoid resetting stepping state machine when TIF_SINGLESTEP Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 33/93] MIPS: uprobes: remove incorrect set_orig_insn Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 34/93] MIPS: fix uretprobe implementation Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 35/93] MIPS: Malta: Fix IOCU disable switch read for MIPS64 Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 36/93] MIPS: uprobes: fix use of uninitialised variable Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 37/93] printk: fix parsing of "brl=" option Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 38/93] tpm: fix byte-order for the value read by tpm2_get_tpm_pt Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 39/93] regulator: qcom_spmi: Add support for S4 supply on pm8941 Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 40/93] regulator: qcom_spmi: Add support for get_mode/set_mode on switches Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 41/93] regulator: qcom_spmi: Update mvs1/mvs2 switches on pm8941 Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 42/93] regulator: qcom_smd: Fix voltage ranges for pm8x41 Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 44/93] ARM: sa1100: register clocks early Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 45/93] ARM: sa1100: fix 3.6864MHz clock Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 46/93] ARM: sa1100: clear reset status prior to reboot Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 47/93] ARM: shmobile: fix regulator quirk for Gen2 Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 48/93] ARM: sa1111: fix pcmcia suspend/resume Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 49/93] hwrng: omap - Fix assumption that runtime_get_sync will always succeed Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 50/93] blk-mq: actually hook up defer list when running requests Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 51/93] pstore: drop file opened reference count Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 52/93] tile: Define AT_VECTOR_SIZE_ARCH for ARCH_DLINFO Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 53/93] iwlmvm: mvm: set correct state in smart-fifo configuration Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 55/93] [media] em28xx-i2c: rt_mutex_trylock() returns zero on failure Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 56/93] [media] gspca: avoid unused variable warnings Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 57/93] ath9k: Fix programming of minCCA power threshold Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 58/93] avr32: off by one in at32_init_pio() Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 59/93] fnic: pci_dma_mapping_error() doesnt return an error code Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 60/93] dmaengine: at_xdmac: fix debug string Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 61/93] svc: Avoid garbage replies when pc_func() returns rpc_drop_reply Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 62/93] NFS: Dont drop CB requests with invalid principals Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 63/93] pNFS/files: Fix layoutcommit after a commit to DS Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 64/93] pNFS/flexfiles: " Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 65/93] ASoC: Intel: Skylake: Fix error return code in skl_probe() Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 66/93] brcmfmac: Fix glob_skb leak in brcmf_sdiod_recv_chain Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 67/93] brcmsmac: Free packet if dma_mapping_error() fails in dma_rxfill Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 68/93] brcmsmac: Initialize power in brcms_c_stf_ss_algo_channel_get() Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 69/93] powerpc/prom: Fix sub-processor option passed to ibm, client-architecture-support Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 70/93] sysctl: handle error writing UINT_MAX to u32 fields Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 71/93] ASoC: omap-mcpdm: Fix irq resource handling Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 72/93] kernel/fork: fix CLONE_CHILD_CLEARTID regression in nscd Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 73/93] dmaengine: at_xdmac: fix to pass correct device identity to free_irq() Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 75/93] IB/ipoib: Fix memory corruption in ipoib cm mode connect flow Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 76/93] IB/core: Fix use after free in send_leave function Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 77/93] IB/ipoib: Dont allow MC joins during light MC flush Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 78/93] IB/mlx4: Fix incorrect MC join state bit-masking on SR-IOV Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 79/93] IB/mlx4: Fix code indentation in QP1 MAD flow Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 80/93] IB/mlx4: Use correct subnet-prefix in QP1 mads under SR-IOV Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 82/93] aio: mark AIO pseudo-fs noexec Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 83/93] clk: xgene: Add missing parenthesis when clearing divider value Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 84/93] dm log writes: fix bug with too large bios Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 85/93] USB: serial: cp210x: fix hardware flow-control disable Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 86/93] usb: misc: legousbtower: Fix NULL pointer deference Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 87/93] Staging: fbtft: Fix bug in fbtft-core Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 88/93] USB: serial: cp210x: Add ID for a Juniper console Greg Kroah-Hartman
2016-10-06 8:29 ` [PATCH 4.4 89/93] Revert "usbtmc: convert to devm_kzalloc" Greg Kroah-Hartman
2016-10-06 8:30 ` [PATCH 4.4 90/93] ALSA: hda - Adding one more ALC255 pin definition for headset problem Greg Kroah-Hartman
2016-10-06 8:30 ` [PATCH 4.4 91/93] ACPICA: acpi_get_sleep_type_data: Reduce warnings Greg Kroah-Hartman
2016-10-06 8:30 ` [PATCH 4.4 92/93] ALSA: hda - Fix headset mic detection problem for several Dell laptops Greg Kroah-Hartman
2016-10-06 8:30 ` [PATCH 4.4 93/93] ALSA: hda - Add the top speaker pin config for HP Spectre x360 Greg Kroah-Hartman
2016-10-06 18:42 ` [PATCH 4.4 00/93] 4.4.24-stable review Guenter Roeck
2016-10-06 19:58 ` Shuah Khan
[not found] ` <57f7819c.d4301c0a.965e6.cd11@mx.google.com>
2016-10-07 13:02 ` Greg Kroah-Hartman
2016-10-08 9:53 ` Kevin Hilman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20161006074731.340481814@linuxfoundation.org \
--to=gregkh@linuxfoundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mkl@pengutronix.de \
--cc=sergeimir@emcraft.com \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.