summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorGreg Kroah-Hartman2009-07-15 23:57:16 +0200
committerGreg Kroah-Hartman2009-09-15 21:01:48 +0200
commit0f5e44ca6e777660af6b0eb44d4787563932eda8 (patch)
tree63e1c8598cc093682747da8587292a638a44e68e /drivers
parentStaging: hv: make gVmbusConnection.ChannelMsgLock a real spinlock (diff)
downloadkernel-qcow2-linux-0f5e44ca6e777660af6b0eb44d4787563932eda8.tar.gz
kernel-qcow2-linux-0f5e44ca6e777660af6b0eb44d4787563932eda8.tar.xz
kernel-qcow2-linux-0f5e44ca6e777660af6b0eb44d4787563932eda8.zip
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>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/staging/hv/Channel.c5
-rw-r--r--drivers/staging/hv/ChannelMgmt.c14
-rw-r--r--drivers/staging/hv/Connection.c8
-rw-r--r--drivers/staging/hv/VmbusPrivate.h2
4 files changed, 16 insertions, 13 deletions
diff --git a/drivers/staging/hv/Channel.c b/drivers/staging/hv/Channel.c
index 3f48ac7cd11f..196c7a6e549e 100644
--- a/drivers/staging/hv/Channel.c
+++ b/drivers/staging/hv/Channel.c
@@ -686,6 +686,7 @@ VmbusChannelClose(
int ret=0;
VMBUS_CHANNEL_CLOSE_CHANNEL* msg;
VMBUS_CHANNEL_MSGINFO* info;
+ unsigned long flags;
DPRINT_ENTER(VMBUS);
@@ -729,9 +730,9 @@ VmbusChannelClose(
// since the caller will free the channel
if (Channel->State == CHANNEL_OPEN_STATE)
{
- SpinlockAcquire(gVmbusConnection.ChannelLock);
+ spin_lock_irqsave(&gVmbusConnection.channel_lock, flags);
REMOVE_ENTRY_LIST(&Channel->ListEntry);
- SpinlockRelease(gVmbusConnection.ChannelLock);
+ spin_unlock_irqrestore(&gVmbusConnection.channel_lock, flags);
FreeVmbusChannel(Channel);
}
diff --git a/drivers/staging/hv/ChannelMgmt.c b/drivers/staging/hv/ChannelMgmt.c
index ddc7918eca3c..00b4ace27e0d 100644
--- a/drivers/staging/hv/ChannelMgmt.c
+++ b/drivers/staging/hv/ChannelMgmt.c
@@ -233,11 +233,12 @@ VmbusChannelProcessOffer(
LIST_ENTRY* curr;
bool fNew = true;
VMBUS_CHANNEL* channel;
+ unsigned long flags;
DPRINT_ENTER(VMBUS);
// Make sure this is a new offer
- SpinlockAcquire(gVmbusConnection.ChannelLock);
+ spin_lock_irqsave(&gVmbusConnection.channel_lock, flags);
ITERATE_LIST_ENTRIES(anchor, curr, &gVmbusConnection.ChannelList)
{
@@ -255,7 +256,7 @@ VmbusChannelProcessOffer(
{
INSERT_TAIL_LIST(&gVmbusConnection.ChannelList, &newChannel->ListEntry);
}
- SpinlockRelease(gVmbusConnection.ChannelLock);
+ spin_unlock_irqrestore(&gVmbusConnection.channel_lock, flags);
if (!fNew)
{
@@ -282,9 +283,9 @@ VmbusChannelProcessOffer(
DPRINT_ERR(VMBUS, "unable to add child device object (relid %d)",
newChannel->OfferMsg.ChildRelId);
- SpinlockAcquire(gVmbusConnection.ChannelLock);
+ spin_lock_irqsave(&gVmbusConnection.channel_lock, flags);
REMOVE_ENTRY_LIST(&newChannel->ListEntry);
- SpinlockRelease(gVmbusConnection.ChannelLock);
+ spin_unlock_irqrestore(&gVmbusConnection.channel_lock, flags);
FreeVmbusChannel(newChannel);
}
@@ -785,8 +786,9 @@ VmbusChannelReleaseUnattachedChannels(
LIST_ENTRY *entry;
VMBUS_CHANNEL *channel;
VMBUS_CHANNEL *start=NULL;
+ unsigned long flags;
- SpinlockAcquire(gVmbusConnection.ChannelLock);
+ spin_lock_irqsave(&gVmbusConnection.channel_lock, flags);
while (!IsListEmpty(&gVmbusConnection.ChannelList))
{
@@ -813,7 +815,7 @@ VmbusChannelReleaseUnattachedChannels(
}
}
- SpinlockRelease(gVmbusConnection.ChannelLock);
+ spin_unlock_irqrestore(&gVmbusConnection.channel_lock, flags);
}
// eof
diff --git a/drivers/staging/hv/Connection.c b/drivers/staging/hv/Connection.c
index 13e164d1453e..78889bdda931 100644
--- a/drivers/staging/hv/Connection.c
+++ b/drivers/staging/hv/Connection.c
@@ -69,7 +69,7 @@ VmbusConnect(
spin_lock_init(&gVmbusConnection.channelmsg_lock);
INITIALIZE_LIST_HEAD(&gVmbusConnection.ChannelList);
- gVmbusConnection.ChannelLock = SpinlockCreate();
+ spin_lock_init(&gVmbusConnection.channel_lock);
// Setup the vmbus event connection for channel interrupt abstraction stuff
gVmbusConnection.InterruptPage = PageAlloc(1);
@@ -156,7 +156,6 @@ Cleanup:
gVmbusConnection.ConnectState = Disconnected;
WorkQueueClose(gVmbusConnection.WorkQueue);
- SpinlockClose(gVmbusConnection.ChannelLock);
if (gVmbusConnection.InterruptPage)
{
@@ -258,8 +257,9 @@ GetChannelFromRelId(
VMBUS_CHANNEL* foundChannel=NULL;
LIST_ENTRY* anchor;
LIST_ENTRY* curr;
+ unsigned long flags;
- SpinlockAcquire(gVmbusConnection.ChannelLock);
+ spin_lock_irqsave(&gVmbusConnection.channel_lock, flags);
ITERATE_LIST_ENTRIES(anchor, curr, &gVmbusConnection.ChannelList)
{
channel = CONTAINING_RECORD(curr, VMBUS_CHANNEL, ListEntry);
@@ -270,7 +270,7 @@ GetChannelFromRelId(
break;
}
}
- SpinlockRelease(gVmbusConnection.ChannelLock);
+ spin_unlock_irqrestore(&gVmbusConnection.channel_lock, flags);
return foundChannel;
}
diff --git a/drivers/staging/hv/VmbusPrivate.h b/drivers/staging/hv/VmbusPrivate.h
index eb8fc8f24a74..686d05f21ed8 100644
--- a/drivers/staging/hv/VmbusPrivate.h
+++ b/drivers/staging/hv/VmbusPrivate.h
@@ -84,7 +84,7 @@ typedef struct _VMBUS_CONNECTION {
// List of channels
LIST_ENTRY ChannelList;
- HANDLE ChannelLock;
+ spinlock_t channel_lock;
HANDLE WorkQueue;
} VMBUS_CONNECTION;