Shouldn't this be folded into the previous one?

It looks a bit odd to add CPU binding enforcement but let the scheduler
ignore the affinity mask.

Samuel

Manolo de Medici, le lun. 13 avril 2026 00:04:23 +0100, a ecrit:
> Mimic what is done for CPU binding.
> ---
>  kern/sched_prim.c | 22 ++++++++++++++++++----
>  1 file changed, 18 insertions(+), 4 deletions(-)
> 
> diff --git a/kern/sched_prim.c b/kern/sched_prim.c
> index 605f7001..ad6fe6cb 100644
> --- a/kern/sched_prim.c
> +++ b/kern/sched_prim.c
> @@ -550,7 +550,9 @@ static thread_t thread_select(
>                           (thread->processor_set == pset) &&
>  #endif       /* MACH_HOST */
>                           ((thread->bound_processor == PROCESSOR_NULL) ||
> -                          (thread->bound_processor == myprocessor))) {
> +                          (thread->bound_processor == myprocessor)) &&
> +                         ((thread->has_affinity == FALSE) ||
> +                          cpu_affinity_test(&thread->affinity, 
> myprocessor->slot_num))) {
>  
>                               simple_unlock(&pset->runq.lock);
>                               thread_lock(thread);
> @@ -1264,7 +1266,7 @@ void thread_setrun(
>        */
>       if ((processor = th->bound_processor) == PROCESSOR_NULL) {
>           /*
> -          *  Not bound, any processor in the processor set is ok.
> +          *  Not bound.
>            */
>           pset = th->processor_set;
>  #if  HW_FOOTPRINT
> @@ -1279,7 +1281,8 @@ void thread_setrun(
>  #if  MACH_HOST
>                       && (processor->processor_set == pset)
>  #endif       /* MACH_HOST */
> -                     ) {
> +                     && ((th->has_affinity == FALSE) ||
> +                         cpu_affinity_test(&th->affinity, 
> processor->slot_num))) {
>                           queue_remove(&pset->idle_queue, processor,
>                               processor_t, processor_queue);
>                           pset->idle_count--;
> @@ -1299,7 +1302,17 @@ void thread_setrun(
>           if (pset->idle_count > 0) {
>               pset_idle_lock();
>               if (pset->idle_count > 0) {
> -                 processor = (processor_t) queue_first(&pset->idle_queue);
> +                 if (th->has_affinity == FALSE) {
> +                     processor = (processor_t) 
> queue_first(&pset->idle_queue);
> +                 } else {
> +                     queue_iterate(&pset->idle_queue, processor, 
> processor_t, processor_queue) {
> +                         if (cpu_affinity_test(&th->affinity, 
> processor->slot_num)) {
> +                             goto found_idle_processor;
> +                         }
> +                     }
> +                     goto no_idle_processor;
> +                 }
> +found_idle_processor:
>                   queue_remove(&(pset->idle_queue), processor, processor_t,
>                               processor_queue);
>                   pset->idle_count--;
> @@ -1310,6 +1323,7 @@ void thread_setrun(
>                       cause_ast_check(processor);
>                   return;
>               }
> +no_idle_processor:
>               pset_idle_unlock();
>           }
>           rq = &(pset->runq);
> -- 
> 2.53.0
> 
> 

-- 
Samuel
«Tiens, quand j'aurai un peu de temps et une partition libre, je crois
 que je vais essayer de remplacer mes scripts de démarrage par des
 programmes Windows lancés via Wine et binfmt_misc :-)»
-+- AGV in Guide du linuxien pervers - "J'sais pas quoi faire... (air connu)"

Reply via email to