Commit 0f5e44ca authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

Staging: hv: make gVmbusConnection.ChannelLock a real spinlock

Don't use the wrapper functions for this lock, make it a real
lock so that we know what is going on.

I don't think we really want to be doing a irqsave for this code, but I
left it alone to preserve the original codepath.  It should be reviewed
later.

Cc: Hank Janssen <hjanssen@microsoft.com>
Cc: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent dd0813b6
...@@ -686,6 +686,7 @@ VmbusChannelClose( ...@@ -686,6 +686,7 @@ VmbusChannelClose(
int ret=0; int ret=0;
VMBUS_CHANNEL_CLOSE_CHANNEL* msg; VMBUS_CHANNEL_CLOSE_CHANNEL* msg;
VMBUS_CHANNEL_MSGINFO* info; VMBUS_CHANNEL_MSGINFO* info;
unsigned long flags;
DPRINT_ENTER(VMBUS); DPRINT_ENTER(VMBUS);
...@@ -729,9 +730,9 @@ VmbusChannelClose( ...@@ -729,9 +730,9 @@ VmbusChannelClose(
// since the caller will free the channel // since the caller will free the channel
if (Channel->State == CHANNEL_OPEN_STATE) if (Channel->State == CHANNEL_OPEN_STATE)
{ {
SpinlockAcquire(gVmbusConnection.ChannelLock); spin_lock_irqsave(&gVmbusConnection.channel_lock, flags);
REMOVE_ENTRY_LIST(&Channel->ListEntry); REMOVE_ENTRY_LIST(&Channel->ListEntry);
SpinlockRelease(gVmbusConnection.ChannelLock); spin_unlock_irqrestore(&gVmbusConnection.channel_lock, flags);
FreeVmbusChannel(Channel); FreeVmbusChannel(Channel);
} }
......
...@@ -233,11 +233,12 @@ VmbusChannelProcessOffer( ...@@ -233,11 +233,12 @@ VmbusChannelProcessOffer(
LIST_ENTRY* curr; LIST_ENTRY* curr;
bool fNew = true; bool fNew = true;
VMBUS_CHANNEL* channel; VMBUS_CHANNEL* channel;
unsigned long flags;
DPRINT_ENTER(VMBUS); DPRINT_ENTER(VMBUS);
// Make sure this is a new offer // Make sure this is a new offer
SpinlockAcquire(gVmbusConnection.ChannelLock); spin_lock_irqsave(&gVmbusConnection.channel_lock, flags);
ITERATE_LIST_ENTRIES(anchor, curr, &gVmbusConnection.ChannelList) ITERATE_LIST_ENTRIES(anchor, curr, &gVmbusConnection.ChannelList)
{ {
...@@ -255,7 +256,7 @@ VmbusChannelProcessOffer( ...@@ -255,7 +256,7 @@ VmbusChannelProcessOffer(
{ {
INSERT_TAIL_LIST(&gVmbusConnection.ChannelList, &newChannel->ListEntry); INSERT_TAIL_LIST(&gVmbusConnection.ChannelList, &newChannel->ListEntry);
} }
SpinlockRelease(gVmbusConnection.ChannelLock); spin_unlock_irqrestore(&gVmbusConnection.channel_lock, flags);
if (!fNew) if (!fNew)
{ {
...@@ -282,9 +283,9 @@ VmbusChannelProcessOffer( ...@@ -282,9 +283,9 @@ VmbusChannelProcessOffer(
DPRINT_ERR(VMBUS, "unable to add child device object (relid %d)", DPRINT_ERR(VMBUS, "unable to add child device object (relid %d)",
newChannel->OfferMsg.ChildRelId); newChannel->OfferMsg.ChildRelId);
SpinlockAcquire(gVmbusConnection.ChannelLock); spin_lock_irqsave(&gVmbusConnection.channel_lock, flags);
REMOVE_ENTRY_LIST(&newChannel->ListEntry); REMOVE_ENTRY_LIST(&newChannel->ListEntry);
SpinlockRelease(gVmbusConnection.ChannelLock); spin_unlock_irqrestore(&gVmbusConnection.channel_lock, flags);
FreeVmbusChannel(newChannel); FreeVmbusChannel(newChannel);
} }
...@@ -785,8 +786,9 @@ VmbusChannelReleaseUnattachedChannels( ...@@ -785,8 +786,9 @@ VmbusChannelReleaseUnattachedChannels(
LIST_ENTRY *entry; LIST_ENTRY *entry;
VMBUS_CHANNEL *channel; VMBUS_CHANNEL *channel;
VMBUS_CHANNEL *start=NULL; VMBUS_CHANNEL *start=NULL;
unsigned long flags;
SpinlockAcquire(gVmbusConnection.ChannelLock); spin_lock_irqsave(&gVmbusConnection.channel_lock, flags);
while (!IsListEmpty(&gVmbusConnection.ChannelList)) while (!IsListEmpty(&gVmbusConnection.ChannelList))
{ {
...@@ -813,7 +815,7 @@ VmbusChannelReleaseUnattachedChannels( ...@@ -813,7 +815,7 @@ VmbusChannelReleaseUnattachedChannels(
} }
} }
SpinlockRelease(gVmbusConnection.ChannelLock); spin_unlock_irqrestore(&gVmbusConnection.channel_lock, flags);
} }
// eof // eof
......
...@@ -69,7 +69,7 @@ VmbusConnect( ...@@ -69,7 +69,7 @@ VmbusConnect(
spin_lock_init(&gVmbusConnection.channelmsg_lock); spin_lock_init(&gVmbusConnection.channelmsg_lock);
INITIALIZE_LIST_HEAD(&gVmbusConnection.ChannelList); INITIALIZE_LIST_HEAD(&gVmbusConnection.ChannelList);
gVmbusConnection.ChannelLock = SpinlockCreate(); spin_lock_init(&gVmbusConnection.channel_lock);
// Setup the vmbus event connection for channel interrupt abstraction stuff // Setup the vmbus event connection for channel interrupt abstraction stuff
gVmbusConnection.InterruptPage = PageAlloc(1); gVmbusConnection.InterruptPage = PageAlloc(1);
...@@ -156,7 +156,6 @@ Cleanup: ...@@ -156,7 +156,6 @@ Cleanup:
gVmbusConnection.ConnectState = Disconnected; gVmbusConnection.ConnectState = Disconnected;
WorkQueueClose(gVmbusConnection.WorkQueue); WorkQueueClose(gVmbusConnection.WorkQueue);
SpinlockClose(gVmbusConnection.ChannelLock);
if (gVmbusConnection.InterruptPage) if (gVmbusConnection.InterruptPage)
{ {
...@@ -258,8 +257,9 @@ GetChannelFromRelId( ...@@ -258,8 +257,9 @@ GetChannelFromRelId(
VMBUS_CHANNEL* foundChannel=NULL; VMBUS_CHANNEL* foundChannel=NULL;
LIST_ENTRY* anchor; LIST_ENTRY* anchor;
LIST_ENTRY* curr; LIST_ENTRY* curr;
unsigned long flags;
SpinlockAcquire(gVmbusConnection.ChannelLock); spin_lock_irqsave(&gVmbusConnection.channel_lock, flags);
ITERATE_LIST_ENTRIES(anchor, curr, &gVmbusConnection.ChannelList) ITERATE_LIST_ENTRIES(anchor, curr, &gVmbusConnection.ChannelList)
{ {
channel = CONTAINING_RECORD(curr, VMBUS_CHANNEL, ListEntry); channel = CONTAINING_RECORD(curr, VMBUS_CHANNEL, ListEntry);
...@@ -270,7 +270,7 @@ GetChannelFromRelId( ...@@ -270,7 +270,7 @@ GetChannelFromRelId(
break; break;
} }
} }
SpinlockRelease(gVmbusConnection.ChannelLock); spin_unlock_irqrestore(&gVmbusConnection.channel_lock, flags);
return foundChannel; return foundChannel;
} }
......
...@@ -84,7 +84,7 @@ typedef struct _VMBUS_CONNECTION { ...@@ -84,7 +84,7 @@ typedef struct _VMBUS_CONNECTION {
// List of channels // List of channels
LIST_ENTRY ChannelList; LIST_ENTRY ChannelList;
HANDLE ChannelLock; spinlock_t channel_lock;
HANDLE WorkQueue; HANDLE WorkQueue;
} VMBUS_CONNECTION; } VMBUS_CONNECTION;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment