/* * Debug related code, dump vcpu/cpu information */ static void rt_dump_vcpu(struct rt_vcpu *svc) { char *cpustr = keyhandler_scratch; if ( svc == NULL ) { printk("NULL!\n"); return; } cpumask_scnprintf(cpustr, sizeof(cpustr), svc->vcpu->cpu_hard_affinity); printk("OCBP:_dumpP: [%5d.%-2d] cpu %d, Period %"PRId64", Budget_low %"PRId64", Budget_high %"PRId64", Deadline %"PRId64",Criticality %d,Offline_flag %d, cur_b=%"PRId64",onR=%d runnable=%d cpu_hard_affinity=%s", svc->vcpu->domain->domain_id, svc->vcpu->vcpu_id, svc->vcpu->processor, svc->period, svc->budget_low, svc->budget_high, svc->deadline, svc->criticality_vcpu, svc->offl_flag, svc->cur_budget, __vcpu_on_runq(svc), vcpu_runnable(svc->vcpu), cpustr); memset(cpustr, 0, sizeof(char)*1024); cpumask_scnprintf(cpustr, sizeof(cpustr), cpupool_scheduler_cpumask(svc->vcpu->domain->cpupool)); printk("cpupool=%s\n", cpustr); }
/* * Debug related code, dump vcpu/cpu information */ static void rt_dump_vcpu(const struct scheduler *ops, const struct rt_vcpu *svc) { char cpustr[1024]; cpumask_t *cpupool_mask; ASSERT(svc != NULL); /* idle vcpu */ if( svc->sdom == NULL ) { printk("\n"); return; } cpumask_scnprintf(cpustr, sizeof(cpustr), svc->vcpu->cpu_hard_affinity); printk("[%5d.%-2u] cpu %u, (%"PRI_stime", %"PRI_stime")," " cur_b=%"PRI_stime" cur_d=%"PRI_stime" last_start=%"PRI_stime"\n" " \t\t onQ=%d runnable=%d cpu_hard_affinity=%s ", svc->vcpu->domain->domain_id, svc->vcpu->vcpu_id, svc->vcpu->processor, svc->period, svc->budget, svc->cur_budget, svc->cur_deadline, svc->last_start, __vcpu_on_q(svc), vcpu_runnable(svc->vcpu), cpustr); memset(cpustr, 0, sizeof(cpustr)); cpupool_mask = cpupool_scheduler_cpumask(svc->vcpu->domain->cpupool); cpumask_scnprintf(cpustr, sizeof(cpustr), cpupool_mask); printk("cpupool=%s\n", cpustr); }
/** * Xen scheduler callback function to select a CPU for the VCPU to run on * * @param ops Pointer to this instance of the scheduler structure * @param v Pointer to the VCPU structure for the current domain * * @return Number of selected physical CPU */ static int a653sched_pick_cpu(const struct scheduler *ops, struct vcpu *vc) { cpumask_t *online; unsigned int cpu; /* * If present, prefer vc's current processor, else * just find the first valid vcpu . */ online = cpupool_scheduler_cpumask(vc->domain->cpupool); cpu = cpumask_first(online); if ( cpumask_test_cpu(vc->processor, online) || (cpu >= nr_cpu_ids) ) cpu = vc->processor; return cpu; }
static void rt_dump(const struct scheduler *ops) { struct list_head *iter_sdom, *iter_svc, *runq, *depletedq, *iter; struct rt_private *prv = rt_priv(ops); struct rt_vcpu *svc; cpumask_t *online; struct rt_dom *sdom; unsigned long flags; ASSERT(!list_empty(&prv->sdom)); sdom = list_entry(prv->sdom.next, struct rt_dom, sdom_elem); online = cpupool_scheduler_cpumask(sdom->dom->cpupool); runq = rt_runq(ops); depletedq = rt_depletedq(ops); spin_lock_irqsave(&prv->lock, flags); printk("Global RunQueue info:\n"); list_for_each( iter, runq ) { svc = __q_elem(iter); rt_dump_vcpu(ops, svc); }