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: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
@@ -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(
|
|||||||
// 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(
|
|||||||
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(
|
|||||||
{
|
{
|
||||||
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(
|
|||||||
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(
|
|||||||
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(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SpinlockRelease(gVmbusConnection.ChannelLock);
|
spin_unlock_irqrestore(&gVmbusConnection.channel_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
// eof
|
// eof
|
||||||
|
@@ -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:
|
|||||||
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(
|
|||||||
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(
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SpinlockRelease(gVmbusConnection.ChannelLock);
|
spin_unlock_irqrestore(&gVmbusConnection.channel_lock, flags);
|
||||||
|
|
||||||
return foundChannel;
|
return foundChannel;
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user