@@ -2616,14 +2616,16 @@ static int retry_send(struct ib_mad_send_wr_private *mad_send_wr)
2616
2616
2617
2617
static void timeout_sends (struct work_struct * work )
2618
2618
{
2619
+ struct ib_mad_send_wr_private * mad_send_wr , * n ;
2619
2620
struct ib_mad_agent_private * mad_agent_priv ;
2620
- struct ib_mad_send_wr_private * mad_send_wr ;
2621
2621
struct ib_mad_send_wc mad_send_wc ;
2622
+ struct list_head local_list ;
2622
2623
unsigned long flags , delay ;
2623
2624
2624
2625
mad_agent_priv = container_of (work , struct ib_mad_agent_private ,
2625
2626
timed_work .work );
2626
2627
mad_send_wc .vendor_err = 0 ;
2628
+ INIT_LIST_HEAD (& local_list );
2627
2629
2628
2630
spin_lock_irqsave (& mad_agent_priv -> lock , flags );
2629
2631
while (!list_empty (& mad_agent_priv -> wait_list )) {
@@ -2641,25 +2643,25 @@ static void timeout_sends(struct work_struct *work)
2641
2643
break ;
2642
2644
}
2643
2645
2644
- list_del (& mad_send_wr -> agent_list );
2646
+ list_del_init (& mad_send_wr -> agent_list );
2645
2647
if (mad_send_wr -> status == IB_WC_SUCCESS &&
2646
2648
!retry_send (mad_send_wr ))
2647
2649
continue ;
2648
2650
2649
- spin_unlock_irqrestore (& mad_agent_priv -> lock , flags );
2651
+ list_add_tail (& mad_send_wr -> agent_list , & local_list );
2652
+ }
2653
+ spin_unlock_irqrestore (& mad_agent_priv -> lock , flags );
2650
2654
2655
+ list_for_each_entry_safe (mad_send_wr , n , & local_list , agent_list ) {
2651
2656
if (mad_send_wr -> status == IB_WC_SUCCESS )
2652
2657
mad_send_wc .status = IB_WC_RESP_TIMEOUT_ERR ;
2653
2658
else
2654
2659
mad_send_wc .status = mad_send_wr -> status ;
2655
2660
mad_send_wc .send_buf = & mad_send_wr -> send_buf ;
2656
2661
mad_agent_priv -> agent .send_handler (& mad_agent_priv -> agent ,
2657
2662
& mad_send_wc );
2658
-
2659
2663
deref_mad_agent (mad_agent_priv );
2660
- spin_lock_irqsave (& mad_agent_priv -> lock , flags );
2661
2664
}
2662
- spin_unlock_irqrestore (& mad_agent_priv -> lock , flags );
2663
2665
}
2664
2666
2665
2667
/*
0 commit comments