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: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
@@ -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(
|
|||||||
RING_BUFFER_INFO* RingInfo
|
RING_BUFFER_INFO* RingInfo
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
SpinlockClose(RingInfo->RingLock);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
@@ -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(
|
|||||||
|
|
||||||
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(
|
|||||||
{
|
{
|
||||||
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(
|
|||||||
|
|
||||||
//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(
|
|||||||
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(
|
|||||||
{
|
{
|
||||||
//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(
|
|||||||
BufferLen,
|
BufferLen,
|
||||||
nextReadLocation);
|
nextReadLocation);
|
||||||
|
|
||||||
SpinlockRelease(InRingInfo->RingLock);
|
spin_unlock_irqrestore(&InRingInfo->ring_lock, flags);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -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(
|
|||||||
{
|
{
|
||||||
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(
|
|||||||
|
|
||||||
//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 {
|
|||||||
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;
|
||||||
|
Reference in New Issue
Block a user