Commit 6c869e77 authored by Ingo Molnar's avatar Ingo Molnar
Browse files

Merge branch 'perf/urgent' into perf/core



Conflicts:
	arch/x86/kernel/apic/hw_nmi.c

Merge reason: Resolve conflict, queue up dependent patch.

Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parents e4e91ac4 ee6dcfa4
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -21,7 +21,7 @@ config X86
	select HAVE_UNSTABLE_SCHED_CLOCK
	select HAVE_IDE
	select HAVE_OPROFILE
	select HAVE_PERF_EVENTS if (!M386 && !M486)
	select HAVE_PERF_EVENTS
	select HAVE_IRQ_WORK
	select HAVE_IOREMAP_PROT
	select HAVE_KPROBES
+4 −3
Original line number Diff line number Diff line
@@ -17,9 +17,6 @@
#include <linux/nmi.h>
#include <linux/module.h>

/* For reliability, we're prepared to waste bits here. */
static DECLARE_BITMAP(backtrace_mask, NR_CPUS) __read_mostly;

#ifdef CONFIG_HARDLOCKUP_DETECTOR
u64 hw_nmi_get_sample_period(void)
{
@@ -27,6 +24,10 @@ u64 hw_nmi_get_sample_period(void)
}
#endif


/* For reliability, we're prepared to waste bits here. */
static DECLARE_BITMAP(backtrace_mask, NR_CPUS) __read_mostly;

#ifdef arch_trigger_all_cpu_backtrace
void arch_trigger_all_cpu_backtrace(void)
{
+20 −0
Original line number Diff line number Diff line
@@ -372,6 +372,20 @@ static void release_pmc_hardware(void) {}

#endif

static bool check_hw_exists(void)
{
	u64 val, val_new = 0;
	int ret = 0;

	val = 0xabcdUL;
	ret |= checking_wrmsrl(x86_pmu.perfctr, val);
	ret |= rdmsrl_safe(x86_pmu.perfctr, &val_new);
	if (ret || val != val_new)
		return false;

	return true;
}

static void reserve_ds_buffers(void);
static void release_ds_buffers(void);

@@ -1363,6 +1377,12 @@ void __init init_hw_perf_events(void)

	pmu_check_apic();

	/* sanity check that the hardware exists or is emulated */
	if (!check_hw_exists()) {
		pr_cont("Broken PMU hardware detected, software events only.\n");
		return;
	}

	pr_cont("%s PMU driver.\n", x86_pmu.name);

	if (x86_pmu.quirks)
+2 −0
Original line number Diff line number Diff line
@@ -295,6 +295,7 @@ ENDPROC(native_usergs_sysret64)
	.endm

/* save partial stack frame */
	.pushsection .kprobes.text, "ax"
ENTRY(save_args)
	XCPT_FRAME
	cld
@@ -334,6 +335,7 @@ ENTRY(save_args)
	ret
	CFI_ENDPROC
END(save_args)
	.popsection

ENTRY(save_rest)
	PARTIAL_FRAME 1 REST_SKIP+8
+4 −0
Original line number Diff line number Diff line
@@ -433,6 +433,10 @@ static int __kprobes hw_breakpoint_handler(struct die_args *args)
	dr6_p = (unsigned long *)ERR_PTR(args->err);
	dr6 = *dr6_p;

	/* If it's a single step, TRAP bits are random */
	if (dr6 & DR_STEP)
		return NOTIFY_DONE;

	/* Do an early return if no trap bits are set in DR6 */
	if ((dr6 & DR_TRAP_BITS) == 0)
		return NOTIFY_DONE;
Loading