Commit a98f96ee authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

Staging: hv: make RingInfo->RingLock 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 54411c42
...@@ -315,7 +315,7 @@ RingBufferInit( ...@@ -315,7 +315,7 @@ RingBufferInit(
RingInfo->RingSize = BufferLen; RingInfo->RingSize = BufferLen;
RingInfo->RingDataSize = BufferLen - sizeof(RING_BUFFER); RingInfo->RingDataSize = BufferLen - sizeof(RING_BUFFER);
RingInfo->RingLock = SpinlockCreate(); spin_lock_init(&RingInfo->ring_lock);
return 0; return 0;
} }
...@@ -334,7 +334,6 @@ RingBufferCleanup( ...@@ -334,7 +334,6 @@ RingBufferCleanup(
RING_BUFFER_INFO* RingInfo RING_BUFFER_INFO* RingInfo
) )
{ {
SpinlockClose(RingInfo->RingLock);
} }
/*++ /*++
...@@ -360,6 +359,7 @@ RingBufferWrite( ...@@ -360,6 +359,7 @@ RingBufferWrite(
volatile u32 nextWriteLocation; volatile u32 nextWriteLocation;
u64 prevIndices=0; u64 prevIndices=0;
unsigned long flags;
DPRINT_ENTER(VMBUS); DPRINT_ENTER(VMBUS);
...@@ -370,7 +370,7 @@ RingBufferWrite( ...@@ -370,7 +370,7 @@ RingBufferWrite(
totalBytesToWrite += sizeof(u64); totalBytesToWrite += sizeof(u64);
SpinlockAcquire(OutRingInfo->RingLock); spin_lock_irqsave(&OutRingInfo->ring_lock, flags);
GetRingBufferAvailBytes(OutRingInfo, &byteAvailToRead, &byteAvailToWrite); GetRingBufferAvailBytes(OutRingInfo, &byteAvailToRead, &byteAvailToWrite);
...@@ -384,7 +384,7 @@ RingBufferWrite( ...@@ -384,7 +384,7 @@ RingBufferWrite(
{ {
DPRINT_DBG(VMBUS, "No more space left on outbound ring buffer (needed %u, avail %u)", totalBytesToWrite, byteAvailToWrite); DPRINT_DBG(VMBUS, "No more space left on outbound ring buffer (needed %u, avail %u)", totalBytesToWrite, byteAvailToWrite);
SpinlockRelease(OutRingInfo->RingLock); spin_unlock_irqrestore(&OutRingInfo->ring_lock, flags);
DPRINT_EXIT(VMBUS); DPRINT_EXIT(VMBUS);
...@@ -418,7 +418,7 @@ RingBufferWrite( ...@@ -418,7 +418,7 @@ RingBufferWrite(
//DumpRingInfo(OutRingInfo, "AFTER "); //DumpRingInfo(OutRingInfo, "AFTER ");
SpinlockRelease(OutRingInfo->RingLock); spin_unlock_irqrestore(&OutRingInfo->ring_lock, flags);
DPRINT_EXIT(VMBUS); DPRINT_EXIT(VMBUS);
...@@ -445,8 +445,9 @@ RingBufferPeek( ...@@ -445,8 +445,9 @@ RingBufferPeek(
u32 bytesAvailToWrite; u32 bytesAvailToWrite;
u32 bytesAvailToRead; u32 bytesAvailToRead;
u32 nextReadLocation=0; u32 nextReadLocation=0;
unsigned long flags;
SpinlockAcquire(InRingInfo->RingLock); spin_lock_irqsave(&InRingInfo->ring_lock, flags);
GetRingBufferAvailBytes(InRingInfo, &bytesAvailToRead, &bytesAvailToWrite); GetRingBufferAvailBytes(InRingInfo, &bytesAvailToRead, &bytesAvailToWrite);
...@@ -455,7 +456,7 @@ RingBufferPeek( ...@@ -455,7 +456,7 @@ RingBufferPeek(
{ {
//DPRINT_DBG(VMBUS, "got callback but not enough to read <avail to read %d read size %d>!!", bytesAvailToRead, BufferLen); //DPRINT_DBG(VMBUS, "got callback but not enough to read <avail to read %d read size %d>!!", bytesAvailToRead, BufferLen);
SpinlockRelease(InRingInfo->RingLock); spin_unlock_irqrestore(&InRingInfo->ring_lock, flags);
return -1; return -1;
} }
...@@ -468,7 +469,7 @@ RingBufferPeek( ...@@ -468,7 +469,7 @@ RingBufferPeek(
BufferLen, BufferLen,
nextReadLocation); nextReadLocation);
SpinlockRelease(InRingInfo->RingLock); spin_unlock_irqrestore(&InRingInfo->ring_lock, flags);
return 0; return 0;
} }
...@@ -495,10 +496,11 @@ RingBufferRead( ...@@ -495,10 +496,11 @@ RingBufferRead(
u32 bytesAvailToRead; u32 bytesAvailToRead;
u32 nextReadLocation=0; u32 nextReadLocation=0;
u64 prevIndices=0; u64 prevIndices=0;
unsigned long flags;
ASSERT(BufferLen > 0); ASSERT(BufferLen > 0);
SpinlockAcquire(InRingInfo->RingLock); spin_lock_irqsave(&InRingInfo->ring_lock, flags);
GetRingBufferAvailBytes(InRingInfo, &bytesAvailToRead, &bytesAvailToWrite); GetRingBufferAvailBytes(InRingInfo, &bytesAvailToRead, &bytesAvailToWrite);
...@@ -511,7 +513,7 @@ RingBufferRead( ...@@ -511,7 +513,7 @@ RingBufferRead(
{ {
DPRINT_DBG(VMBUS, "got callback but not enough to read <avail to read %d read size %d>!!", bytesAvailToRead, BufferLen); DPRINT_DBG(VMBUS, "got callback but not enough to read <avail to read %d read size %d>!!", bytesAvailToRead, BufferLen);
SpinlockRelease(InRingInfo->RingLock); spin_unlock_irqrestore(&InRingInfo->ring_lock, flags);
return -1; return -1;
} }
...@@ -537,7 +539,7 @@ RingBufferRead( ...@@ -537,7 +539,7 @@ RingBufferRead(
//DumpRingInfo(InRingInfo, "AFTER "); //DumpRingInfo(InRingInfo, "AFTER ");
SpinlockRelease(InRingInfo->RingLock); spin_unlock_irqrestore(&InRingInfo->ring_lock, flags);
return 0; return 0;
} }
......
...@@ -48,7 +48,7 @@ typedef struct _RING_BUFFER { ...@@ -48,7 +48,7 @@ typedef struct _RING_BUFFER {
typedef struct _RING_BUFFER_INFO { typedef struct _RING_BUFFER_INFO {
RING_BUFFER* RingBuffer; RING_BUFFER* RingBuffer;
u32 RingSize; // Include the shared header u32 RingSize; // Include the shared header
HANDLE RingLock; spinlock_t ring_lock;
u32 RingDataSize; // < ringSize u32 RingDataSize; // < ringSize
u32 RingDataStartOffset; u32 RingDataStartOffset;
......
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