Staging: hv: make Device->RequestLock a real spinlock
authorGreg Kroah-Hartman <gregkh@suse.de>
Wed, 15 Jul 2009 21:55:29 +0000 (14:55 -0700)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 15 Sep 2009 19:01:48 +0000 (12:01 -0700)
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>
drivers/staging/hv/RndisFilter.c

index bc5557a45c7560da82448ae61c68de223368275e..9f462b95876a903557500fa012e7ef2df34bd0ae 100644 (file)
@@ -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)
        {