svn commit: r318478 - in head/sys: compat/linuxkpi/common/src dev/drm2/ttm
Mark Johnston
markj at FreeBSD.org
Thu May 18 18:35:15 UTC 2017
Author: markj
Date: Thu May 18 18:35:14 2017
New Revision: 318478
URL: https://svnweb.freebsd.org/changeset/base/318478
Log:
Fix a few uses of kern_yield() in the TTM and the LinuxKPI.
kern_yield(0) effectively causes the calling thread to be rescheduled
immediately since it resets the thread's priority to the highest possible
value. This can cause livelocks when the pattern
"while (!trylock()) kern_yield(0);" is used since the thread holding the
lock may linger on the runqueue for the CPU on which the looping thread is
running.
MFC after: 1 week
Modified:
head/sys/compat/linuxkpi/common/src/linux_compat.c
head/sys/dev/drm2/ttm/ttm_bo_vm.c
Modified: head/sys/compat/linuxkpi/common/src/linux_compat.c
==============================================================================
--- head/sys/compat/linuxkpi/common/src/linux_compat.c Thu May 18 18:33:33 2017 (r318477)
+++ head/sys/compat/linuxkpi/common/src/linux_compat.c Thu May 18 18:35:14 2017 (r318478)
@@ -435,7 +435,7 @@ linux_cdev_pager_populate(vm_object_t vm
err = vmap->vm_ops->fault(vmap, &vmf);
while (vmap->vm_pfn_count == 0 && err == VM_FAULT_NOPAGE) {
- kern_yield(0);
+ kern_yield(PRI_USER);
err = vmap->vm_ops->fault(vmap, &vmf);
}
}
Modified: head/sys/dev/drm2/ttm/ttm_bo_vm.c
==============================================================================
--- head/sys/dev/drm2/ttm/ttm_bo_vm.c Thu May 18 18:33:33 2017 (r318477)
+++ head/sys/dev/drm2/ttm/ttm_bo_vm.c Thu May 18 18:35:14 2017 (r318478)
@@ -126,7 +126,7 @@ reserve:
ret = ttm_bo_reserve(bo, false, false, false, 0);
if (unlikely(ret != 0)) {
if (ret == -EBUSY) {
- kern_yield(0);
+ kern_yield(PRI_USER);
goto reserve;
}
}
@@ -139,7 +139,7 @@ reserve:
case -EBUSY:
case -ERESTARTSYS:
case -EINTR:
- kern_yield(0);
+ kern_yield(PRI_USER);
goto reserve;
default:
retval = VM_PAGER_ERROR;
More information about the svn-src-head
mailing list