diff options
author | Andrew Cooper <andrew.cooper3@citrix.com> | 2013-10-04 12:23:23 +0200 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2013-10-04 12:23:23 +0200 |
commit | 0aa27ce3351f7eb09d13e863a1d5f303086aa32a (patch) | |
tree | 24d83e3cb6ec737ee00a49cab81f7a750fb81ecd /Config.mk | |
parent | 1e143e2ae8be3ba86c2e931a1ee8d91efca08f89 (diff) | |
download | xen-0aa27ce3351f7eb09d13e863a1d5f303086aa32a.tar.gz xen-0aa27ce3351f7eb09d13e863a1d5f303086aa32a.tar.bz2 xen-0aa27ce3351f7eb09d13e863a1d5f303086aa32a.zip |
x86/idle: Fix get_cpu_idle_time()'s interaction with offline pcpus
Checking for "idle_vcpu[cpu] != NULL" is insufficient protection against
offline pcpus. From a hypercall, vcpu_runstate_get() will determine "v !=
current", and try to take the vcpu_schedule_lock(). This will try to look up
per_cpu(schedule_data, v->processor) and promptly suffer a NULL structure
deference as v->processors' __per_cpu_offset is INVALID_PERCPU_AREA.
One example might look like this:
...
Xen call trace:
[<ffff82c4c0126ddb>] vcpu_runstate_get+0x50/0x113
[<ffff82c4c0126ec6>] get_cpu_idle_time+0x28/0x2e
[<ffff82c4c012b5cb>] do_sysctl+0x3db/0xeb8
[<ffff82c4c023280d>] compat_hypercall+0xbd/0x116
Pagetable walk from 0000000000000040:
L4[0x000] = 0000000186df8027 0000000000028207
L3[0x000] = 0000000188e36027 00000000000261c9
L2[0x000] = 0000000000000000 ffffffffffffffff
****************************************
Panic on CPU 11:
...
get_cpu_idle_time() has been updated to correctly deal with offline pcpus
itself by returning 0, in the same way as it would if it was missing the
idle_vcpu[] pointer.
In doing so, XENPF_getidletime needed updating to correctly retain its
described behaviour of clearing bits in the cpumap for offline pcpus.
As this crash can only be triggered with toolstack hypercalls, it is not a
security issue and just a simple bug.
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Acked-by: Keir Fraser <keir@xen.org>
Diffstat (limited to 'Config.mk')
0 files changed, 0 insertions, 0 deletions