From: Per Hallsmark <per.hallsm...@windriver.com> root@axxiaarm64:~# ifconfig eth0 [ 2377.952102] BUG: sleeping function called from invalid context at kernel/sched/completion.c:90 [ 2378.005347] in_atomic(): 0, irqs_disabled(): 0, pid: 1140, name: ifconfig [ 2378.046970] INFO: lockdep is turned off. [ 2378.070992] Preemption disabled at:[<ffffffc00010c658>] vprintk_default+0x48/0x58 [ 2378.116906] [ 2378.125998] CPU: 0 PID: 1140 Comm: ifconfig Tainted: G W 4.1.21-rt13-wrl800.6_ 2.38_1-yocto-standard+ #25 [ 2378.191071] Hardware name: AXM56xx Victoria (DT) [ 2378.219344] Call trace: [ 2378.234287] [<ffffffc00008ac38>] dump_backtrace+0x0/0x128 [ 2378.267363] [<ffffffc00008ad84>] show_stack+0x24/0x30 [ 2378.298304] [<ffffffc00072cd64>] dump_stack+0xb0/0x10c [ 2378.329780] [<ffffffc0000d44a0>] ___might_sleep+0x258/0x270 [ 2378.363919] [<ffffffc0000d4518>] __might_sleep+0x60/0xa0 [ 2378.396460] [<ffffffc00072fab0>] wait_for_common+0x48/0x150 [ 2378.430599] [<ffffffc00072fc1c>] wait_for_completion_timeout+0x2c/0x38 [ 2378.470607] [<ffffffc0004f2c1c>] nemac_stats_snapshot+0x44/0x50 [ 2378.506880] [<ffffffc0004f3a40>] nemac_get_stats64+0x28/0x138 [ 2378.542088] [<ffffffc0005a6478>] dev_get_stats+0x68/0xd8 [ 2378.574628] [<ffffffc0005d0834>] dev_seq_printf_stats+0x2c/0xf0 [ 2378.610900] [<ffffffc0005d0928>] dev_seq_show+0x30/0x60 [ 2378.642908] [<ffffffc000260dcc>] seq_read+0x32c/0x420 [ 2378.673851] [<ffffffc0002a751c>] proc_reg_read+0x84/0xc0 [ 2378.706391] [<ffffffc0002358e8>] __vfs_read+0x48/0x90 [ 2378.737331] [<ffffffc000236334>] vfs_read+0x84/0x170 [ 2378.767737] [<ffffffc00023702c>] SyS_read+0x54/0xb0 eth0 Link encap:Ethernet HWaddr 98:4f:ee:10:e4:39 inet addr:128.224.95.149 Bcast:128.224.95.255 Mask:255.255.255.128 inet6 addr: fe80::9a4f:eeff:fe10:e439/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:15928 errors:0 dropped:2 overruns:0 frame:15928 TX packets:5301 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:11134123 (10.6 MiB) TX bytes:982220 (959.1 KiB)
root@axxiaarm64:~# According to documentation: ndo_get_stats: Synchronization: dev_base_lock rwlock. Context: nominally process, but don't sleep inside an rwlock So we need to poll for completion instead of possibly sleep. Signed-off-by: Per Hallsmark <per.hallsm...@windriver.com> --- drivers/net/ethernet/intel/axxia/nemac.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/intel/axxia/nemac.c b/drivers/net/ethernet/intel/axxia/nemac.c index 2eead12..ce57258 100644 --- a/drivers/net/ethernet/intel/axxia/nemac.c +++ b/drivers/net/ethernet/intel/axxia/nemac.c @@ -376,14 +376,20 @@ nemac_tx_stat_counter(struct nemac_priv *priv, int counter) static int nemac_stats_snapshot(struct nemac_priv *priv) { - const unsigned long tmo = msecs_to_jiffies(20); + const unsigned long tmo = jiffies + msecs_to_jiffies(20); + int ret; /* Request a snapshot of the counters and wait for the interrupt * handler to signal completion. */ reinit_completion(&priv->stats_rdy); writel(MAC(0), priv->reg + NEM_STATS_SNAPSHOT_R); - return wait_for_completion_interruptible_timeout(&priv->stats_rdy, tmo); + + /* need to poll for completion */ + do { + ret = try_wait_for_completion(&priv->stats_rdy); + } while (!ret && time_before(jiffies, tmo)); + return ret; } static const char * const tx_stat_names[] = { -- 2.7.4 -- _______________________________________________ linux-yocto mailing list linux-yocto@yoctoproject.org https://lists.yoctoproject.org/listinfo/linux-yocto