]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
IB/mad: Delete RMPP_STATE_CANCELING state
authorShay Drory <shayd@mellanox.com>
Sun, 21 Jun 2020 10:47:38 +0000 (13:47 +0300)
committerJason Gunthorpe <jgg@nvidia.com>
Wed, 24 Jun 2020 19:43:45 +0000 (16:43 -0300)
The cancel_delayed_work can be called under lock since it doesn't sleep.
This makes the RMPP_STATE_CANCELING state not needed anymore, remove it.

Link: https://lore.kernel.org/r/20200621104738.54850-5-leon@kernel.org
Signed-off-by: Shay Drory <shayd@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/infiniband/core/mad_rmpp.c

index 1bc9dfecae701c2ad258fa83b4091bc4556c3869..e0573e4d04040875c0a011b8368563d5c64c2c3b 100644 (file)
@@ -40,8 +40,7 @@
 enum rmpp_state {
        RMPP_STATE_ACTIVE,
        RMPP_STATE_TIMEOUT,
-       RMPP_STATE_COMPLETE,
-       RMPP_STATE_CANCELING
+       RMPP_STATE_COMPLETE
 };
 
 struct mad_rmpp_recv {
@@ -91,23 +90,19 @@ void ib_cancel_rmpp_recvs(struct ib_mad_agent_private *agent)
        unsigned long flags;
 
        spin_lock_irqsave(&agent->lock, flags);
-       list_for_each_entry(rmpp_recv, &agent->rmpp_list, list) {
-               if (rmpp_recv->state != RMPP_STATE_COMPLETE)
-                       ib_free_recv_mad(rmpp_recv->rmpp_wc);
-               rmpp_recv->state = RMPP_STATE_CANCELING;
-       }
-       spin_unlock_irqrestore(&agent->lock, flags);
-
        list_for_each_entry(rmpp_recv, &agent->rmpp_list, list) {
                cancel_delayed_work(&rmpp_recv->timeout_work);
                cancel_delayed_work(&rmpp_recv->cleanup_work);
        }
+       spin_unlock_irqrestore(&agent->lock, flags);
 
        flush_workqueue(agent->qp_info->port_priv->wq);
 
        list_for_each_entry_safe(rmpp_recv, temp_rmpp_recv,
                                 &agent->rmpp_list, list) {
                list_del(&rmpp_recv->list);
+               if (rmpp_recv->state != RMPP_STATE_COMPLETE)
+                       ib_free_recv_mad(rmpp_recv->rmpp_wc);
                destroy_rmpp_recv(rmpp_recv);
        }
 }
@@ -272,10 +267,6 @@ static void recv_cleanup_handler(struct work_struct *work)
        unsigned long flags;
 
        spin_lock_irqsave(&rmpp_recv->agent->lock, flags);
-       if (rmpp_recv->state == RMPP_STATE_CANCELING) {
-               spin_unlock_irqrestore(&rmpp_recv->agent->lock, flags);
-               return;
-       }
        list_del(&rmpp_recv->list);
        spin_unlock_irqrestore(&rmpp_recv->agent->lock, flags);
        destroy_rmpp_recv(rmpp_recv);