On Wed, 26 Aug 2020 09:42:11 -0700 Shannon Nelson wrote: > + mutex_lock(&lif->queue_lock); > + netif_device_detach(lif->netdev); > + ionic_stop_queues(lif); > + ionic_txrx_deinit(lif); > > + err = ionic_txrx_init(lif); > + if (err) > + goto err_out; > + > + /* don't start the queues until we have link */ > + if (netif_carrier_ok(netdev)) { > + err = ionic_start_queues(lif); > + if (err) > + goto err_out; > + } > + > +err_out: > + netif_device_attach(lif->netdev); > + mutex_unlock(&lif->queue_lock);
Looks a little racy, since the link state is changed before queue_lock is taken: if (!netif_carrier_ok(netdev)) { u32 link_speed; ionic_port_identify(lif->ionic); link_speed = le32_to_cpu(lif->info->status.link_speed); netdev_info(netdev, "Link up - %d Gbps\n", link_speed / 1000); netif_carrier_on(netdev); } if (lif->netdev->flags & IFF_UP && netif_running(lif->netdev)) \ { mutex_lock(&lif->queue_lock); ionic_start_queues(lif); mutex_unlock(&lif->queue_lock); }