return gcvNULL;
}
- mdlMap->pid = ProcessID;
- mdlMap->vmaAddr = gcvNULL;
- mdlMap->vma = gcvNULL;
+ mdlMap->pid = ProcessID;
+ mdlMap->vmaAddr = gcvNULL;
+ mdlMap->vma = gcvNULL;
+ mdlMap->reference = 0;
mdlMap->next = Mdl->maps;
Mdl->maps = mdlMap;
up_write(¤t->mm->mmap_sem);
}
+
+#if 0
else
{
/* mdlMap->vmaAddr != gcvNULL means current process has already locked this node. */
gcmkFOOTER_ARG("*status=%d, mdlMap->vmaAddr=%x", gcvSTATUS_MEMORY_LOCKED, mdlMap->vmaAddr);
return gcvSTATUS_MEMORY_LOCKED;
}
+#endif
/* Convert pointer to MDL. */
*Logical = mdlMap->vmaAddr;
*PageCount = mdl->numPages * (PAGE_SIZE / 4096);
+ /* Increase reference count. */
+ mdlMap->reference++;
+
MEMORY_UNLOCK(Os);
gcmkVERIFY_OK(gckOS_CacheFlush(
{
if ((mdlMap->vmaAddr != gcvNULL) && (_GetProcessID() == mdlMap->pid))
{
+ if (--mdlMap->reference > 0)
+ {
+ continue;
+ }
+
_UnmapUserLogical(mdlMap->pid, mdlMap->vmaAddr, mdl->numPages * PAGE_SIZE);
mdlMap->vmaAddr = gcvNULL;
}