Commit 8de3f7a7 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull perf fixes from Ingo Molnar:
 "Two kernel side fixes:

   - an Intel uncore PMU driver potential crash fix
   - a kprobes/perf-call-graph interaction fix"

* 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  perf/x86/intel: Use rdmsrl_safe() when initializing RAPL PMU
  kprobes/x86: Fix page-fault handling logic
parents b9312420 24223657
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -535,6 +535,7 @@ static int rapl_cpu_prepare(int cpu)
	struct rapl_pmu *pmu = per_cpu(rapl_pmu, cpu);
	int phys_id = topology_physical_package_id(cpu);
	u64 ms;
	u64 msr_rapl_power_unit_bits;

	if (pmu)
		return 0;
@@ -542,6 +543,9 @@ static int rapl_cpu_prepare(int cpu)
	if (phys_id < 0)
		return -1;

	if (!rdmsrl_safe(MSR_RAPL_POWER_UNIT, &msr_rapl_power_unit_bits))
		return -1;

	pmu = kzalloc_node(sizeof(*pmu), GFP_KERNEL, cpu_to_node(cpu));
	if (!pmu)
		return -1;
@@ -555,8 +559,7 @@ static int rapl_cpu_prepare(int cpu)
	 *
	 * we cache in local PMU instance
	 */
	rdmsrl(MSR_RAPL_POWER_UNIT, pmu->hw_unit);
	pmu->hw_unit = (pmu->hw_unit >> 8) & 0x1FULL;
	pmu->hw_unit = (msr_rapl_power_unit_bits >> 8) & 0x1FULL;
	pmu->pmu = &rapl_pmu_class;

	/*
@@ -677,7 +680,9 @@ static int __init rapl_pmu_init(void)
	cpu_notifier_register_begin();

	for_each_online_cpu(cpu) {
		rapl_cpu_prepare(cpu);
		ret = rapl_cpu_prepare(cpu);
		if (ret)
			goto out;
		rapl_cpu_init(cpu);
	}

@@ -700,6 +705,7 @@ static int __init rapl_pmu_init(void)
		hweight32(rapl_cntr_mask),
		ktime_to_ms(pmu->timer_interval));

out:
	cpu_notifier_register_done();

	return 0;
+7 −9
Original line number Diff line number Diff line
@@ -897,9 +897,10 @@ int __kprobes kprobe_fault_handler(struct pt_regs *regs, int trapnr)
	struct kprobe *cur = kprobe_running();
	struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();

	switch (kcb->kprobe_status) {
	case KPROBE_HIT_SS:
	case KPROBE_REENTER:
	if (unlikely(regs->ip == (unsigned long)cur->ainsn.insn)) {
		/* This must happen on single-stepping */
		WARN_ON(kcb->kprobe_status != KPROBE_HIT_SS &&
			kcb->kprobe_status != KPROBE_REENTER);
		/*
		 * We are here because the instruction being single
		 * stepped caused a page fault. We reset the current
@@ -914,9 +915,8 @@ int __kprobes kprobe_fault_handler(struct pt_regs *regs, int trapnr)
		else
			reset_current_kprobe();
		preempt_enable_no_resched();
		break;
	case KPROBE_HIT_ACTIVE:
	case KPROBE_HIT_SSDONE:
	} else if (kcb->kprobe_status == KPROBE_HIT_ACTIVE ||
		   kcb->kprobe_status == KPROBE_HIT_SSDONE) {
		/*
		 * We increment the nmissed count for accounting,
		 * we can also use npre/npostfault count for accounting
@@ -945,10 +945,8 @@ int __kprobes kprobe_fault_handler(struct pt_regs *regs, int trapnr)
		 * fixup routine could not handle it,
		 * Let do_page_fault() fix it.
		 */
		break;
	default:
		break;
	}

	return 0;
}