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

Commit 2ddbcea7 authored by David S. Miller's avatar David S. Miller
Browse files

Merge branch 'xen-netback-fixes'



Paul Durrant says:

====================
xen-netback: update memory leak fix to avoid BUG

Commit 9a6cdf52 "xen-netback: fix memory leaks on XenBus disconnect"
added missing code to fix a memory leak by calling vfree() in the
appropriate place.
Unfortunately subsequent commit f16f1df6 "xen-netback: protect
resource cleaning on XenBus disconnect" then wrapped this call to vfree()
in a spin lock, leading to a BUG due to incorrect context.

Patch #1 makes the existing code more readable
Patch #2 fixes the problem
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents f7bb3d86 a254d8f9
Loading
Loading
Loading
Loading
+19 −12
Original line number Diff line number Diff line
@@ -492,24 +492,31 @@ static int backend_create_xenvif(struct backend_info *be)

static void backend_disconnect(struct backend_info *be)
{
	if (be->vif) {
	struct xenvif *vif = be->vif;

	if (vif) {
		unsigned int queue_index;
		struct xenvif_queue *queues;

		xen_unregister_watchers(be->vif);
		xen_unregister_watchers(vif);
#ifdef CONFIG_DEBUG_FS
		xenvif_debugfs_delif(be->vif);
		xenvif_debugfs_delif(vif);
#endif /* CONFIG_DEBUG_FS */
		xenvif_disconnect_data(be->vif);
		for (queue_index = 0; queue_index < be->vif->num_queues; ++queue_index)
			xenvif_deinit_queue(&be->vif->queues[queue_index]);
		xenvif_disconnect_data(vif);
		for (queue_index = 0;
		     queue_index < vif->num_queues;
		     ++queue_index)
			xenvif_deinit_queue(&vif->queues[queue_index]);

		spin_lock(&be->vif->lock);
		vfree(be->vif->queues);
		be->vif->num_queues = 0;
		be->vif->queues = NULL;
		spin_unlock(&be->vif->lock);
		spin_lock(&vif->lock);
		queues = vif->queues;
		vif->num_queues = 0;
		vif->queues = NULL;
		spin_unlock(&vif->lock);

		xenvif_disconnect_ctrl(be->vif);
		vfree(queues);

		xenvif_disconnect_ctrl(vif);
	}
}