On 07/06/2016 03:35 PM, Thomas Falcon wrote: > @@ -3560,6 +3608,7 @@ static const struct file_operations ibmvnic_dump_ops = { > > static int ibmvnic_probe(struct vio_dev *dev, const struct vio_device_id *id) > { > + unsigned long timeout = msecs_to_jiffies(30000); > struct ibmvnic_adapter *adapter; > struct net_device *netdev; > unsigned char *mac_addr_p; > @@ -3638,30 +3687,26 @@ static int ibmvnic_probe(struct vio_dev *dev, const > struct vio_device_id *id) > ibmvnic_send_crq_init(adapter); > > init_completion(&adapter->init_done); > - wait_for_completion(&adapter->init_done); > + if (!wait_for_completion_timeout(&adapter->init_done, timeout)) > + return 0; > > do { > - adapter->renegotiate = false; > - > - init_sub_crqs(adapter, 0); > - reinit_completion(&adapter->init_done); > - wait_for_completion(&adapter->init_done); > - > if (adapter->renegotiate) { > - release_sub_crqs(adapter); > + adapter->renegotiate = false; > + release_sub_crqs_no_irqs(adapter); > send_cap_queries(adapter); > > reinit_completion(&adapter->init_done); > - wait_for_completion(&adapter->init_done); > + if (!wait_for_completion_timeout(&adapter->init_done, > + timeout)) > + return 0; > } > } while (adapter->renegotiate);
Instead of a do-while here, this should just be simplified to a while loop. while (adapter->renegotiate) { ... } will serve the same purpose as do { if (adapter->renegotiate) { ... } } while (adapter->renegotiate); Same goes for the similar loop in patch 4/4.