Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 18 May 2017 18:35:14 +0000 (UTC)
From:      Mark Johnston <markj@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r318478 - in head/sys: compat/linuxkpi/common/src dev/drm2/ttm
Message-ID:  <201705181835.v4IIZEbq067062@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201705181835.v4IIZEbq067062>