All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH V3 7/7] Drivers: hv: vmbus: disable local interrupt when hvsock's callback is running
@ 2015-07-21 10:58 Dexuan Cui
  0 siblings, 0 replies; only message in thread
From: Dexuan Cui @ 2015-07-21 10:58 UTC (permalink / raw)
  To: gregkh, davem, stephen, netdev, linux-kernel, driverdev-devel,
	olaf, apw, jasowang, kys, pebolle, stefanha

In the SMP guest case, when the per-channel callback hvsock_events() is
running on virtual CPU A, if the guest tries to close the connection on
virtual CPU B: we invoke vmbus_close() -> vmbus_close_internal(),
then we can have trouble: on B, vmbus_close_internal() will send IPI
reset_channel_cb() to A, trying to set channel->onchannel_callbackto NULL;
on A, if the IPI handler happens between
"if (channel->onchannel_callback != NULL)" and invoking
channel->onchannel_callback, we'll invoke a function pointer of NULL.

This is why the patch is necessary.

Signed-off-by: Dexuan Cui <decui@microsoft.com>
---
 drivers/hv/connection.c | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/drivers/hv/connection.c b/drivers/hv/connection.c
index 4fc2e88..4766fd8 100644
--- a/drivers/hv/connection.c
+++ b/drivers/hv/connection.c
@@ -319,6 +319,9 @@ static void process_chn_event(u32 relid)
 	void *arg;
 	bool read_state;
 	u32 bytes_to_read;
+	bool is_hvsock = false;
+
+	local_irq_disable();
 
 	/*
 	 * Find the channel based on this relid and invokes the
@@ -327,7 +330,11 @@ static void process_chn_event(u32 relid)
 	channel = pcpu_relid2channel(relid);
 
 	if (!channel)
-		return;
+		goto out;
+
+	is_hvsock = is_hvsock_channel(channel);
+	if (!is_hvsock)
+		local_irq_enable();
 
 	/*
 	 * A channel once created is persistent even when there
@@ -363,6 +370,12 @@ static void process_chn_event(u32 relid)
 				bytes_to_read = 0;
 		} while (read_state && (bytes_to_read != 0));
 	}
+
+	/* local_irq_enable() is alredy invoked above */
+	if (!is_hvsock)
+		return;
+out:
+	local_irq_enable();
 }
 
 /*
-- 
2.1.0


^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2015-07-21  9:34 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-07-21 10:58 [PATCH V3 7/7] Drivers: hv: vmbus: disable local interrupt when hvsock's callback is running Dexuan Cui

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.