patches for easier mirroring, to eliminate a special copy, to make www.freebsd.org/security a full copy of security.freebsd.org and be eventually be the same. For now files are just sitting there. The symlinks are missing. Discussed on: www (repository location) Discussed with: simon (so)
		
			
				
	
	
		
			38 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			38 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| Index: sys/kern/sched_ule.c
 | |
| ===================================================================
 | |
| --- sys/kern/sched_ule.c	(revision 202744)
 | |
| +++ sys/kern/sched_ule.c	(working copy)
 | |
| @@ -1822,18 +1822,24 @@
 | |
|  	 */
 | |
|  	spinlock_enter();
 | |
|  	thread_block_switch(td);	/* This releases the lock on tdq. */
 | |
| -	TDQ_LOCK(tdn);
 | |
| -	tdq_add(tdn, td, flags);
 | |
| -	tdq_notify(td->td_sched);
 | |
| +
 | |
|  	/*
 | |
| -	 * After we unlock tdn the new cpu still can't switch into this
 | |
| -	 * thread until we've unblocked it in cpu_switch().  The lock
 | |
| -	 * pointers may match in the case of HTT cores.  Don't unlock here
 | |
| -	 * or we can deadlock when the other CPU runs the IPI handler.
 | |
| +	 * Acquire both run-queue locks before placing the thread on the new
 | |
| +	 * run-queue to avoid deadlocks created by placing a thread with a
 | |
| +	 * blocked lock on the run-queue of a remote processor.  The deadlock
 | |
| +	 * occurs when a third processor attempts to lock the two queues in
 | |
| +	 * question while the target processor is spinning with its own
 | |
| +	 * run-queue lock held while waiting for the blocked lock to clear.
 | |
|  	 */
 | |
| -	if (TDQ_LOCKPTR(tdn) != TDQ_LOCKPTR(tdq)) {
 | |
| +	if (TDQ_LOCKPTR(tdn) == TDQ_LOCKPTR(tdq)) {
 | |
| +		TDQ_LOCK(tdq);
 | |
| +		tdq_add(tdn, td, flags);
 | |
| +		tdq_notify(td->td_sched);
 | |
| +	} else {
 | |
| +		tdq_lock_pair(tdn, tdq);
 | |
| +		tdq_add(tdn, td, flags);
 | |
| +		tdq_notify(td->td_sched);
 | |
|  		TDQ_UNLOCK(tdn);
 | |
| -		TDQ_LOCK(tdq);
 | |
|  	}
 | |
|  	spinlock_exit();
 | |
|  #endif
 |