* Unhandled fault during system suspend in sky2_shutdown
@ 2016-04-11 16:24 Sudeep Holla
2016-04-11 18:24 ` Stephen Hemminger
0 siblings, 1 reply; 3+ messages in thread
From: Sudeep Holla @ 2016-04-11 16:24 UTC (permalink / raw)
To: linux-kernel, netdev; +Cc: Sudeep Holla, Stephen Hemminger, Mirko Lindner
Hi,
I am seeing unhandled fault during system suspend in sky2_shutdown.
I am not sure if it's something missing in the firmware, but just wanted
to check. I see that networkmanager is invoking calling to
netlink_sendmsg which calls sky2_get_stats after the device is shutdown.
Unhandled fault: synchronous external abort (0x96000210) at
0xffff0000091c2918
Internal error: : 96000210 [#1] PREEMPT SMP
Modules linked in:
CPU: 3 PID: 2029 Comm: NetworkManager Not tainted 4.6.0-rc3 #126
Hardware name: ARM Juno development board (r2) (DT)
task: ffff80007a673000 ti: ffff800940b5c000 task.ti: ffff800940b5c000
PC is at sky2_get_stats+0x44/0x3b8
LR is at dev_get_stats+0x58/0xc8
sky2_get_stats+0x44/0x3b8
rtnl_fill_stats+0x20/0x138
rtnl_fill_ifinfo+0x440/0xb38
rtnl_getlink+0xe8/0x198
rtnetlink_rcv_msg+0xe4/0x220
netlink_rcv_skb+0xc4/0xf8
rtnetlink_rcv+0x2c/0x40
netlink_unicast+0x160/0x238
netlink_sendmsg+0x2f0/0x358
sock_sendmsg+0x18/0x30
___sys_sendmsg+0x204/0x218
__sys_sendmsg+0x44/0x88
SyS_sendmsg+0xc/0x18
el0_svc_naked+0x24/0x28
The below patch is the hack I came up to check if the netdev is detached
and unregistered, I no longer see the issue.
Regards,
Sudeep
-->8
diff --git i/drivers/net/ethernet/marvell/sky2.c
w/drivers/net/ethernet/marvell/sky2.c
index ec0a22119e09..0ff0434e32fc 100644
--- i/drivers/net/ethernet/marvell/sky2.c
+++ w/drivers/net/ethernet/marvell/sky2.c
@@ -5220,6 +5220,13 @@ static SIMPLE_DEV_PM_OPS(sky2_pm_ops,
sky2_suspend, sky2_resume);
static void sky2_shutdown(struct pci_dev *pdev)
{
+ struct sky2_hw *hw = pci_get_drvdata(pdev);
+ int i;
+
+ for (i = hw->ports - 1; i >= 0; --i) {
+ sky2_detach(hw->dev[i]);
+ unregister_netdev(hw->dev[i]);
+ }
sky2_suspend(&pdev->dev);
pci_wake_from_d3(pdev, device_may_wakeup(&pdev->dev));
pci_set_power_state(pdev, PCI_D3hot);
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: Unhandled fault during system suspend in sky2_shutdown
2016-04-11 16:24 Unhandled fault during system suspend in sky2_shutdown Sudeep Holla
@ 2016-04-11 18:24 ` Stephen Hemminger
2016-04-12 14:06 ` Sudeep Holla
0 siblings, 1 reply; 3+ messages in thread
From: Stephen Hemminger @ 2016-04-11 18:24 UTC (permalink / raw)
To: Sudeep Holla; +Cc: linux-kernel, netdev, Mirko Lindner
On Mon, 11 Apr 2016 17:24:37 +0100
Sudeep Holla <sudeep.holla@arm.com> wrote:
> Hi,
>
> I am seeing unhandled fault during system suspend in sky2_shutdown.
> I am not sure if it's something missing in the firmware, but just wanted
> to check. I see that networkmanager is invoking calling to
> netlink_sendmsg which calls sky2_get_stats after the device is shutdown.
>
> Unhandled fault: synchronous external abort (0x96000210) at
> 0xffff0000091c2918
> Internal error: : 96000210 [#1] PREEMPT SMP
> Modules linked in:
> CPU: 3 PID: 2029 Comm: NetworkManager Not tainted 4.6.0-rc3 #126
> Hardware name: ARM Juno development board (r2) (DT)
> task: ffff80007a673000 ti: ffff800940b5c000 task.ti: ffff800940b5c000
> PC is at sky2_get_stats+0x44/0x3b8
> LR is at dev_get_stats+0x58/0xc8
> sky2_get_stats+0x44/0x3b8
> rtnl_fill_stats+0x20/0x138
> rtnl_fill_ifinfo+0x440/0xb38
> rtnl_getlink+0xe8/0x198
> rtnetlink_rcv_msg+0xe4/0x220
> netlink_rcv_skb+0xc4/0xf8
> rtnetlink_rcv+0x2c/0x40
> netlink_unicast+0x160/0x238
> netlink_sendmsg+0x2f0/0x358
> sock_sendmsg+0x18/0x30
> ___sys_sendmsg+0x204/0x218
> __sys_sendmsg+0x44/0x88
> SyS_sendmsg+0xc/0x18
> el0_svc_naked+0x24/0x28
>
> The below patch is the hack I came up to check if the netdev is detached
> and unregistered, I no longer see the issue.
>
> Regards,
> Sudeep
>
> -->8
>
> diff --git i/drivers/net/ethernet/marvell/sky2.c
> w/drivers/net/ethernet/marvell/sky2.c
> index ec0a22119e09..0ff0434e32fc 100644
> --- i/drivers/net/ethernet/marvell/sky2.c
> +++ w/drivers/net/ethernet/marvell/sky2.c
> @@ -5220,6 +5220,13 @@ static SIMPLE_DEV_PM_OPS(sky2_pm_ops,
> sky2_suspend, sky2_resume);
>
> static void sky2_shutdown(struct pci_dev *pdev)
> {
> + struct sky2_hw *hw = pci_get_drvdata(pdev);
> + int i;
> +
> + for (i = hw->ports - 1; i >= 0; --i) {
> + sky2_detach(hw->dev[i]);
> + unregister_netdev(hw->dev[i]);
> + }
> sky2_suspend(&pdev->dev);
> pci_wake_from_d3(pdev, device_may_wakeup(&pdev->dev));
> pci_set_power_state(pdev, PCI_D3hot);
This is not the correct fix, the device is supposed to stay registered.
The correct way to fix this would be to make get_stats ignore requests for device
when suspended.
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: Unhandled fault during system suspend in sky2_shutdown
2016-04-11 18:24 ` Stephen Hemminger
@ 2016-04-12 14:06 ` Sudeep Holla
0 siblings, 0 replies; 3+ messages in thread
From: Sudeep Holla @ 2016-04-12 14:06 UTC (permalink / raw)
To: Stephen Hemminger; +Cc: Sudeep Holla, linux-kernel, netdev, Mirko Lindner
On 11/04/16 19:24, Stephen Hemminger wrote:
> On Mon, 11 Apr 2016 17:24:37 +0100
> Sudeep Holla <sudeep.holla@arm.com> wrote:
>
[...]
>>
>> diff --git i/drivers/net/ethernet/marvell/sky2.c
>> w/drivers/net/ethernet/marvell/sky2.c
>> index ec0a22119e09..0ff0434e32fc 100644
>> --- i/drivers/net/ethernet/marvell/sky2.c
>> +++ w/drivers/net/ethernet/marvell/sky2.c
>> @@ -5220,6 +5220,13 @@ static SIMPLE_DEV_PM_OPS(sky2_pm_ops,
>> sky2_suspend, sky2_resume);
>>
>> static void sky2_shutdown(struct pci_dev *pdev)
>> {
>> + struct sky2_hw *hw = pci_get_drvdata(pdev);
>> + int i;
>> +
>> + for (i = hw->ports - 1; i >= 0; --i) {
>> + sky2_detach(hw->dev[i]);
>> + unregister_netdev(hw->dev[i]);
>> + }
>> sky2_suspend(&pdev->dev);
>> pci_wake_from_d3(pdev, device_may_wakeup(&pdev->dev));
>> pci_set_power_state(pdev, PCI_D3hot);
>
> This is not the correct fix, the device is supposed to stay
> registered. The correct way to fix this would be to make get_stats
> ignore requests for device when suspended.
Yes I agree it's not correct fix. But I tried ignoring it in get_stat32
but the crash just moves the bug elsewhere. IMO patching all the places
to check the suspended state might be bit heavy ?
E.g. with something like below the crash moves to sky2_get_eeprom_len
function.
sky2_get_eeprom_len+0x10/0x30
dev_ethtool+0x29c/0x1d78
dev_ioctl+0x31c/0x5a8
sock_ioctl+0x2ac/0x310
do_vfs_ioctl+0xa4/0x750
SyS_ioctl+0x8c/0xa0
el0_svc_naked+0x24/0x2
Sorry if I am missing something fundamental, I am bit new to net drivers
Regards,
Sudeep
-->8
diff --git i/drivers/net/ethernet/marvell/sky2.c
w/drivers/net/ethernet/marvell/sky2.c
index ec0a22119e09..d4cfcd89e7e5 100644
--- i/drivers/net/ethernet/marvell/sky2.c
+++ w/drivers/net/ethernet/marvell/sky2.c
@@ -5175,6 +5175,7 @@ static int sky2_suspend(struct device *dev)
}
sky2_power_aux(hw);
+ hw->suspended = true;
rtnl_unlock();
return 0;
@@ -5198,6 +5199,7 @@ static int sky2_resume(struct device *dev)
}
rtnl_lock();
+ hw->suspended = false;
sky2_reset(hw);
sky2_all_up(hw);
rtnl_unlock();
diff --git i/drivers/net/ethernet/marvell/sky2.h
w/drivers/net/ethernet/marvell/sky2.h
index ec6dcd80152b..1386e5b635ff 100644
--- i/drivers/net/ethernet/marvell/sky2.h
+++ w/drivers/net/ethernet/marvell/sky2.h
@@ -2308,6 +2308,7 @@ struct sky2_hw {
wait_queue_head_t msi_wait;
char irq_name[0];
+ bool suspended;
};
static inline int sky2_is_copper(const struct sky2_hw *hw)
@@ -2378,6 +2379,9 @@ static inline u32 get_stats32(struct sky2_hw *hw,
unsigned port, unsigned reg)
{
u32 val;
+ if (hw->suspended)
+ return 0;
+
do {
val = gma_read32(hw, port, reg);
} while (gma_read32(hw, port, reg) != val);
^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2016-04-12 14:06 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-04-11 16:24 Unhandled fault during system suspend in sky2_shutdown Sudeep Holla
2016-04-11 18:24 ` Stephen Hemminger
2016-04-12 14:06 ` Sudeep Holla
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.