Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a08e1120 authored by Erez Shitrit's avatar Erez Shitrit Committed by Leon Romanovsky
Browse files

IB/ipoib: Make sure no in-flight joins while leaving that mcast



While cleaning neighs and there is a send-only mcast neigh, the driver
should wait to finish its join process before trying to remove it.

Without this patch, we will see messages like: "ipoib_mcast_leave on an
in-flight join" and unexpected results in the join_complete.

Signed-off-by: default avatarErez Shitrit <erezsh@mellanox.com>
Signed-off-by: default avatarLeon Romanovsky <leon@kernel.org>
parent 6bdc8de2
Loading
Loading
Loading
Loading
+8 −16
Original line number Diff line number Diff line
@@ -743,6 +743,14 @@ void ipoib_mcast_remove_list(struct list_head *remove_list)
{
	struct ipoib_mcast *mcast, *tmcast;

	/*
	 * make sure the in-flight joins have finished before we attempt
	 * to leave
	 */
	list_for_each_entry_safe(mcast, tmcast, remove_list, list)
		if (test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags))
			wait_for_completion(&mcast->done);

	list_for_each_entry_safe(mcast, tmcast, remove_list, list) {
		ipoib_mcast_leave(mcast->dev, mcast);
		ipoib_mcast_free(mcast);
@@ -852,14 +860,6 @@ void ipoib_mcast_dev_flush(struct net_device *dev)

	spin_unlock_irqrestore(&priv->lock, flags);

	/*
	 * make sure the in-flight joins have finished before we attempt
	 * to leave
	 */
	list_for_each_entry_safe(mcast, tmcast, &remove_list, list)
		if (test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags))
			wait_for_completion(&mcast->done);

	ipoib_mcast_remove_list(&remove_list);
	mutex_unlock(&priv->mcast_mutex);
}
@@ -979,14 +979,6 @@ void ipoib_mcast_restart_task(struct work_struct *work)
	netif_addr_unlock(dev);
	local_irq_restore(flags);

	/*
	 * make sure the in-flight joins have finished before we attempt
	 * to leave
	 */
	list_for_each_entry_safe(mcast, tmcast, &remove_list, list)
		if (test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags))
			wait_for_completion(&mcast->done);

	ipoib_mcast_remove_list(&remove_list);

	/*