26369-libxl-devid.patch - fate##313584: pass bios information to XEN HVM guest 26554-hvm-firmware-passthrough.patch 26555-hvm-firmware-passthrough.patch 26556-hvm-firmware-passthrough.patch - Upstream patches from Jan 26516-ACPI-parse-table-retval.patch (Replaces CVE-2013-0153-xsa36.patch) 26517-AMD-IOMMU-clear-irtes.patch (Replaces CVE-2013-0153-xsa36.patch) 26518-AMD-IOMMU-disable-if-SATA-combined-mode.patch (Replaces CVE-2013-0153-xsa36.patch) 26519-AMD-IOMMU-perdev-intremap-default.patch (Replaces CVE-2013-0153-xsa36.patch) 26526-pvdrv-no-devinit.patch 26529-gcc48-build-fix.patch 26531-AMD-IOMMU-IVHD-special-missing.patch (Replaces CVE-2013-0153-xsa36.patch) 26532-AMD-IOMMU-phantom-MSI.patch 26536-xenoprof-div-by-0.patch 26576-x86-APICV-migration.patch 26577-x86-APICV-x2APIC.patch 26578-AMD-IOMMU-replace-BUG_ON.patch - bnc#797014 - no way to control live migrations 26547-tools-xc_fix_logic_error_in_stdiostream_progress.patch 26548-tools-xc_handle_tty_output_differently_in_stdiostream_progress.patch 26549-tools-xc_turn_XCFLAGS_*_into_shifts.patch 26550-tools-xc_restore_logging_in_xc_save.patch 26551-tools-xc_log_pid_in_xc_save-xc_restore_output.patch - PVonHVM: __devinit was removed in linux-3.8 OBS-URL: https://build.opensuse.org/package/show/Virtualization/xen?expand=0&rev=229
83 lines
3.6 KiB
Diff
83 lines
3.6 KiB
Diff
# HG changeset patch
|
|
# User Dario Faggioli <dario.faggioli@citrix.com>
|
|
# Date 1355854218 0
|
|
# Node ID 127c2c47d440eb7f3248ab5561909e326af7e328
|
|
# Parent d5c0389bf26c89969ebce71927f34f6b923af949
|
|
xen: sched_credit: improve picking up the idle CPU for a VCPU
|
|
|
|
In _csched_cpu_pick() we try to select the best possible CPU for
|
|
running a VCPU, considering the characteristics of the underlying
|
|
hardware (i.e., how many threads, core, sockets, and how busy they
|
|
are). What we want is "the idle execution vehicle with the most
|
|
idling neighbours in its grouping".
|
|
|
|
In order to achieve it, we select a CPU from the VCPU's affinity,
|
|
giving preference to its current processor if possible, as the basis
|
|
for the comparison with all the other CPUs. Problem is, to discount
|
|
the VCPU itself when computing this "idleness" (in an attempt to be
|
|
fair wrt its current processor), we arbitrarily and unconditionally
|
|
consider that selected CPU as idle, even when it is not the case,
|
|
for instance:
|
|
1. If the CPU is not the one where the VCPU is running (perhaps due
|
|
to the affinity being changed);
|
|
2. The CPU is where the VCPU is running, but it has other VCPUs in
|
|
its runq, so it won't go idle even if the VCPU in question goes.
|
|
|
|
This is exemplified in the trace below:
|
|
|
|
] 3.466115364 x|------|------| d10v1 22005(2:2:5) 3 [ a 1 8 ]
|
|
... ... ...
|
|
3.466122856 x|------|------| d10v1 runstate_change d10v1
|
|
running->offline
|
|
3.466123046 x|------|------| d?v? runstate_change d32767v0
|
|
runnable->running
|
|
... ... ...
|
|
] 3.466126887 x|------|------| d32767v0 28004(2:8:4) 3 [ a 1 8 ]
|
|
|
|
22005(...) line (the first line) means _csched_cpu_pick() was called
|
|
on VCPU 1 of domain 10, while it is running on CPU 0, and it choose
|
|
CPU 8, which is busy ('|'), even if there are plenty of idle
|
|
CPUs. That is because, as a consequence of changing the VCPU affinity,
|
|
CPU 8 was chosen as the basis for the comparison, and therefore
|
|
considered idle (its bit gets unconditionally set in the bitmask
|
|
representing the idle CPUs). 28004(...) line means the VCPU is woken
|
|
up and queued on CPU 8's runq, where it waits for a context switch or
|
|
a migration, in order to be able to execute.
|
|
|
|
This change fixes things by only considering the "guessed" CPU idle if
|
|
the VCPU in question is both running there and is its only runnable
|
|
VCPU.
|
|
|
|
Signed-off-by: Dario Faggioli <dario.faggioli@citrix.com>
|
|
Acked-by: George Dunlap <george.dunlap@citrix.com>
|
|
Committed-by: Keir Fraser <keir@xen.org>
|
|
|
|
--- a/xen/common/sched_credit.c
|
|
+++ b/xen/common/sched_credit.c
|
|
@@ -72,6 +72,9 @@
|
|
#define CSCHED_VCPU(_vcpu) ((struct csched_vcpu *) (_vcpu)->sched_priv)
|
|
#define CSCHED_DOM(_dom) ((struct csched_dom *) (_dom)->sched_priv)
|
|
#define RUNQ(_cpu) (&(CSCHED_PCPU(_cpu)->runq))
|
|
+/* Is the first element of _cpu's runq its idle vcpu? */
|
|
+#define IS_RUNQ_IDLE(_cpu) (list_empty(RUNQ(_cpu)) || \
|
|
+ is_idle_vcpu(__runq_elem(RUNQ(_cpu)->next)->vcpu))
|
|
|
|
|
|
/*
|
|
@@ -487,9 +490,14 @@ _csched_cpu_pick(const struct scheduler
|
|
* distinct cores first and guarantees we don't do something stupid
|
|
* like run two VCPUs on co-hyperthreads while there are idle cores
|
|
* or sockets.
|
|
+ *
|
|
+ * Notice that, when computing the "idleness" of cpu, we may want to
|
|
+ * discount vc. That is, iff vc is the currently running and the only
|
|
+ * runnable vcpu on cpu, we add cpu to the idlers.
|
|
*/
|
|
cpumask_and(&idlers, &cpu_online_map, CSCHED_PRIV(ops)->idlers);
|
|
- cpumask_set_cpu(cpu, &idlers);
|
|
+ if ( vc->processor == cpu && IS_RUNQ_IDLE(cpu) )
|
|
+ cpumask_set_cpu(cpu, &idlers);
|
|
cpumask_and(&cpus, &cpus, &idlers);
|
|
cpumask_clear_cpu(cpu, &cpus);
|
|
|