Message ID | 20180502045903.6962-3-kai.heng.feng@canonical.com |
---|---|
State | Accepted |
Headers | show |
Series | Update Aquantia driver to v4.17 to fix regression | expand |
On 02/05/18 05:59, Kai-Heng Feng wrote: > From: Igor Russkikh <igor.russkikh@aquantia.com> > > BugLink: https://bugs.launchpad.net/bugs/1767088 > > In case netdev is closed at the moment of pci shutdown, aq_nic_stop > gets called second time. napi_disable in that case hangs indefinitely. > In other case, if device was never opened at all, we get oops because > of null pointer access. > > We should invoke aq_nic_stop conditionally, only if device is running > at the moment of shutdown. > > Reported-by: David Arcari <darcari@redhat.com> > Fixes: 90869ddfefeb ("net: aquantia: Implement pci shutdown callback") > Signed-off-by: Igor Russkikh <igor.russkikh@aquantia.com> > Signed-off-by: David S. Miller <davem@davemloft.net> > (cherry picked from commit 9a11aff25fd43d5bd2660ababdc9f564b0ba183a) > Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com> > --- > drivers/net/ethernet/aquantia/atlantic/aq_nic.c | 8 +++++--- > 1 file changed, 5 insertions(+), 3 deletions(-) > > diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c > index c96a92118b8b..32f6d2e24d66 100644 > --- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c > +++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c > @@ -951,9 +951,11 @@ void aq_nic_shutdown(struct aq_nic_s *self) > > netif_device_detach(self->ndev); > > - err = aq_nic_stop(self); > - if (err < 0) > - goto err_exit; > + if (netif_running(self->ndev)) { > + err = aq_nic_stop(self); > + if (err < 0) > + goto err_exit; > + } > aq_nic_deinit(self); > > err_exit: > Clean upstream cherry pick. Acked-by: Colin Ian King <colin.king@canonical.com>
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c index c96a92118b8b..32f6d2e24d66 100644 --- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c +++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c @@ -951,9 +951,11 @@ void aq_nic_shutdown(struct aq_nic_s *self) netif_device_detach(self->ndev); - err = aq_nic_stop(self); - if (err < 0) - goto err_exit; + if (netif_running(self->ndev)) { + err = aq_nic_stop(self); + if (err < 0) + goto err_exit; + } aq_nic_deinit(self); err_exit: