/* Make sure other vcpus get a chance to run if they need to. */
for_each_cpu(cpu, mask) { if (xen_vcpu_stolen(cpu)) {
HYPERVISOR_sched_op(SCHEDOP_yield, NULL); break;
}
}
}
staticinlineint xen_map_vector(int vector)
{ int xen_vector;
switch (vector) { case RESCHEDULE_VECTOR:
xen_vector = XEN_RESCHEDULE_VECTOR; break; case CALL_FUNCTION_VECTOR:
xen_vector = XEN_CALL_FUNCTION_VECTOR; break; case CALL_FUNCTION_SINGLE_VECTOR:
xen_vector = XEN_CALL_FUNCTION_SINGLE_VECTOR; break; case IRQ_WORK_VECTOR:
xen_vector = XEN_IRQ_WORK_VECTOR; break; #ifdef CONFIG_X86_64 case NMI_VECTOR: case APIC_DM_NMI: /* Some use that instead of NMI_VECTOR */
xen_vector = XEN_NMI_VECTOR; break; #endif default:
xen_vector = -1;
printk(KERN_ERR "xen: vector 0x%x is not implemented\n",
vector);
}
return xen_vector;
}
void xen_send_IPI_mask(conststruct cpumask *mask, int vector)
{ int xen_vector = xen_map_vector(vector);
if (xen_vector >= 0)
__xen_send_IPI_mask(mask, xen_vector);
}
void xen_send_IPI_all(int vector)
{ int xen_vector = xen_map_vector(vector);
if (xen_vector >= 0)
__xen_send_IPI_mask(cpu_online_mask, xen_vector);
}
void xen_send_IPI_self(int vector)
{ int xen_vector = xen_map_vector(vector);
if (xen_vector >= 0)
xen_send_IPI_one(smp_processor_id(), xen_vector);
}
void xen_send_IPI_mask_allbutself(conststruct cpumask *mask, int vector)
{ unsigned cpu; unsignedint this_cpu = smp_processor_id(); int xen_vector = xen_map_vector(vector);
if (!(num_online_cpus() > 1) || (xen_vector < 0)) return;
for_each_cpu_and(cpu, mask, cpu_online_mask) { if (this_cpu == cpu) continue;
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.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.