mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	sched_ext, scx_qmap: Add and use SCX_ENQ_CPU_SELECTED
scx_qmap and other schedulers in the SCX repo are using SCX_ENQ_WAKEUP to tell whether ops.select_cpu() was called. This is incorrect as ops.select_cpu() can be skipped in the wakeup path and leads to e.g. incorrectly skipping direct dispatch for tasks that are bound to a single CPU. sched core has been updated to specify ENQUEUE_RQ_SELECTED if ->select_task_rq() was called. Map it to SCX_ENQ_CPU_SELECTED and update scx_qmap to test it instead of SCX_ENQ_WAKEUP. Signed-off-by: Tejun Heo <tj@kernel.org> Acked-by: David Vernet <void@manifault.com> Cc: Daniel Hodges <hodges.daniel.scott@gmail.com> Cc: Changwoo Min <multics69@gmail.com> Cc: Andrea Righi <andrea.righi@linux.dev> Cc: Dan Schatzberg <schatzberg.dan@gmail.com>
This commit is contained in:
		
							parent
							
								
									f207dc2dcd
								
							
						
					
					
						commit
						9b671793c7
					
				
					 2 changed files with 3 additions and 2 deletions
				
			
		| 
						 | 
					@ -696,6 +696,7 @@ enum scx_enq_flags {
 | 
				
			||||||
	/* expose select ENQUEUE_* flags as enums */
 | 
						/* expose select ENQUEUE_* flags as enums */
 | 
				
			||||||
	SCX_ENQ_WAKEUP		= ENQUEUE_WAKEUP,
 | 
						SCX_ENQ_WAKEUP		= ENQUEUE_WAKEUP,
 | 
				
			||||||
	SCX_ENQ_HEAD		= ENQUEUE_HEAD,
 | 
						SCX_ENQ_HEAD		= ENQUEUE_HEAD,
 | 
				
			||||||
 | 
						SCX_ENQ_CPU_SELECTED	= ENQUEUE_RQ_SELECTED,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* high 32bits are SCX specific */
 | 
						/* high 32bits are SCX specific */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -230,8 +230,8 @@ void BPF_STRUCT_OPS(qmap_enqueue, struct task_struct *p, u64 enq_flags)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* if !WAKEUP, select_cpu() wasn't called, try direct dispatch */
 | 
						/* if select_cpu() wasn't called, try direct dispatch */
 | 
				
			||||||
	if (!(enq_flags & SCX_ENQ_WAKEUP) &&
 | 
						if (!(enq_flags & SCX_ENQ_CPU_SELECTED) &&
 | 
				
			||||||
	    (cpu = pick_direct_dispatch_cpu(p, scx_bpf_task_cpu(p))) >= 0) {
 | 
						    (cpu = pick_direct_dispatch_cpu(p, scx_bpf_task_cpu(p))) >= 0) {
 | 
				
			||||||
		__sync_fetch_and_add(&nr_ddsp_from_enq, 1);
 | 
							__sync_fetch_and_add(&nr_ddsp_from_enq, 1);
 | 
				
			||||||
		scx_bpf_dispatch(p, SCX_DSQ_LOCAL_ON | cpu, slice_ns, enq_flags);
 | 
							scx_bpf_dispatch(p, SCX_DSQ_LOCAL_ON | cpu, slice_ns, enq_flags);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue