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);                         
                }    

Reply via email to