@@ -302,8 +302,9 @@ static irqreturn_t iavf_msix_aq(int irq, void *data)
302
302
rd32 (hw , IAVF_VFINT_ICR01 );
303
303
rd32 (hw , IAVF_VFINT_ICR0_ENA1 );
304
304
305
- /* schedule work on the private workqueue */
306
- queue_work (iavf_wq , & adapter -> adminq_task );
305
+ if (adapter -> state != __IAVF_REMOVE )
306
+ /* schedule work on the private workqueue */
307
+ queue_work (iavf_wq , & adapter -> adminq_task );
307
308
308
309
return IRQ_HANDLED ;
309
310
}
@@ -2374,8 +2375,12 @@ static void iavf_watchdog_task(struct work_struct *work)
2374
2375
struct iavf_hw * hw = & adapter -> hw ;
2375
2376
u32 reg_val ;
2376
2377
2377
- if (!mutex_trylock (& adapter -> crit_lock ))
2378
+ if (!mutex_trylock (& adapter -> crit_lock )) {
2379
+ if (adapter -> state == __IAVF_REMOVE )
2380
+ return ;
2381
+
2378
2382
goto restart_watchdog ;
2383
+ }
2379
2384
2380
2385
if (adapter -> flags & IAVF_FLAG_PF_COMMS_FAILED )
2381
2386
iavf_change_state (adapter , __IAVF_COMM_FAILED );
@@ -2601,13 +2606,13 @@ static void iavf_reset_task(struct work_struct *work)
2601
2606
/* When device is being removed it doesn't make sense to run the reset
2602
2607
* task, just return in such a case.
2603
2608
*/
2604
- if (mutex_is_locked (& adapter -> remove_lock ))
2605
- return ;
2609
+ if (!mutex_trylock (& adapter -> crit_lock )) {
2610
+ if (adapter -> state != __IAVF_REMOVE )
2611
+ queue_work (iavf_wq , & adapter -> reset_task );
2606
2612
2607
- if (iavf_lock_timeout (& adapter -> crit_lock , 200 )) {
2608
- schedule_work (& adapter -> reset_task );
2609
2613
return ;
2610
2614
}
2615
+
2611
2616
while (!mutex_trylock (& adapter -> client_lock ))
2612
2617
usleep_range (500 , 1000 );
2613
2618
if (CLIENT_ENABLED (adapter )) {
@@ -2826,13 +2831,19 @@ static void iavf_adminq_task(struct work_struct *work)
2826
2831
if (adapter -> flags & IAVF_FLAG_PF_COMMS_FAILED )
2827
2832
goto out ;
2828
2833
2834
+ if (!mutex_trylock (& adapter -> crit_lock )) {
2835
+ if (adapter -> state == __IAVF_REMOVE )
2836
+ return ;
2837
+
2838
+ queue_work (iavf_wq , & adapter -> adminq_task );
2839
+ goto out ;
2840
+ }
2841
+
2829
2842
event .buf_len = IAVF_MAX_AQ_BUF_SIZE ;
2830
2843
event .msg_buf = kzalloc (event .buf_len , GFP_KERNEL );
2831
2844
if (!event .msg_buf )
2832
2845
goto out ;
2833
2846
2834
- if (iavf_lock_timeout (& adapter -> crit_lock , 200 ))
2835
- goto freedom ;
2836
2847
do {
2837
2848
ret = iavf_clean_arq_element (hw , & event , & pending );
2838
2849
v_op = (enum virtchnl_ops )le32_to_cpu (event .desc .cookie_high );
@@ -3800,11 +3811,12 @@ static int iavf_close(struct net_device *netdev)
3800
3811
struct iavf_adapter * adapter = netdev_priv (netdev );
3801
3812
int status ;
3802
3813
3803
- if (adapter -> state <= __IAVF_DOWN_PENDING )
3804
- return 0 ;
3814
+ mutex_lock (& adapter -> crit_lock );
3805
3815
3806
- while (!mutex_trylock (& adapter -> crit_lock ))
3807
- usleep_range (500 , 1000 );
3816
+ if (adapter -> state <= __IAVF_DOWN_PENDING ) {
3817
+ mutex_unlock (& adapter -> crit_lock );
3818
+ return 0 ;
3819
+ }
3808
3820
3809
3821
set_bit (__IAVF_VSI_DOWN , adapter -> vsi .state );
3810
3822
if (CLIENT_ENABLED (adapter ))
@@ -4431,7 +4443,6 @@ static int iavf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
4431
4443
*/
4432
4444
mutex_init (& adapter -> crit_lock );
4433
4445
mutex_init (& adapter -> client_lock );
4434
- mutex_init (& adapter -> remove_lock );
4435
4446
mutex_init (& hw -> aq .asq_mutex );
4436
4447
mutex_init (& hw -> aq .arq_mutex );
4437
4448
@@ -4556,11 +4567,7 @@ static void iavf_remove(struct pci_dev *pdev)
4556
4567
struct iavf_cloud_filter * cf , * cftmp ;
4557
4568
struct iavf_hw * hw = & adapter -> hw ;
4558
4569
int err ;
4559
- /* Indicate we are in remove and not to run reset_task */
4560
- mutex_lock (& adapter -> remove_lock );
4561
- cancel_work_sync (& adapter -> reset_task );
4562
- cancel_delayed_work_sync (& adapter -> watchdog_task );
4563
- cancel_delayed_work_sync (& adapter -> client_task );
4570
+
4564
4571
if (adapter -> netdev_registered ) {
4565
4572
unregister_netdev (netdev );
4566
4573
adapter -> netdev_registered = false;
@@ -4572,25 +4579,30 @@ static void iavf_remove(struct pci_dev *pdev)
4572
4579
err );
4573
4580
}
4574
4581
4582
+ mutex_lock (& adapter -> crit_lock );
4583
+ dev_info (& adapter -> pdev -> dev , "Remove device\n" );
4584
+ iavf_change_state (adapter , __IAVF_REMOVE );
4585
+
4575
4586
iavf_request_reset (adapter );
4576
4587
msleep (50 );
4577
4588
/* If the FW isn't responding, kick it once, but only once. */
4578
4589
if (!iavf_asq_done (hw )) {
4579
4590
iavf_request_reset (adapter );
4580
4591
msleep (50 );
4581
4592
}
4582
- if (iavf_lock_timeout (& adapter -> crit_lock , 5000 ))
4583
- dev_warn (& adapter -> pdev -> dev , "failed to acquire crit_lock in %s\n" , __FUNCTION__ );
4584
4593
4585
- dev_info ( & adapter -> pdev -> dev , "Removing device\n" );
4594
+ iavf_misc_irq_disable ( adapter );
4586
4595
/* Shut down all the garbage mashers on the detention level */
4587
- iavf_change_state (adapter , __IAVF_REMOVE );
4596
+ cancel_work_sync (& adapter -> reset_task );
4597
+ cancel_delayed_work_sync (& adapter -> watchdog_task );
4598
+ cancel_work_sync (& adapter -> adminq_task );
4599
+ cancel_delayed_work_sync (& adapter -> client_task );
4600
+
4588
4601
adapter -> aq_required = 0 ;
4589
4602
adapter -> flags &= ~IAVF_FLAG_REINIT_ITR_NEEDED ;
4590
4603
4591
4604
iavf_free_all_tx_resources (adapter );
4592
4605
iavf_free_all_rx_resources (adapter );
4593
- iavf_misc_irq_disable (adapter );
4594
4606
iavf_free_misc_irq (adapter );
4595
4607
4596
4608
/* In case we enter iavf_remove from erroneous state, free traffic irqs
@@ -4606,10 +4618,6 @@ static void iavf_remove(struct pci_dev *pdev)
4606
4618
iavf_reset_interrupt_capability (adapter );
4607
4619
iavf_free_q_vectors (adapter );
4608
4620
4609
- cancel_delayed_work_sync (& adapter -> watchdog_task );
4610
-
4611
- cancel_work_sync (& adapter -> adminq_task );
4612
-
4613
4621
iavf_free_rss (adapter );
4614
4622
4615
4623
if (hw -> aq .asq .count )
@@ -4621,8 +4629,6 @@ static void iavf_remove(struct pci_dev *pdev)
4621
4629
mutex_destroy (& adapter -> client_lock );
4622
4630
mutex_unlock (& adapter -> crit_lock );
4623
4631
mutex_destroy (& adapter -> crit_lock );
4624
- mutex_unlock (& adapter -> remove_lock );
4625
- mutex_destroy (& adapter -> remove_lock );
4626
4632
4627
4633
iounmap (hw -> hw_addr );
4628
4634
pci_release_regions (pdev );
0 commit comments