@@ -2616,14 +2616,16 @@ static int retry_send(struct ib_mad_send_wr_private *mad_send_wr)
26162616
26172617static void timeout_sends (struct work_struct * work )
26182618{
2619+ struct ib_mad_send_wr_private * mad_send_wr , * n ;
26192620 struct ib_mad_agent_private * mad_agent_priv ;
2620- struct ib_mad_send_wr_private * mad_send_wr ;
26212621 struct ib_mad_send_wc mad_send_wc ;
2622+ struct list_head local_list ;
26222623 unsigned long flags , delay ;
26232624
26242625 mad_agent_priv = container_of (work , struct ib_mad_agent_private ,
26252626 timed_work .work );
26262627 mad_send_wc .vendor_err = 0 ;
2628+ INIT_LIST_HEAD (& local_list );
26272629
26282630 spin_lock_irqsave (& mad_agent_priv -> lock , flags );
26292631 while (!list_empty (& mad_agent_priv -> wait_list )) {
@@ -2641,25 +2643,25 @@ static void timeout_sends(struct work_struct *work)
26412643 break ;
26422644 }
26432645
2644- list_del (& mad_send_wr -> agent_list );
2646+ list_del_init (& mad_send_wr -> agent_list );
26452647 if (mad_send_wr -> status == IB_WC_SUCCESS &&
26462648 !retry_send (mad_send_wr ))
26472649 continue ;
26482650
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 );
26502654
2655+ list_for_each_entry_safe (mad_send_wr , n , & local_list , agent_list ) {
26512656 if (mad_send_wr -> status == IB_WC_SUCCESS )
26522657 mad_send_wc .status = IB_WC_RESP_TIMEOUT_ERR ;
26532658 else
26542659 mad_send_wc .status = mad_send_wr -> status ;
26552660 mad_send_wc .send_buf = & mad_send_wr -> send_buf ;
26562661 mad_agent_priv -> agent .send_handler (& mad_agent_priv -> agent ,
26572662 & mad_send_wc );
2658-
26592663 deref_mad_agent (mad_agent_priv );
2660- spin_lock_irqsave (& mad_agent_priv -> lock , flags );
26612664 }
2662- spin_unlock_irqrestore (& mad_agent_priv -> lock , flags );
26632665}
26642666
26652667/*
0 commit comments