psTimerCBData->bActive = IMG_TRUE;
+ psTimerCBData->sTimer.expires = psTimerCBData->ui32Delay + jiffies;
add_timer(&psTimerCBData->sTimer);
return PVRSRV_OK;
return psPage;
}
-PVRSRV_ERROR OSReleasePhysPageAddr(IMG_HANDLE hOSWrapMem)
+PVRSRV_ERROR OSReleasePhysPageAddr(IMG_HANDLE hOSWrapMem,
+ IMG_BOOL bUseLock)
{
sWrapMemInfo *psInfo = (sWrapMemInfo *) hOSWrapMem;
unsigned ui;
{
struct vm_area_struct *psVMArea;
- down_read(¤t->mm->mmap_sem);
+ if (bUseLock)
+ down_read(¤t->mm->mmap_sem);
psVMArea = find_vma(current->mm, psInfo->ulStartAddr);
if (psVMArea == NULL) {
": OSCpuVToPageListRelease: Couldn't find memory region containing start address %lx",
psInfo->ulStartAddr);
- up_read(¤t->mm->mmap_sem);
+ if (bUseLock)
+ up_read(¤t->mm->mmap_sem);
+
break;
}
psVMArea->vm_flags);
}
- up_read(¤t->mm->mmap_sem);
+ if (bUseLock)
+ up_read(¤t->mm->mmap_sem);
+
break;
}
default:
return PVRSRV_OK;
}
-PVRSRV_ERROR OSAcquirePhysPageAddr(IMG_VOID * pvCPUVAddr,
+PVRSRV_ERROR OSAcquirePhysPageAddr(IMG_VOID *pvCPUVAddr,
IMG_UINT32 ui32Bytes,
- IMG_SYS_PHYADDR * psSysPAddr,
- IMG_HANDLE * phOSWrapMem)
+ IMG_SYS_PHYADDR *psSysPAddr,
+ IMG_HANDLE *phOSWrapMem,
+ IMG_BOOL bUseLock)
{
unsigned long ulStartAddrOrig = (unsigned long)pvCPUVAddr;
unsigned long ulAddrRangeOrig = (unsigned long)ui32Bytes;
psInfo = kmalloc(sizeof(*psInfo), GFP_KERNEL);
if (psInfo == NULL) {
printk(KERN_WARNING
- ": OSCpuVToPageList: Couldn't allocate information structure");
+ ": OSCpuVToPageList: Couldn't allocate information structure\n");
return PVRSRV_ERROR_OUT_OF_MEMORY;
}
memset(psInfo, 0, sizeof(*psInfo));
GFP_KERNEL);
if (psInfo->psPhysAddr == NULL) {
printk(KERN_WARNING
- ": OSCpuVToPageList: Couldn't allocate page array");
+ ": OSCpuVToPageList: Couldn't allocate page array\n");
goto error_free;
}
kmalloc(psInfo->iNumPages * sizeof(*psInfo->ppsPages), GFP_KERNEL);
if (psInfo->ppsPages == NULL) {
printk(KERN_WARNING
- ": OSCpuVToPageList: Couldn't allocate page array");
+ ": OSCpuVToPageList: Couldn't allocate page array\n");
goto error_free;
}
- down_read(¤t->mm->mmap_sem);
+ if (bUseLock)
+ down_read(¤t->mm->mmap_sem);
+
iNumPagesMapped =
get_user_pages(current, current->mm, ulStartAddr, psInfo->iNumPages,
1, 0, psInfo->ppsPages, NULL);
- up_read(¤t->mm->mmap_sem);
+
+ if (bUseLock)
+ up_read(¤t->mm->mmap_sem);
+
if (iNumPagesMapped >= 0) {
if (iNumPagesMapped != psInfo->iNumPages) {
printk(KERN_WARNING
- ": OSCpuVToPageList: Couldn't map all the pages needed (wanted: %d, got %d)",
+ ": OSCpuVToPageList: Couldn't map all the pages needed (wanted: %d, got %d \n)",
psInfo->iNumPages, iNumPagesMapped);
for (ui = 0; ui < iNumPagesMapped; ui++) {
}
printk(KERN_WARNING
- ": OSCpuVToPageList: get_user_pages failed (%d), trying something else",
+ ": OSCpuVToPageList: get_user_pages failed (%d), trying something else \n",
iNumPagesMapped);
- down_read(¤t->mm->mmap_sem);
+ if (bUseLock)
+ down_read(¤t->mm->mmap_sem);
psVMArea = find_vma(current->mm, ulStartAddrOrig);
if (psVMArea == NULL) {
printk(KERN_WARNING
- ": OSCpuVToPageList: Couldn't find memory region containing start address %lx",
+ ": OSCpuVToPageList: Couldn't find memory region containing start address %lx \n",
ulStartAddrOrig);
goto error_release_mmap_sem;
if (ulStartAddrOrig < psVMArea->vm_start) {
printk(KERN_WARNING
- ": OSCpuVToPageList: Start address %lx is outside of the region returned by find_vma",
+ ": OSCpuVToPageList: Start address %lx is outside of the region returned by find_vma\n",
ulStartAddrOrig);
goto error_release_mmap_sem;
}
if (ulBeyondEndAddrOrig > psVMArea->vm_end) {
printk(KERN_WARNING
- ": OSCpuVToPageList: End address %lx is outside of the region returned by find_vma",
+ ": OSCpuVToPageList: End address %lx is outside of the region returned by find_vma\n",
ulBeyondEndAddrOrig);
goto error_release_mmap_sem;
}
if ((psVMArea->vm_flags & (VM_IO | VM_RESERVED)) !=
(VM_IO | VM_RESERVED)) {
printk(KERN_WARNING
- ": OSCpuVToPageList: Memory region does not represent memory mapped I/O (VMA flags: 0x%lx)",
+ ": OSCpuVToPageList: Memory region does not represent memory mapped I/O (VMA flags: 0x%lx)\n",
psVMArea->vm_flags);
goto error_release_mmap_sem;
}
if ((psVMArea->vm_flags & (VM_READ | VM_WRITE)) != (VM_READ | VM_WRITE)) {
printk(KERN_WARNING
- ": OSCpuVToPageList: No read/write access to memory region (VMA flags: 0x%lx)",
+ ": OSCpuVToPageList: No read/write access to memory region (VMA flags: 0x%lx)\n",
psVMArea->vm_flags);
goto error_release_mmap_sem;
}
unsigned uj;
printk(KERN_WARNING
- ": OSCpuVToPageList: Couldn't lookup page structure for address 0x%lx, trying something else",
+ ": OSCpuVToPageList: Couldn't lookup page structure for address 0x%lx, trying something else\n",
ulAddr);
for (uj = 0; uj < ui; uj++) {
if ((psVMArea->vm_flags & VM_PFNMAP) == 0) {
printk(KERN_WARNING
- ": OSCpuVToPageList: Region isn't a raw PFN mapping. Giving up.");
+ ": OSCpuVToPageList: Region isn't a raw PFN mapping. Giving up.\n");
goto error_release_mmap_sem;
}
psInfo->eType = WRAP_TYPE_FIND_VMA_PFN;
printk(KERN_WARNING
- ": OSCpuVToPageList: Region can't be locked down");
+ ": OSCpuVToPageList: Region can't be locked down\n");
}
- up_read(¤t->mm->mmap_sem);
+ if (bUseLock)
+ up_read(¤t->mm->mmap_sem);
exit_check:
CheckPagesContiguous(psInfo);
return PVRSRV_OK;
error_release_mmap_sem:
- up_read(¤t->mm->mmap_sem);
+ if (bUseLock)
+ up_read(¤t->mm->mmap_sem);
+
error_free:
psInfo->eType = WRAP_TYPE_CLEANUP;
- OSReleasePhysPageAddr((IMG_HANDLE) psInfo);
+ OSReleasePhysPageAddr((IMG_HANDLE) psInfo, bUseLock);
return PVRSRV_ERROR_GENERIC;
}