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

Commit 9beb4896 authored by Tejun Heo's avatar Tejun Heo
Browse files

iseries_veth: don't use flush_scheduled_work()



flush_scheduled_work() is on its way out.  Remove its usage from
iseries_veth.

* Cancelling a delayed work, queueing it for immediate execution if
  cancelled and then waiting for completion can be done by simply
  calling flush_delayed_work_sync().

* Explicitly cancel cnx->statemachine_wq on module unload.

Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Santiago Leon <santil@linux.vnet.ibm.com>
Cc: netdev@vger.kernel.org
parent f5c35cc1
Loading
Loading
Loading
Loading
+4 −14
Original line number Diff line number Diff line
@@ -885,17 +885,8 @@ static void veth_stop_connection(struct veth_lpar_connection *cnx)
	veth_kick_statemachine(cnx);
	spin_unlock_irq(&cnx->lock);

	/* There's a slim chance the reset code has just queued the
	 * statemachine to run in five seconds. If so we need to cancel
	 * that and requeue the work to run now. */
	if (cancel_delayed_work(&cnx->statemachine_wq)) {
		spin_lock_irq(&cnx->lock);
		veth_kick_statemachine(cnx);
		spin_unlock_irq(&cnx->lock);
	}

	/* Wait for the state machine to run. */
	flush_scheduled_work();
	/* ensure the statemachine runs now and waits for its completion */
	flush_delayed_work_sync(&cnx->statemachine_wq);
}

static void veth_destroy_connection(struct veth_lpar_connection *cnx)
@@ -1653,15 +1644,14 @@ static void __exit veth_module_cleanup(void)
	/* Disconnect our "irq" to stop events coming from the Hypervisor. */
	HvLpEvent_unregisterHandler(HvLpEvent_Type_VirtualLan);

	/* Make sure any work queued from Hypervisor callbacks is finished. */
	flush_scheduled_work();

	for (i = 0; i < HVMAXARCHITECTEDLPS; ++i) {
		cnx = veth_cnx[i];

		if (!cnx)
			continue;

		/* Cancel work queued from Hypervisor callbacks */
		cancel_delayed_work_sync(&cnx->statemachine_wq);
		/* Remove the connection from sysfs */
		kobject_del(&cnx->kobject);
		/* Drop the driver's reference to the connection */