Commit 54411c42 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

Staging: hv: make Channel->InboundLock 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 8c69f52a
...@@ -991,18 +991,19 @@ VmbusChannelRecvPacket( ...@@ -991,18 +991,19 @@ VmbusChannelRecvPacket(
u32 packetLen; u32 packetLen;
u32 userLen; u32 userLen;
int ret; int ret;
unsigned long flags;
DPRINT_ENTER(VMBUS); DPRINT_ENTER(VMBUS);
*BufferActualLen = 0; *BufferActualLen = 0;
*RequestId = 0; *RequestId = 0;
SpinlockAcquire(Channel->InboundLock); spin_lock_irqsave(&Channel->inbound_lock, flags);
ret = RingBufferPeek(&Channel->Inbound, &desc, sizeof(VMPACKET_DESCRIPTOR)); ret = RingBufferPeek(&Channel->Inbound, &desc, sizeof(VMPACKET_DESCRIPTOR));
if (ret != 0) if (ret != 0)
{ {
SpinlockRelease(Channel->InboundLock); spin_unlock_irqrestore(&Channel->inbound_lock, flags);
//DPRINT_DBG(VMBUS, "nothing to read!!"); //DPRINT_DBG(VMBUS, "nothing to read!!");
DPRINT_EXIT(VMBUS); DPRINT_EXIT(VMBUS);
...@@ -1026,7 +1027,7 @@ VmbusChannelRecvPacket( ...@@ -1026,7 +1027,7 @@ VmbusChannelRecvPacket(
if (userLen > BufferLen) if (userLen > BufferLen)
{ {
SpinlockRelease(Channel->InboundLock); spin_unlock_irqrestore(&Channel->inbound_lock, flags);
DPRINT_ERR(VMBUS, "buffer too small - got %d needs %d", BufferLen, userLen); DPRINT_ERR(VMBUS, "buffer too small - got %d needs %d", BufferLen, userLen);
DPRINT_EXIT(VMBUS); DPRINT_EXIT(VMBUS);
...@@ -1039,7 +1040,7 @@ VmbusChannelRecvPacket( ...@@ -1039,7 +1040,7 @@ VmbusChannelRecvPacket(
// Copy over the packet to the user buffer // Copy over the packet to the user buffer
ret = RingBufferRead(&Channel->Inbound, Buffer, userLen, (desc.DataOffset8 << 3)); ret = RingBufferRead(&Channel->Inbound, Buffer, userLen, (desc.DataOffset8 << 3));
SpinlockRelease(Channel->InboundLock); spin_unlock_irqrestore(&Channel->inbound_lock, flags);
DPRINT_EXIT(VMBUS); DPRINT_EXIT(VMBUS);
...@@ -1068,18 +1069,19 @@ VmbusChannelRecvPacketRaw( ...@@ -1068,18 +1069,19 @@ VmbusChannelRecvPacketRaw(
u32 packetLen; u32 packetLen;
u32 userLen; u32 userLen;
int ret; int ret;
unsigned long flags;
DPRINT_ENTER(VMBUS); DPRINT_ENTER(VMBUS);
*BufferActualLen = 0; *BufferActualLen = 0;
*RequestId = 0; *RequestId = 0;
SpinlockAcquire(Channel->InboundLock); spin_lock_irqsave(&Channel->inbound_lock, flags);
ret = RingBufferPeek(&Channel->Inbound, &desc, sizeof(VMPACKET_DESCRIPTOR)); ret = RingBufferPeek(&Channel->Inbound, &desc, sizeof(VMPACKET_DESCRIPTOR));
if (ret != 0) if (ret != 0)
{ {
SpinlockRelease(Channel->InboundLock); spin_unlock_irqrestore(&Channel->inbound_lock, flags);
//DPRINT_DBG(VMBUS, "nothing to read!!"); //DPRINT_DBG(VMBUS, "nothing to read!!");
DPRINT_EXIT(VMBUS); DPRINT_EXIT(VMBUS);
...@@ -1102,7 +1104,7 @@ VmbusChannelRecvPacketRaw( ...@@ -1102,7 +1104,7 @@ VmbusChannelRecvPacketRaw(
if (packetLen > BufferLen) if (packetLen > BufferLen)
{ {
SpinlockRelease(Channel->InboundLock); spin_unlock_irqrestore(&Channel->inbound_lock, flags);
DPRINT_ERR(VMBUS, "buffer too small - needed %d bytes but got space for only %d bytes", packetLen, BufferLen); DPRINT_ERR(VMBUS, "buffer too small - needed %d bytes but got space for only %d bytes", packetLen, BufferLen);
DPRINT_EXIT(VMBUS); DPRINT_EXIT(VMBUS);
...@@ -1114,7 +1116,7 @@ VmbusChannelRecvPacketRaw( ...@@ -1114,7 +1116,7 @@ VmbusChannelRecvPacketRaw(
// Copy over the entire packet to the user buffer // Copy over the entire packet to the user buffer
ret = RingBufferRead(&Channel->Inbound, Buffer, packetLen, 0); ret = RingBufferRead(&Channel->Inbound, Buffer, packetLen, 0);
SpinlockRelease(Channel->InboundLock); spin_unlock_irqrestore(&Channel->inbound_lock, flags);
DPRINT_EXIT(VMBUS); DPRINT_EXIT(VMBUS);
......
...@@ -149,17 +149,11 @@ VMBUS_CHANNEL* AllocVmbusChannel(void) ...@@ -149,17 +149,11 @@ VMBUS_CHANNEL* AllocVmbusChannel(void)
return NULL; return NULL;
} }
channel->InboundLock = SpinlockCreate(); spin_lock_init(&channel->inbound_lock);
if (!channel->InboundLock)
{
kfree(channel);
return NULL;
}
channel->PollTimer = TimerCreate(VmbusChannelOnTimer, channel); channel->PollTimer = TimerCreate(VmbusChannelOnTimer, channel);
if (!channel->PollTimer) if (!channel->PollTimer)
{ {
SpinlockClose(channel->InboundLock);
kfree(channel); kfree(channel);
return NULL; return NULL;
} }
...@@ -169,7 +163,6 @@ VMBUS_CHANNEL* AllocVmbusChannel(void) ...@@ -169,7 +163,6 @@ VMBUS_CHANNEL* AllocVmbusChannel(void)
if (!channel->ControlWQ) if (!channel->ControlWQ)
{ {
TimerClose(channel->PollTimer); TimerClose(channel->PollTimer);
SpinlockClose(channel->InboundLock);
kfree(channel); kfree(channel);
return NULL; return NULL;
} }
...@@ -212,7 +205,6 @@ static inline void ReleaseVmbusChannel(void* Context) ...@@ -212,7 +205,6 @@ static inline void ReleaseVmbusChannel(void* Context)
--*/ --*/
void FreeVmbusChannel(VMBUS_CHANNEL* Channel) void FreeVmbusChannel(VMBUS_CHANNEL* Channel)
{ {
SpinlockClose(Channel->InboundLock);
TimerClose(Channel->PollTimer); TimerClose(Channel->PollTimer);
// We have to release the channel's workqueue/thread in the vmbus's workqueue/thread context // We have to release the channel's workqueue/thread in the vmbus's workqueue/thread context
......
...@@ -63,7 +63,7 @@ typedef struct _VMBUS_CHANNEL { ...@@ -63,7 +63,7 @@ typedef struct _VMBUS_CHANNEL {
u32 RingBufferPageCount; u32 RingBufferPageCount;
RING_BUFFER_INFO Outbound; // send to parent RING_BUFFER_INFO Outbound; // send to parent
RING_BUFFER_INFO Inbound; // receive from parent RING_BUFFER_INFO Inbound; // receive from parent
HANDLE InboundLock; spinlock_t inbound_lock;
HANDLE ControlWQ; HANDLE ControlWQ;
// Channel callback are invoked in this workqueue context // Channel callback are invoked in this workqueue context
......
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