From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Cho, Yu-Chen" Subject: [PATCH] use cond_resched() to replace udelay() when dump eeprom Date: Mon, 12 May 2014 15:06:24 +0800 Message-ID: <1399878384-4690-1-git-send-email-acho@suse.com> Cc: bpoirier@suse.de To: netdev@vger.kernel.org Return-path: Received: from victor.provo.novell.com ([137.65.250.26]:43674 "EHLO victor.provo.novell.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750777AbaELHOH (ORCPT ); Mon, 12 May 2014 03:14:07 -0400 Sender: netdev-owner@vger.kernel.org List-ID: The loop in tg3_nvram_exec_cmd() will give up after about 100 msec per command, it can loop for a long time. For some test case , if we try to dump eeprom from tg3 interface, what is UP but not running , NO-CARRIER (no cable), then the lock up occurs: [] tg3_nvram_exec_cmd+0x3a/0x60 [tg3] [] tg3_nvram_read+0x62/0x130 [tg3] [] tg3_nvram_read_be32+0x12/0x30 [tg3] [] tg3_get_eeprom+0x9d/0x190 [tg3] [] ethtool_get_any_eeprom+0xe2/0x170 [] dev_ethtool+0xd58/0x1a60 [] dev_ioctl+0x1ab/0x560 [] sock_do_ioctl+0x3d/0x50 [] sock_ioctl+0x1e8/0x2c0 [] do_vfs_ioctl+0x2d4/0x4b0 [] SyS_ioctl+0x80/0xa0 [] system_call_fastpath+0x1a/0x1f [<00007f6b6cbf4387>] 0x7f6b6cbf4386 Signed-off-by: Cho, Yu-Chen --- drivers/net/ethernet/broadcom/tg3.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c index e5d95c5..7dc8bb5 100644 --- a/drivers/net/ethernet/broadcom/tg3.c +++ b/drivers/net/ethernet/broadcom/tg3.c @@ -3232,7 +3232,9 @@ static int tg3_nvram_exec_cmd(struct tg3 *tp, u32 nvram_cmd) tw32(NVRAM_CMD, nvram_cmd); for (i = 0; i < NVRAM_CMD_TIMEOUT; i++) { - udelay(10); + + cond_resched(); + if (tr32(NVRAM_CMD) & NVRAM_CMD_DONE) { udelay(10); break; -- 1.8.4.5