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;
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to