Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

IB/mad: Issue complete whenever decrements agent refcount

Replace calls of atomic_dec() to mad_agent_priv->refcount with calls to
deref_mad_agent() in order to issue complete. Most likely the refcount is
> 1 at these points, but it is difficult to prove. Performance is not
important on these paths, so be obviously correct.

Link: https://lore.kernel.org/r/20200621104738.54850-3-leon@kernel.org
Signed-off-by: Shay Drory <shayd@mellanox.com>
Reviewed-by: Maor Gottlieb <maorg@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>

authored by

Shay Drory and committed by
Jason Gunthorpe
b9af0e2d 95a5631f

+7 -7
+7 -7
drivers/infiniband/core/mad.c
··· 1148 1148 spin_lock_irqsave(&mad_agent_priv->lock, flags); 1149 1149 list_del(&mad_send_wr->agent_list); 1150 1150 spin_unlock_irqrestore(&mad_agent_priv->lock, flags); 1151 - atomic_dec(&mad_agent_priv->refcount); 1151 + deref_mad_agent(mad_agent_priv); 1152 1152 goto error; 1153 1153 } 1154 1154 } ··· 1831 1831 mad_agent_priv->agent.recv_handler( 1832 1832 &mad_agent_priv->agent, NULL, 1833 1833 mad_recv_wc); 1834 - atomic_dec(&mad_agent_priv->refcount); 1834 + deref_mad_agent(mad_agent_priv); 1835 1835 } else { 1836 1836 /* not user rmpp, revert to normal behavior and 1837 1837 * drop the mad */ ··· 1848 1848 &mad_agent_priv->agent, 1849 1849 &mad_send_wr->send_buf, 1850 1850 mad_recv_wc); 1851 - atomic_dec(&mad_agent_priv->refcount); 1851 + deref_mad_agent(mad_agent_priv); 1852 1852 1853 1853 mad_send_wc.status = IB_WC_SUCCESS; 1854 1854 mad_send_wc.vendor_err = 0; ··· 2438 2438 list_del(&mad_send_wr->agent_list); 2439 2439 mad_agent_priv->agent.send_handler(&mad_agent_priv->agent, 2440 2440 &mad_send_wc); 2441 - atomic_dec(&mad_agent_priv->refcount); 2441 + deref_mad_agent(mad_agent_priv); 2442 2442 } 2443 2443 } 2444 2444 ··· 2572 2572 &local->mad_send_wr->send_buf, 2573 2573 &local->mad_priv->header.recv_wc); 2574 2574 spin_lock_irqsave(&recv_mad_agent->lock, flags); 2575 - atomic_dec(&recv_mad_agent->refcount); 2575 + deref_mad_agent(recv_mad_agent); 2576 2576 spin_unlock_irqrestore(&recv_mad_agent->lock, flags); 2577 2577 } 2578 2578 ··· 2585 2585 &mad_send_wc); 2586 2586 2587 2587 spin_lock_irqsave(&mad_agent_priv->lock, flags); 2588 - atomic_dec(&mad_agent_priv->refcount); 2588 + deref_mad_agent(mad_agent_priv); 2589 2589 if (free_mad) 2590 2590 kfree(local->mad_priv); 2591 2591 kfree(local); ··· 2671 2671 mad_agent_priv->agent.send_handler(&mad_agent_priv->agent, 2672 2672 &mad_send_wc); 2673 2673 2674 - atomic_dec(&mad_agent_priv->refcount); 2674 + deref_mad_agent(mad_agent_priv); 2675 2675 spin_lock_irqsave(&mad_agent_priv->lock, flags); 2676 2676 } 2677 2677 spin_unlock_irqrestore(&mad_agent_priv->lock, flags);