X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/39236c6e673c41db228275375ab7fdb0f837b292..bb59bff194111743b33cc36712410b5656329d3c:/osfmk/kern/processor.c diff --git a/osfmk/kern/processor.c b/osfmk/kern/processor.c index 709019b9f..355b1b1dc 100644 --- a/osfmk/kern/processor.c +++ b/osfmk/kern/processor.c @@ -158,9 +158,12 @@ processor_init( processor->current_thmode = TH_MODE_NONE; processor->cpu_id = cpu_id; timer_call_setup(&processor->quantum_timer, thread_quantum_expire, processor); + processor->quantum_end = UINT64_MAX; processor->deadline = UINT64_MAX; processor->timeslice = 0; - processor->processor_meta = PROCESSOR_META_NULL; + processor->processor_primary = processor; /* no SMT relationship known at this point */ + processor->processor_secondary = NULL; + processor->is_SMT = FALSE; processor->processor_self = IP_NULL; processor_data_init(processor); processor->processor_list = NULL; @@ -187,21 +190,26 @@ processor_init( } void -processor_meta_init( +processor_set_primary( processor_t processor, processor_t primary) { - processor_meta_t pmeta = primary->processor_meta; - - if (pmeta == PROCESSOR_META_NULL) { - pmeta = kalloc(sizeof (*pmeta)); - - queue_init(&pmeta->idle_queue); - - pmeta->primary = primary; + assert(processor->processor_primary == primary || processor->processor_primary == processor); + /* Re-adjust primary point for this (possibly) secondary processor */ + processor->processor_primary = primary; + + assert(primary->processor_secondary == NULL || primary->processor_secondary == processor); + if (primary != processor) { + /* Link primary to secondary, assumes a 2-way SMT model + * We'll need to move to a queue if any future architecture + * requires otherwise. + */ + assert(processor->processor_secondary == NULL); + primary->processor_secondary = processor; + /* Mark both processors as SMT siblings */ + primary->is_SMT = TRUE; + processor->is_SMT = TRUE; } - - processor->processor_meta = pmeta; } processor_set_t @@ -221,6 +229,12 @@ processor_set_t pset_create( pset_node_t node) { +#if defined(CONFIG_SCHED_MULTIQ) + /* multiq scheduler is not currently compatible with multiple psets */ + if (sched_groups_enabled) + return processor_pset(master_processor); +#endif /* defined(CONFIG_SCHED_MULTIQ) */ + processor_set_t *prev, pset = kalloc(sizeof (*pset)); if (pset != PROCESSOR_SET_NULL) { @@ -255,9 +269,8 @@ pset_init( queue_init(&pset->active_queue); queue_init(&pset->idle_queue); + queue_init(&pset->idle_secondary_queue); pset->online_processor_count = 0; - pset_pri_init_hint(pset, PROCESSOR_NULL); - pset_count_init_hint(pset, PROCESSOR_NULL); pset->cpu_set_low = pset->cpu_set_hi = 0; pset->cpu_set_count = 0; pset->pending_AST_cpu_mask = 0;