aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@suse.de>2009-07-15 17:55:29 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2009-09-15 15:01:48 -0400
commit880fb89c1f23c17de6c964dca7943d2f76a8e17c (patch)
treeebb7676772fc33ad14952754470fc3c85f392d8e
parenta98f96eed5fa16f4868b4af2d50af77f57a1b231 (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>
-rw-r--r--drivers/staging/hv/RndisFilter.c26
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
233static inline void PutRndisDevice(RNDIS_DEVICE *Device) 228static 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
275static inline void PutRndisRequest(RNDIS_DEVICE *Device, RNDIS_REQUEST *Request) 270static 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 {