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: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
8c69f52ab3
commit
54411c425f
|
@ -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(
|
||||||
|
|
||||||
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(
|
||||||
// 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(
|
||||||
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(
|
||||||
|
|
||||||
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(
|
||||||
// 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)
|
||||||
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)
|
||||||
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 @@ Description:
|
||||||
--*/
|
--*/
|
||||||
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 {
|
||||||
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
|
||||||
|
|
Loading…
Reference in New Issue