/* return stolen time in ns by asking the hypervisor */ static u64 para_steal_clock(int cpu)
{ struct pvclock_vcpu_stolen_time *kaddr = NULL; struct pv_time_stolen_time_region *reg;
u64 ret = 0;
reg = per_cpu_ptr(&stolen_time_region, cpu);
/* * paravirt_steal_clock() may be called before the CPU * online notification callback runs. Until the callback * has run we just return zero.
*/
rcu_read_lock();
kaddr = rcu_dereference(reg->kaddr); if (!kaddr) {
rcu_read_unlock(); return 0;
}
ret = le64_to_cpu(READ_ONCE(kaddr->stolen_time));
rcu_read_unlock(); return ret;
}
if (!reg->kaddr) {
pr_warn("Failed to map stolen time data structure\n"); return -ENOMEM;
}
if (le32_to_cpu(kaddr->revision) != 0 ||
le32_to_cpu(kaddr->attributes) != 0) {
pr_warn_once("Unexpected revision or attributes in stolen time data\n"); return -ENXIO;
}
return 0;
}
staticint __init pv_time_init_stolen_time(void)
{ int ret;
ret = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "hypervisor/arm/pvtime:online",
stolen_time_cpu_online,
stolen_time_cpu_down_prepare); if (ret < 0) return ret; return 0;
}
static_key_slow_inc(¶virt_steal_enabled); if (steal_acc)
static_key_slow_inc(¶virt_steal_rq_enabled);
pr_info("using stolen time PV\n");
return 0;
}
Messung V0.5
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.22Bemerkung:
(vorverarbeitet)
¤