diff options
author | Greg Kroah-Hartman <gregkh@suse.de> | 2009-07-15 17:55:29 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2009-09-15 15:01:48 -0400 |
commit | 880fb89c1f23c17de6c964dca7943d2f76a8e17c (patch) | |
tree | ebb7676772fc33ad14952754470fc3c85f392d8e /drivers/staging/hv/RndisFilter.c | |
parent | a98f96eed5fa16f4868b4af2d50af77f57a1b231 (diff) |
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>
Diffstat (limited to 'drivers/staging/hv/RndisFilter.c')
-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 bc5557a45c7..9f462b95876 100644 --- a/drivers/staging/hv/RndisFilter.c +++ b/drivers/staging/hv/RndisFilter.c | |||
@@ -54,7 +54,7 @@ typedef struct _RNDIS_DEVICE { | |||
54 | u32 LinkStatus; | 54 | u32 LinkStatus; |
55 | u32 NewRequestId; | 55 | u32 NewRequestId; |
56 | 56 | ||
57 | HANDLE RequestLock; | 57 | spinlock_t request_lock; |
58 | LIST_ENTRY RequestList; | 58 | LIST_ENTRY RequestList; |
59 | 59 | ||
60 | unsigned char HwMacAddr[HW_MACADDR_LEN]; | 60 | unsigned char HwMacAddr[HW_MACADDR_LEN]; |
@@ -216,12 +216,7 @@ static inline RNDIS_DEVICE* GetRndisDevice(void) | |||
216 | return NULL; | 216 | return NULL; |
217 | } | 217 | } |
218 | 218 | ||
219 | device->RequestLock = SpinlockCreate(); | 219 | spin_lock_init(&device->request_lock); |
220 | if (!device->RequestLock) | ||
221 | { | ||
222 | kfree(device); | ||
223 | return NULL; | ||
224 | } | ||
225 | 220 | ||
226 | INITIALIZE_LIST_HEAD(&device->RequestList); | 221 | INITIALIZE_LIST_HEAD(&device->RequestList); |
227 | 222 | ||
@@ -232,7 +227,6 @@ static inline RNDIS_DEVICE* GetRndisDevice(void) | |||
232 | 227 | ||
233 | static inline void PutRndisDevice(RNDIS_DEVICE *Device) | 228 | static inline void PutRndisDevice(RNDIS_DEVICE *Device) |
234 | { | 229 | { |
235 | SpinlockClose(Device->RequestLock); | ||
236 | kfree(Device); | 230 | kfree(Device); |
237 | } | 231 | } |
238 | 232 | ||
@@ -241,6 +235,7 @@ static inline RNDIS_REQUEST* GetRndisRequest(RNDIS_DEVICE *Device, u32 MessageTy | |||
241 | RNDIS_REQUEST *request; | 235 | RNDIS_REQUEST *request; |
242 | RNDIS_MESSAGE *rndisMessage; | 236 | RNDIS_MESSAGE *rndisMessage; |
243 | RNDIS_SET_REQUEST *set; | 237 | RNDIS_SET_REQUEST *set; |
238 | unsigned long flags; | ||
244 | 239 | ||
245 | request = kzalloc(sizeof(RNDIS_REQUEST), GFP_KERNEL); | 240 | request = kzalloc(sizeof(RNDIS_REQUEST), GFP_KERNEL); |
246 | if (!request) | 241 | if (!request) |
@@ -265,18 +260,20 @@ static inline RNDIS_REQUEST* GetRndisRequest(RNDIS_DEVICE *Device, u32 MessageTy | |||
265 | set->RequestId = InterlockedIncrement((int*)&Device->NewRequestId); | 260 | set->RequestId = InterlockedIncrement((int*)&Device->NewRequestId); |
266 | 261 | ||
267 | // Add to the request list | 262 | // Add to the request list |
268 | SpinlockAcquire(Device->RequestLock); | 263 | spin_lock_irqsave(&Device->request_lock, flags); |
269 | INSERT_TAIL_LIST(&Device->RequestList, &request->ListEntry); | 264 | INSERT_TAIL_LIST(&Device->RequestList, &request->ListEntry); |
270 | SpinlockRelease(Device->RequestLock); | 265 | spin_unlock_irqrestore(&Device->request_lock, flags); |
271 | 266 | ||
272 | return request; | 267 | return request; |
273 | } | 268 | } |
274 | 269 | ||
275 | static inline void PutRndisRequest(RNDIS_DEVICE *Device, RNDIS_REQUEST *Request) | 270 | static inline void PutRndisRequest(RNDIS_DEVICE *Device, RNDIS_REQUEST *Request) |
276 | { | 271 | { |
277 | SpinlockAcquire(Device->RequestLock); | 272 | unsigned long flags; |
273 | |||
274 | spin_lock_irqsave(&Device->request_lock, flags); | ||
278 | REMOVE_ENTRY_LIST(&Request->ListEntry); | 275 | REMOVE_ENTRY_LIST(&Request->ListEntry); |
279 | SpinlockRelease(Device->RequestLock); | 276 | spin_unlock_irqrestore(&Device->request_lock, flags); |
280 | 277 | ||
281 | WaitEventClose(Request->WaitEvent); | 278 | WaitEventClose(Request->WaitEvent); |
282 | kfree(Request); | 279 | kfree(Request); |
@@ -385,10 +382,11 @@ RndisFilterReceiveResponse( | |||
385 | LIST_ENTRY *curr; | 382 | LIST_ENTRY *curr; |
386 | RNDIS_REQUEST *request=NULL; | 383 | RNDIS_REQUEST *request=NULL; |
387 | bool found = false; | 384 | bool found = false; |
385 | unsigned long flags; | ||
388 | 386 | ||
389 | DPRINT_ENTER(NETVSC); | 387 | DPRINT_ENTER(NETVSC); |
390 | 388 | ||
391 | SpinlockAcquire(Device->RequestLock); | 389 | spin_lock_irqsave(&Device->request_lock, flags); |
392 | ITERATE_LIST_ENTRIES(anchor, curr, &Device->RequestList) | 390 | ITERATE_LIST_ENTRIES(anchor, curr, &Device->RequestList) |
393 | { | 391 | { |
394 | request = CONTAINING_RECORD(curr, RNDIS_REQUEST, ListEntry); | 392 | request = CONTAINING_RECORD(curr, RNDIS_REQUEST, ListEntry); |
@@ -403,7 +401,7 @@ RndisFilterReceiveResponse( | |||
403 | break; | 401 | break; |
404 | } | 402 | } |
405 | } | 403 | } |
406 | SpinlockRelease(Device->RequestLock); | 404 | spin_unlock_irqrestore(&Device->request_lock, flags); |
407 | 405 | ||
408 | if (found) | 406 | if (found) |
409 | { | 407 | { |