mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-07 09:14:07 -04:00
staging: vt6656: lock changes: RXvMngWorkItem.
Narrow atomic locks in RXvMngWorkItem. We must lock the DequeueRCB and RXvFreeRCB so that they are in sync. vMgrRxManagePacket can nolonger be atomically called. There is no need for an overall lock. Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
d1d4120f7f
commit
e03ce8393e
@@ -1363,34 +1363,43 @@ void RXvMngWorkItem(struct work_struct *work)
|
||||
struct vnt_rcb *pRCB = NULL;
|
||||
struct vnt_rx_mgmt *pRxPacket;
|
||||
int bReAllocSkb = false;
|
||||
unsigned long flags;
|
||||
|
||||
if (pDevice->Flags & fMP_DISCONNECTED)
|
||||
return;
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"---->Rx Mng Thread\n");
|
||||
|
||||
spin_lock_irq(&pDevice->lock);
|
||||
while (pDevice->NumRecvMngList!=0)
|
||||
{
|
||||
spin_lock_irqsave(&pDevice->lock, flags);
|
||||
|
||||
pRCB = pDevice->FirstRecvMngList;
|
||||
pDevice->NumRecvMngList--;
|
||||
DequeueRCB(pDevice->FirstRecvMngList, pDevice->LastRecvMngList);
|
||||
|
||||
spin_unlock_irqrestore(&pDevice->lock, flags);
|
||||
|
||||
if(!pRCB){
|
||||
break;
|
||||
}
|
||||
pRxPacket = &(pRCB->sMngPacket);
|
||||
vMgrRxManagePacket(pDevice, &pDevice->vnt_mgmt, pRxPacket);
|
||||
pRCB->Ref--;
|
||||
if(pRCB->Ref == 0) {
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"RxvFreeMng %d %d\n",pDevice->NumRecvFreeList, pDevice->NumRecvMngList);
|
||||
RXvFreeRCB(pRCB, bReAllocSkb);
|
||||
} else {
|
||||
if (pRCB->Ref == 0) {
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"RxvFreeMng %d %d\n",
|
||||
pDevice->NumRecvFreeList, pDevice->NumRecvMngList);
|
||||
|
||||
spin_lock_irqsave(&pDevice->lock, flags);
|
||||
|
||||
RXvFreeRCB(pRCB, bReAllocSkb);
|
||||
|
||||
spin_unlock_irqrestore(&pDevice->lock, flags);
|
||||
} else {
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Rx Mng Only we have the right to free RCB\n");
|
||||
}
|
||||
}
|
||||
|
||||
pDevice->bIsRxMngWorkItemQueued = false;
|
||||
spin_unlock_irq(&pDevice->lock);
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user