From 4893ccf6a0dc195eea1aabc7b44ea4fa1b18ab54 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Tue, 13 Jan 2015 21:41:08 -0800 Subject: [PATCH] 3.10-stable patches added patches: btrfs-don-t-delay-inode-ref-updates-during-log-replay.patch perf-fix-events-installation-during-moving-group.patch perf-session-do-not-fail-on-processing-out-of-order-event.patch perf-x86-intel-uncore-make-sure-only-uncore-events-are-collected.patch --- ...-inode-ref-updates-during-log-replay.patch | 50 +++++++++++ ...nts-installation-during-moving-group.patch | 76 ++++++++++++++++ ...ail-on-processing-out-of-order-event.patch | 86 ++++++++++++++++++ ...ure-only-uncore-events-are-collected.patch | 89 +++++++++++++++++++ queue-3.10/series | 4 + 5 files changed, 305 insertions(+) create mode 100644 queue-3.10/btrfs-don-t-delay-inode-ref-updates-during-log-replay.patch create mode 100644 queue-3.10/perf-fix-events-installation-during-moving-group.patch create mode 100644 queue-3.10/perf-session-do-not-fail-on-processing-out-of-order-event.patch create mode 100644 queue-3.10/perf-x86-intel-uncore-make-sure-only-uncore-events-are-collected.patch diff --git a/queue-3.10/btrfs-don-t-delay-inode-ref-updates-during-log-replay.patch b/queue-3.10/btrfs-don-t-delay-inode-ref-updates-during-log-replay.patch new file mode 100644 index 00000000000..8ee5c54440a --- /dev/null +++ b/queue-3.10/btrfs-don-t-delay-inode-ref-updates-during-log-replay.patch @@ -0,0 +1,50 @@ +From 6f8960541b1eb6054a642da48daae2320fddba93 Mon Sep 17 00:00:00 2001 +From: Chris Mason +Date: Wed, 31 Dec 2014 12:18:29 -0500 +Subject: Btrfs: don't delay inode ref updates during log replay + +From: Chris Mason + +commit 6f8960541b1eb6054a642da48daae2320fddba93 upstream. + +Commit 1d52c78afbb (Btrfs: try not to ENOSPC on log replay) added a +check to skip delayed inode updates during log replay because it +confuses the enospc code. But the delayed processing will end up +ignoring delayed refs from log replay because the inode itself wasn't +put through the delayed code. + +This can end up triggering a warning at commit time: + +WARNING: CPU: 2 PID: 778 at fs/btrfs/delayed-inode.c:1410 btrfs_assert_delayed_root_empty+0x32/0x34() + +Which is repeated for each commit because we never process the delayed +inode ref update. + +The fix used here is to change btrfs_delayed_delete_inode_ref to return +an error if we're currently in log replay. The caller will do the ref +deletion immediately and everything will work properly. + +Signed-off-by: Chris Mason +Signed-off-by: Greg Kroah-Hartman + +--- + fs/btrfs/delayed-inode.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +--- a/fs/btrfs/delayed-inode.c ++++ b/fs/btrfs/delayed-inode.c +@@ -1843,6 +1843,14 @@ int btrfs_delayed_update_inode(struct bt + struct btrfs_delayed_node *delayed_node; + int ret = 0; + ++ /* ++ * we don't do delayed inode updates during log recovery because it ++ * leads to enospc problems. This means we also can't do ++ * delayed inode refs ++ */ ++ if (BTRFS_I(inode)->root->fs_info->log_root_recovering) ++ return -EAGAIN; ++ + delayed_node = btrfs_get_or_create_delayed_node(inode); + if (IS_ERR(delayed_node)) + return PTR_ERR(delayed_node); diff --git a/queue-3.10/perf-fix-events-installation-during-moving-group.patch b/queue-3.10/perf-fix-events-installation-during-moving-group.patch new file mode 100644 index 00000000000..1650b1a99cc --- /dev/null +++ b/queue-3.10/perf-fix-events-installation-during-moving-group.patch @@ -0,0 +1,76 @@ +From 9fc81d87420d0d3fd62d5e5529972c0ad9eab9cc Mon Sep 17 00:00:00 2001 +From: Jiri Olsa +Date: Wed, 10 Dec 2014 21:23:51 +0100 +Subject: perf: Fix events installation during moving group + +From: Jiri Olsa + +commit 9fc81d87420d0d3fd62d5e5529972c0ad9eab9cc upstream. + +We allow PMU driver to change the cpu on which the event +should be installed to. This happened in patch: + + e2d37cd213dc ("perf: Allow the PMU driver to choose the CPU on which to install events") + +This patch also forces all the group members to follow +the currently opened events cpu if the group happened +to be moved. + +This and the change of event->cpu in perf_install_in_context() +function introduced in: + + 0cda4c023132 ("perf: Introduce perf_pmu_migrate_context()") + +forces group members to change their event->cpu, +if the currently-opened-event's PMU changed the cpu +and there is a group move. + +Above behaviour causes problem for breakpoint events, +which uses event->cpu to touch cpu specific data for +breakpoints accounting. By changing event->cpu, some +breakpoints slots were wrongly accounted for given +cpu. + +Vinces's perf fuzzer hit this issue and caused following +WARN on my setup: + + WARNING: CPU: 0 PID: 20214 at arch/x86/kernel/hw_breakpoint.c:119 arch_install_hw_breakpoint+0x142/0x150() + Can't find any breakpoint slot + [...] + +This patch changes the group moving code to keep the event's +original cpu. + +Reported-by: Vince Weaver +Signed-off-by: Jiri Olsa +Cc: Arnaldo Carvalho de Melo +Cc: Frederic Weisbecker +Cc: Linus Torvalds +Cc: Peter Zijlstra +Cc: Stephane Eranian +Cc: Vince Weaver +Cc: Yan, Zheng +Link: http://lkml.kernel.org/r/1418243031-20367-3-git-send-email-jolsa@kernel.org +Signed-off-by: Ingo Molnar +Signed-off-by: Greg Kroah-Hartman + +--- + kernel/events/core.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/kernel/events/core.c ++++ b/kernel/events/core.c +@@ -6887,11 +6887,11 @@ SYSCALL_DEFINE5(perf_event_open, + + if (move_group) { + synchronize_rcu(); +- perf_install_in_context(ctx, group_leader, event->cpu); ++ perf_install_in_context(ctx, group_leader, group_leader->cpu); + get_ctx(ctx); + list_for_each_entry(sibling, &group_leader->sibling_list, + group_entry) { +- perf_install_in_context(ctx, sibling, event->cpu); ++ perf_install_in_context(ctx, sibling, sibling->cpu); + get_ctx(ctx); + } + } diff --git a/queue-3.10/perf-session-do-not-fail-on-processing-out-of-order-event.patch b/queue-3.10/perf-session-do-not-fail-on-processing-out-of-order-event.patch new file mode 100644 index 00000000000..d394723d8e4 --- /dev/null +++ b/queue-3.10/perf-session-do-not-fail-on-processing-out-of-order-event.patch @@ -0,0 +1,86 @@ +From f61ff6c06dc8f32c7036013ad802c899ec590607 Mon Sep 17 00:00:00 2001 +From: Jiri Olsa +Date: Wed, 26 Nov 2014 16:39:31 +0100 +Subject: perf session: Do not fail on processing out of order event + +From: Jiri Olsa + +commit f61ff6c06dc8f32c7036013ad802c899ec590607 upstream. + +Linus reported perf report command being interrupted due to processing +of 'out of order' event, with following error: + + Timestamp below last timeslice flush + 0x5733a8 [0x28]: failed to process type: 3 + +I could reproduce the issue and in my case it was caused by one CPU +(mmap) being behind during record and userspace mmap reader seeing the +data after other CPUs data were already stored. + +This is expected under some circumstances because we need to limit the +number of events that we queue for reordering when we receive a +PERF_RECORD_FINISHED_ROUND or when we force flush due to memory +pressure. + +Reported-by: Linus Torvalds +Signed-off-by: Jiri Olsa +Acked-by: Ingo Molnar +Cc: Andi Kleen +Cc: Corey Ashford +Cc: David Ahern +Cc: Frederic Weisbecker +Cc: Ingo Molnar +Cc: Linus Torvalds +Cc: Matt Fleming +Cc: Namhyung Kim +Cc: Paul Mackerras +Cc: Peter Zijlstra +Cc: Stephane Eranian +Link: http://lkml.kernel.org/r/1417016371-30249-1-git-send-email-jolsa@kernel.org +Signed-off-by: Arnaldo Carvalho de Melo +[zhangzhiqiang: backport to 3.10: + - adjust context + - commit f61ff6c06d struct events_stats was defined in tools/perf/util/event.h + while 3.10 stable defined in tools/perf/util/hist.h. + - 3.10 stable there is no pr_oe_time() which used for debug. + - After the above adjustments, becomes same to the original patch: + https://github.com/torvalds/linux/commit/f61ff6c06dc8f32c7036013ad802c899ec590607 +] +Signed-off-by: Zhiqiang Zhang +Signed-off-by: Greg Kroah-Hartman +--- + tools/perf/util/hist.h | 1 + + tools/perf/util/session.c | 5 +++-- + 2 files changed, 4 insertions(+), 2 deletions(-) + +--- a/tools/perf/util/hist.h ++++ b/tools/perf/util/hist.h +@@ -34,6 +34,7 @@ struct events_stats { + u32 nr_invalid_chains; + u32 nr_unknown_id; + u32 nr_unprocessable_samples; ++ u32 nr_unordered_events; + }; + + enum hist_column { +--- a/tools/perf/util/session.c ++++ b/tools/perf/util/session.c +@@ -656,8 +656,7 @@ static int perf_session_queue_event(stru + return -ETIME; + + if (timestamp < s->ordered_samples.last_flush) { +- printf("Warning: Timestamp below last timeslice flush\n"); +- return -EINVAL; ++ s->stats.nr_unordered_events++; + } + + if (!list_empty(sc)) { +@@ -1057,6 +1056,8 @@ static void perf_session__warn_about_err + "Do you have a KVM guest running and not using 'perf kvm'?\n", + session->stats.nr_unprocessable_samples); + } ++ if (session->stats.nr_unordered_events != 0) ++ ui__warning("%u out of order events recorded.\n", session->stats.nr_unordered_events); + } + + #define session_done() (*(volatile int *)(&session_done)) diff --git a/queue-3.10/perf-x86-intel-uncore-make-sure-only-uncore-events-are-collected.patch b/queue-3.10/perf-x86-intel-uncore-make-sure-only-uncore-events-are-collected.patch new file mode 100644 index 00000000000..741e93b831e --- /dev/null +++ b/queue-3.10/perf-x86-intel-uncore-make-sure-only-uncore-events-are-collected.patch @@ -0,0 +1,89 @@ +From af91568e762d04931dcbdd6bef4655433d8b9418 Mon Sep 17 00:00:00 2001 +From: Jiri Olsa +Date: Wed, 10 Dec 2014 21:23:50 +0100 +Subject: perf/x86/intel/uncore: Make sure only uncore events are collected + +From: Jiri Olsa + +commit af91568e762d04931dcbdd6bef4655433d8b9418 upstream. + +The uncore_collect_events functions assumes that event group +might contain only uncore events which is wrong, because it +might contain any type of events. + +This bug leads to uncore framework touching 'not' uncore events, +which could end up all sorts of bugs. + +One was triggered by Vince's perf fuzzer, when the uncore code +touched breakpoint event private event space as if it was uncore +event and caused BUG: + + BUG: unable to handle kernel paging request at ffffffff82822068 + IP: [] uncore_assign_events+0x188/0x250 + ... + +The code in uncore_assign_events() function was looking for +event->hw.idx data while the event was initialized as a +breakpoint with different members in event->hw union. + +This patch forces uncore_collect_events() to collect only uncore +events. + +Reported-by: Vince Weaver +Signed-off-by: Jiri Olsa +Cc: Arnaldo Carvalho de Melo +Cc: Frederic Weisbecker +Cc: Linus Torvalds +Cc: Peter Zijlstra +Cc: Stephane Eranian +Cc: Yan, Zheng +Link: http://lkml.kernel.org/r/1418243031-20367-2-git-send-email-jolsa@kernel.org +Signed-off-by: Ingo Molnar +Signed-off-by: Greg Kroah-Hartman + +--- + arch/x86/kernel/cpu/perf_event_intel_uncore.c | 22 +++++++++++++++++++--- + 1 file changed, 19 insertions(+), 3 deletions(-) + +--- a/arch/x86/kernel/cpu/perf_event_intel_uncore.c ++++ b/arch/x86/kernel/cpu/perf_event_intel_uncore.c +@@ -2657,6 +2657,17 @@ static struct intel_uncore_box *uncore_e + return uncore_pmu_to_box(uncore_event_to_pmu(event), smp_processor_id()); + } + ++/* ++ * Using uncore_pmu_event_init pmu event_init callback ++ * as a detection point for uncore events. ++ */ ++static int uncore_pmu_event_init(struct perf_event *event); ++ ++static bool is_uncore_event(struct perf_event *event) ++{ ++ return event->pmu->event_init == uncore_pmu_event_init; ++} ++ + static int + uncore_collect_events(struct intel_uncore_box *box, struct perf_event *leader, bool dogrp) + { +@@ -2671,13 +2682,18 @@ uncore_collect_events(struct intel_uncor + return -EINVAL; + + n = box->n_events; +- box->event_list[n] = leader; +- n++; ++ ++ if (is_uncore_event(leader)) { ++ box->event_list[n] = leader; ++ n++; ++ } ++ + if (!dogrp) + return n; + + list_for_each_entry(event, &leader->sibling_list, group_entry) { +- if (event->state <= PERF_EVENT_STATE_OFF) ++ if (!is_uncore_event(event) || ++ event->state <= PERF_EVENT_STATE_OFF) + continue; + + if (n >= max_count) diff --git a/queue-3.10/series b/queue-3.10/series index 4f4ebda8c1e..7086e5ffff3 100644 --- a/queue-3.10/series +++ b/queue-3.10/series @@ -35,3 +35,7 @@ nfsd4-fix-xdr4-inclusion-of-escaped-char.patch nilfs2-fix-the-nilfs_iget-vs.-nilfs_new_inode-races.patch scripts-kernel-doc-don-t-eat-struct-members-with-__aligned.patch arm-mvebu-disable-i-o-coherency-on-non-smp-situations-on-armada-370-375-38x-xp.patch +btrfs-don-t-delay-inode-ref-updates-during-log-replay.patch +perf-x86-intel-uncore-make-sure-only-uncore-events-are-collected.patch +perf-fix-events-installation-during-moving-group.patch +perf-session-do-not-fail-on-processing-out-of-order-event.patch -- 2.47.3