diff options
author | Greg Kroah-Hartman <gregkh@suse.de> | 2009-07-15 14:55:29 -0700 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2009-09-15 12:01:48 -0700 |
commit | 880fb89c1f23c17de6c964dca7943d2f76a8e17c (patch) | |
tree | ebb7676772fc33ad14952754470fc3c85f392d8e | |
parent | a98f96eed5fa16f4868b4af2d50af77f57a1b231 (diff) | |
download | op-kernel-dev-880fb89c1f23c17de6c964dca7943d2f76a8e17c.zip op-kernel-dev-880fb89c1f23c17de6c964dca7943d2f76a8e17c.tar.gz |
Staging: hv: make Device->RequestLock 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>
-rw-r--r-- | drivers/staging/hv/RndisFilter.c | 26 |
1 files changed, 12 insertions, 14 deletions
diff --git a/drivers/staging/hv/RndisFilter.c b/drivers/staging/hv/RndisFilter.c index bc5557a..9f462b9 100644 --- a/drivers/staging/hv/RndisFilter.c +++ b/drivers/staging/hv/RndisFilter.c @@ -54,7 +54,7 @@ typedef struct _RNDIS_DEVICE { u32 LinkStatus; u32 NewRequestId; - HANDLE RequestLock; + spinlock_t request_lock; LIST_ENTRY RequestList; unsigned char HwMacAddr[HW_MACADDR_LEN]; @@ -216,12 +216,7 @@ static inline RNDIS_DEVICE* GetRndisDevice(void) return NULL; } - device->RequestLock = SpinlockCreate(); - if (!device->RequestLock) - { - kfree(device); - return NULL; - } + spin_lock_init(&device->request_lock); INITIALIZE_LIST_HEAD(&device->RequestList); @@ -232,7 +227,6 @@ static inline RNDIS_DEVICE* GetRndisDevice(void) static inline void PutRndisDevice(RNDIS_DEVICE *Device) { - SpinlockClose(Device->RequestLock); kfree(Device); } @@ -241,6 +235,7 @@ static inline RNDIS_REQUEST* GetRndisRequest(RNDIS_DEVICE *Device, u32 MessageTy RNDIS_REQUEST *request; RNDIS_MESSAGE *rndisMessage; RNDIS_SET_REQUEST *set; + unsigned long flags; request = kzalloc(sizeof(RNDIS_REQUEST), GFP_KERNEL); if (!request) @@ -265,18 +260,20 @@ static inline RNDIS_REQUEST* GetRndisRequest(RNDIS_DEVICE *Device, u32 MessageTy set->RequestId = InterlockedIncrement((int*)&Device->NewRequestId); // Add to the request list - SpinlockAcquire(Device->RequestLock); + spin_lock_irqsave(&Device->request_lock, flags); INSERT_TAIL_LIST(&Device->RequestList, &request->ListEntry); - SpinlockRelease(Device->RequestLock); + spin_unlock_irqrestore(&Device->request_lock, flags); return request; } static inline void PutRndisRequest(RNDIS_DEVICE *Device, RNDIS_REQUEST *Request) { - SpinlockAcquire(Device->RequestLock); + unsigned long flags; + + spin_lock_irqsave(&Device->request_lock, flags); REMOVE_ENTRY_LIST(&Request->ListEntry); - SpinlockRelease(Device->RequestLock); + spin_unlock_irqrestore(&Device->request_lock, flags); WaitEventClose(Request->WaitEvent); kfree(Request); @@ -385,10 +382,11 @@ RndisFilterReceiveResponse( LIST_ENTRY *curr; RNDIS_REQUEST *request=NULL; bool found = false; + unsigned long flags; DPRINT_ENTER(NETVSC); - SpinlockAcquire(Device->RequestLock); + spin_lock_irqsave(&Device->request_lock, flags); ITERATE_LIST_ENTRIES(anchor, curr, &Device->RequestList) { request = CONTAINING_RECORD(curr, RNDIS_REQUEST, ListEntry); @@ -403,7 +401,7 @@ RndisFilterReceiveResponse( break; } } - SpinlockRelease(Device->RequestLock); + spin_unlock_irqrestore(&Device->request_lock, flags); if (found) { |