From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
stable@vger.kernel.org,
Yasuaki Ishimatsu <yasu.isimatu@gmail.com>,
Thomas Gleixner <tglx@linutronix.de>,
Alexander Shishkin <alexander.shishkin@linux.intel.com>,
Arnaldo Carvalho de Melo <acme@redhat.com>,
Jiri Olsa <jolsa@redhat.com>,
Linus Torvalds <torvalds@linux-foundation.org>,
Peter Zijlstra <peterz@infradead.org>,
Sebastian Siewior <bigeasy@linutronix.de>,
Stephane Eranian <eranian@google.com>,
Vince Weaver <vincent.weaver@maine.edu>,
Ingo Molnar <mingo@kernel.org>,
Jack Wang <jinpu.wang@profitbricks.com>
Subject: [PATCH 4.9 58/84] perf/x86/intel/rapl: Make package handling more robust
Date: Mon, 28 Aug 2017 10:05:23 +0200 [thread overview]
Message-ID: <20170828080531.822052208@linuxfoundation.org> (raw)
In-Reply-To: <20170828080529.526391781@linuxfoundation.org>
4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Gleixner <tglx@linutronix.de>
commit dd86e373e09fb16b83e8adf5c48c421a4ca76468 upstream.
The package management code in RAPL relies on package mapping being
available before a CPU is started. This changed with:
9d85eb9119f4 ("x86/smpboot: Make logical package management more robust")
because the ACPI/BIOS information turned out to be unreliable, but that
left RAPL in broken state. This was not noticed because on a regular boot
all CPUs are online before RAPL is initialized.
A possible fix would be to reintroduce the mess which allocates a package
data structure in CPU prepare and when it turns out to already exist in
starting throw it away later in the CPU online callback. But that's a
horrible hack and not required at all because RAPL becomes functional for
perf only in the CPU online callback. That's correct because user space is
not yet informed about the CPU being onlined, so nothing caan rely on RAPL
being available on that particular CPU.
Move the allocation to the CPU online callback and simplify the hotplug
handling. At this point the package mapping is established and correct.
This also adds a missing check for available package data in the
event_init() function.
Reported-by: Yasuaki Ishimatsu <yasu.isimatu@gmail.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Sebastian Siewior <bigeasy@linutronix.de>
Cc: Stephane Eranian <eranian@google.com>
Cc: Vince Weaver <vincent.weaver@maine.edu>
Fixes: 9d85eb9119f4 ("x86/smpboot: Make logical package management more robust")
Link: http://lkml.kernel.org/r/20170131230141.212593966@linutronix.de
Signed-off-by: Ingo Molnar <mingo@kernel.org>
[ jwang: backport to 4.9 fix Null pointer deref during hotplug cpu.]
Signed-off-by: Jack Wang <jinpu.wang@profitbricks.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
arch/x86/events/intel/rapl.c | 58 ++++++++++++++++++-------------------------
include/linux/cpuhotplug.h | 1
2 files changed, 25 insertions(+), 34 deletions(-)
--- a/arch/x86/events/intel/rapl.c
+++ b/arch/x86/events/intel/rapl.c
@@ -161,7 +161,13 @@ static u64 rapl_timer_ms;
static inline struct rapl_pmu *cpu_to_rapl_pmu(unsigned int cpu)
{
- return rapl_pmus->pmus[topology_logical_package_id(cpu)];
+ unsigned int pkgid = topology_logical_package_id(cpu);
+
+ /*
+ * The unsigned check also catches the '-1' return value for non
+ * existent mappings in the topology map.
+ */
+ return pkgid < rapl_pmus->maxpkg ? rapl_pmus->pmus[pkgid] : NULL;
}
static inline u64 rapl_read_counter(struct perf_event *event)
@@ -402,6 +408,8 @@ static int rapl_pmu_event_init(struct pe
/* must be done before validate_group */
pmu = cpu_to_rapl_pmu(event->cpu);
+ if (!pmu)
+ return -EINVAL;
event->cpu = pmu->cpu;
event->pmu_private = pmu;
event->hw.event_base = msr;
@@ -585,6 +593,19 @@ static int rapl_cpu_online(unsigned int
struct rapl_pmu *pmu = cpu_to_rapl_pmu(cpu);
int target;
+ if (!pmu) {
+ pmu = kzalloc_node(sizeof(*pmu), GFP_KERNEL, cpu_to_node(cpu));
+ if (!pmu)
+ return -ENOMEM;
+
+ raw_spin_lock_init(&pmu->lock);
+ INIT_LIST_HEAD(&pmu->active_list);
+ pmu->pmu = &rapl_pmus->pmu;
+ pmu->timer_interval = ms_to_ktime(rapl_timer_ms);
+ rapl_hrtimer_init(pmu);
+
+ rapl_pmus->pmus[topology_logical_package_id(cpu)] = pmu;
+ }
/*
* Check if there is an online cpu in the package which collects rapl
* events already.
@@ -598,27 +619,6 @@ static int rapl_cpu_online(unsigned int
return 0;
}
-static int rapl_cpu_prepare(unsigned int cpu)
-{
- struct rapl_pmu *pmu = cpu_to_rapl_pmu(cpu);
-
- if (pmu)
- return 0;
-
- pmu = kzalloc_node(sizeof(*pmu), GFP_KERNEL, cpu_to_node(cpu));
- if (!pmu)
- return -ENOMEM;
-
- raw_spin_lock_init(&pmu->lock);
- INIT_LIST_HEAD(&pmu->active_list);
- pmu->pmu = &rapl_pmus->pmu;
- pmu->timer_interval = ms_to_ktime(rapl_timer_ms);
- pmu->cpu = -1;
- rapl_hrtimer_init(pmu);
- rapl_pmus->pmus[topology_logical_package_id(cpu)] = pmu;
- return 0;
-}
-
static int rapl_check_hw_unit(bool apply_quirk)
{
u64 msr_rapl_power_unit_bits;
@@ -804,28 +804,21 @@ static int __init rapl_pmu_init(void)
* Install callbacks. Core will call them for each online cpu.
*/
- ret = cpuhp_setup_state(CPUHP_PERF_X86_RAPL_PREP, "PERF_X86_RAPL_PREP",
- rapl_cpu_prepare, NULL);
- if (ret)
- goto out;
-
ret = cpuhp_setup_state(CPUHP_AP_PERF_X86_RAPL_ONLINE,
"AP_PERF_X86_RAPL_ONLINE",
rapl_cpu_online, rapl_cpu_offline);
if (ret)
- goto out1;
+ goto out;
ret = perf_pmu_register(&rapl_pmus->pmu, "power", -1);
if (ret)
- goto out2;
+ goto out1;
rapl_advertise();
return 0;
-out2:
- cpuhp_remove_state(CPUHP_AP_PERF_X86_RAPL_ONLINE);
out1:
- cpuhp_remove_state(CPUHP_PERF_X86_RAPL_PREP);
+ cpuhp_remove_state(CPUHP_AP_PERF_X86_RAPL_ONLINE);
out:
pr_warn("Initialization failed (%d), disabled\n", ret);
cleanup_rapl_pmus();
@@ -836,7 +829,6 @@ module_init(rapl_pmu_init);
static void __exit intel_rapl_exit(void)
{
cpuhp_remove_state_nocalls(CPUHP_AP_PERF_X86_RAPL_ONLINE);
- cpuhp_remove_state_nocalls(CPUHP_PERF_X86_RAPL_PREP);
perf_pmu_unregister(&rapl_pmus->pmu);
cleanup_rapl_pmus();
}
--- a/include/linux/cpuhotplug.h
+++ b/include/linux/cpuhotplug.h
@@ -10,7 +10,6 @@ enum cpuhp_state {
CPUHP_PERF_X86_PREPARE,
CPUHP_PERF_X86_UNCORE_PREP,
CPUHP_PERF_X86_AMD_UNCORE_PREP,
- CPUHP_PERF_X86_RAPL_PREP,
CPUHP_PERF_BFIN,
CPUHP_PERF_POWER,
CPUHP_PERF_SUPERH,
next prev parent reply other threads:[~2017-08-28 8:41 UTC|newest]
Thread overview: 88+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-08-28 8:04 [PATCH 4.9 00/84] 4.9.46-stable review Greg Kroah-Hartman
2017-08-28 8:04 ` [PATCH 4.9 01/84] sparc64: remove unnecessary log message Greg Kroah-Hartman
2017-08-28 8:04 ` [PATCH 4.9 02/84] af_key: do not use GFP_KERNEL in atomic contexts Greg Kroah-Hartman
2017-08-28 8:04 ` [PATCH 4.9 03/84] dccp: purge write queue in dccp_destroy_sock() Greg Kroah-Hartman
2017-08-28 8:04 ` [PATCH 4.9 04/84] dccp: defer ccid_hc_tx_delete() at dismantle time Greg Kroah-Hartman
2017-08-28 8:04 ` [PATCH 4.9 05/84] ipv4: fix NULL dereference in free_fib_info_rcu() Greg Kroah-Hartman
2017-08-28 8:04 ` [PATCH 4.9 06/84] net_sched/sfq: update hierarchical backlog when drop packet Greg Kroah-Hartman
2017-08-28 8:04 ` [PATCH 4.9 07/84] net_sched: remove warning from qdisc_hash_add Greg Kroah-Hartman
2017-08-28 8:04 ` [PATCH 4.9 08/84] bpf: fix bpf_trace_printk on 32 bit archs Greg Kroah-Hartman
2017-08-28 8:04 ` [PATCH 4.9 09/84] openvswitch: fix skb_panic due to the incorrect actions attrlen Greg Kroah-Hartman
2017-08-28 8:04 ` [PATCH 4.9 10/84] ptr_ring: use kmalloc_array() Greg Kroah-Hartman
2017-08-28 8:04 ` [PATCH 4.9 11/84] ipv4: better IP_MAX_MTU enforcement Greg Kroah-Hartman
2017-08-28 8:04 ` [PATCH 4.9 12/84] nfp: fix infinite loop on umapping cleanup Greg Kroah-Hartman
2017-08-28 8:04 ` [PATCH 4.9 13/84] sctp: fully initialize the IPv6 address in sctp_v6_to_addr() Greg Kroah-Hartman
2017-08-28 8:04 ` [PATCH 4.9 14/84] tipc: fix use-after-free Greg Kroah-Hartman
2017-08-28 8:04 ` [PATCH 4.9 15/84] ipv6: reset fn->rr_ptr when replacing route Greg Kroah-Hartman
2017-08-28 8:04 ` [PATCH 4.9 16/84] ipv6: repair fib6 tree in failure case Greg Kroah-Hartman
2017-08-28 8:04 ` [PATCH 4.9 17/84] tcp: when rearming RTO, if RTO time is in past then fire RTO ASAP Greg Kroah-Hartman
2017-08-28 8:04 ` [PATCH 4.9 18/84] net/mlx4_core: Enable 4K UAR if SRIOV module parameter is not enabled Greg Kroah-Hartman
2017-08-28 8:04 ` [PATCH 4.9 19/84] irda: do not leak initialized list.dev to userspace Greg Kroah-Hartman
2017-08-28 8:04 ` [PATCH 4.9 20/84] net: sched: fix NULL pointer dereference when action calls some targets Greg Kroah-Hartman
2017-08-28 8:04 ` [PATCH 4.9 21/84] net_sched: fix order of queue length updates in qdisc_replace() Greg Kroah-Hartman
2017-08-28 8:04 ` [PATCH 4.9 22/84] bpf, verifier: add additional patterns to evaluate_reg_imm_alu Greg Kroah-Hartman
2017-08-28 8:04 ` [PATCH 4.9 23/84] bpf: adjust verifier heuristics Greg Kroah-Hartman
2017-08-28 8:04 ` [PATCH 4.9 24/84] bpf, verifier: fix alu ops against map_value{, _adj} register types Greg Kroah-Hartman
2017-08-28 8:04 ` [PATCH 4.9 25/84] bpf: fix mixed signed/unsigned derived min/max value bounds Greg Kroah-Hartman
2017-08-28 8:04 ` [PATCH 4.9 26/84] bpf/verifier: fix min/max handling in BPF_SUB Greg Kroah-Hartman
2017-08-28 8:04 ` [PATCH 4.9 27/84] Input: trackpoint - add new trackpoint firmware ID Greg Kroah-Hartman
2017-08-28 8:04 ` [PATCH 4.9 28/84] Input: elan_i2c - add ELAN0602 ACPI ID to support Lenovo Yoga310 Greg Kroah-Hartman
2017-08-28 8:04 ` [PATCH 4.9 29/84] Input: ALPS - fix two-finger scroll breakage in right side on ALPS touchpad Greg Kroah-Hartman
2017-08-28 8:04 ` [PATCH 4.9 30/84] KVM: s390: sthyi: fix sthyi inline assembly Greg Kroah-Hartman
2017-08-28 8:04 ` [PATCH 4.9 31/84] KVM: s390: sthyi: fix specification exception detection Greg Kroah-Hartman
2017-08-28 8:04 ` [PATCH 4.9 32/84] KVM: x86: block guest protection keys unless the host has them enabled Greg Kroah-Hartman
2017-08-28 8:04 ` [PATCH 4.9 33/84] ALSA: usb-audio: Add delay quirk for H650e/Jabra 550a USB headsets Greg Kroah-Hartman
2017-08-28 8:04 ` [PATCH 4.9 34/84] ALSA: core: Fix unexpected error at replacing user TLV Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 35/84] ALSA: hda - Add stereo mic quirk for Lenovo G50-70 (17aa:3978) Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 36/84] ALSA: firewire: fix NULL pointer dereference when releasing uninitialized data of iso-resource Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 37/84] ARCv2: PAE40: Explicitly set MSB counterpart of SLC region ops addresses Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 38/84] mm, shmem: fix handling /sys/kernel/mm/transparent_hugepage/shmem_enabled Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 39/84] i2c: designware: Fix system suspend Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 40/84] mm/madvise.c: fix freeing of locked page with MADV_FREE Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 41/84] fork: fix incorrect fput of ->exe_file causing use-after-free Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 42/84] mm/memblock.c: reversed logic in memblock_discard() Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 44/84] drm/atomic: If the atomic check fails, return its value first Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 45/84] drm: rcar-du: Fix crash in encoder failure error path Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 46/84] drm: rcar-du: Fix display timing controller parameter Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 47/84] drm: rcar-du: Fix H/V sync signal polarity configuration Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 48/84] tracing: Call clear_boot_tracer() at lateinit_sync Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 49/84] tracing: Fix kmemleak in tracing_map_array_free() Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 50/84] tracing: Fix freeing of filter in create_filter() when set_str is false Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 51/84] kbuild: linker script do not match C names unless LD_DEAD_CODE_DATA_ELIMINATION is configured Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 52/84] cifs: Fix df output for users with quota limits Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 53/84] cifs: return ENAMETOOLONG for overlong names in cifs_open()/cifs_lookup() Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 54/84] nfsd: Limit end of page list when decoding NFSv4 WRITE Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 55/84] ftrace: Check for null ret_stack on profile function graph entry function Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 56/84] perf/core: Fix group {cpu,task} validation Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 57/84] perf probe: Fix --funcs to show correct symbols for offline module Greg Kroah-Hartman
2017-08-28 8:05 ` Greg Kroah-Hartman [this message]
2017-08-28 8:05 ` [PATCH 4.9 59/84] timers: Fix excessive granularity of new timers after a nohz idle Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 60/84] x86/mm: Fix use-after-free of ldt_struct Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 61/84] net: sunrpc: svcsock: fix NULL-pointer exception Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 62/84] Revert "leds: handle suspend/resume in heartbeat trigger" Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 63/84] netfilter: nat: fix src map lookup Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 64/84] Bluetooth: hidp: fix possible might sleep error in hidp_session_thread Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 65/84] Bluetooth: cmtp: fix possible might sleep error in cmtp_session Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 66/84] Bluetooth: bnep: fix possible might sleep error in bnep_session Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 67/84] Revert "android: binder: Sanity check at binder ioctl" Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 68/84] binder: use group leader instead of open thread Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 69/84] binder: Use wake up hint for synchronous transactions Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 70/84] ANDROID: binder: fix proc->tsk check Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 71/84] iio: imu: adis16480: Fix acceleration scale factor for adis16480 Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 72/84] iio: hid-sensor-trigger: Fix the race with user space powering up sensors Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 73/84] staging: rtl8188eu: add RNX-N150NUB support Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 74/84] Clarify (and fix) MAX_LFS_FILESIZE macros Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 75/84] ntb_transport: fix qp count bug Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 76/84] ntb_transport: fix bug calculating num_qps_mw Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 77/84] NTB: ntb_test: fix bug printing ntb_perf results Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 78/84] ntb: no sleep in ntb_async_tx_submit Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 79/84] ntb: ntb_test: ensure the link is up before trying to configure the mws Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 80/84] ntb: transport shouldnt disable link due to bogus values in SPADs Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 81/84] ACPI: ioapic: Clear on-stack resource before using it Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 82/84] ACPI / APEI: Add missing synchronize_rcu() on NOTIFY_SCI removal Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 83/84] ACPI: EC: Fix regression related to wrong ECDT initialization order Greg Kroah-Hartman
2017-08-28 8:05 ` [PATCH 4.9 84/84] powerpc/mm: Ensure cpumask update is ordered Greg Kroah-Hartman
2017-08-28 19:39 ` [PATCH 4.9 00/84] 4.9.46-stable review Shuah Khan
2017-08-29 0:10 ` Guenter Roeck
2017-08-29 12:02 ` Sumit Semwal
2017-08-29 15:17 ` Greg Kroah-Hartman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170828080531.822052208@linuxfoundation.org \
--to=gregkh@linuxfoundation.org \
--cc=acme@redhat.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=bigeasy@linutronix.de \
--cc=eranian@google.com \
--cc=jinpu.wang@profitbricks.com \
--cc=jolsa@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=peterz@infradead.org \
--cc=stable@vger.kernel.org \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
--cc=vincent.weaver@maine.edu \
--cc=yasu.isimatu@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox