Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 10b84dad 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 fixlets"

* 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  perf/hwbp: Simplify the perf-hwbp code, fix documentation
  perf/x86/intel: Fix linear IP of PEBS real_ip on Haswell and later CPUs
parents ad0500ca f67b1503
Loading
Loading
Loading
Loading
+17 −8
Original line number Diff line number Diff line
@@ -1153,6 +1153,7 @@ static void setup_pebs_sample_data(struct perf_event *event,
	if (pebs == NULL)
		return;

	regs->flags &= ~PERF_EFLAGS_EXACT;
	sample_type = event->attr.sample_type;
	dsrc = sample_type & PERF_SAMPLE_DATA_SRC;

@@ -1197,7 +1198,6 @@ static void setup_pebs_sample_data(struct perf_event *event,
	 */
	*regs = *iregs;
	regs->flags = pebs->flags;
	set_linear_ip(regs, pebs->ip);

	if (sample_type & PERF_SAMPLE_REGS_INTR) {
		regs->ax = pebs->ax;
@@ -1233,13 +1233,22 @@ static void setup_pebs_sample_data(struct perf_event *event,
#endif
	}

	if (event->attr.precise_ip > 1 && x86_pmu.intel_cap.pebs_format >= 2) {
		regs->ip = pebs->real_ip;
	if (event->attr.precise_ip > 1) {
		/* Haswell and later have the eventing IP, so use it: */
		if (x86_pmu.intel_cap.pebs_format >= 2) {
			set_linear_ip(regs, pebs->real_ip);
			regs->flags |= PERF_EFLAGS_EXACT;
	} else if (event->attr.precise_ip > 1 && intel_pmu_pebs_fixup_ip(regs))
		} else {
			/* Otherwise use PEBS off-by-1 IP: */
			set_linear_ip(regs, pebs->ip);

			/* ... and try to fix it up using the LBR entries: */
			if (intel_pmu_pebs_fixup_ip(regs))
				regs->flags |= PERF_EFLAGS_EXACT;
	else
		regs->flags &= ~PERF_EFLAGS_EXACT;
		}
	} else
		set_linear_ip(regs, pebs->ip);


	if ((sample_type & (PERF_SAMPLE_ADDR | PERF_SAMPLE_PHYS_ADDR)) &&
	    x86_pmu.intel_cap.pebs_format >= 1)
+7 −23
Original line number Diff line number Diff line
@@ -427,16 +427,9 @@ EXPORT_SYMBOL_GPL(register_user_hw_breakpoint);
 * modify_user_hw_breakpoint - modify a user-space hardware breakpoint
 * @bp: the breakpoint structure to modify
 * @attr: new breakpoint attributes
 * @triggered: callback to trigger when we hit the breakpoint
 * @tsk: pointer to 'task_struct' of the process to which the address belongs
 */
int modify_user_hw_breakpoint(struct perf_event *bp, struct perf_event_attr *attr)
{
	u64 old_addr = bp->attr.bp_addr;
	u64 old_len = bp->attr.bp_len;
	int old_type = bp->attr.bp_type;
	int err = 0;

	/*
	 * modify_user_hw_breakpoint can be invoked with IRQs disabled and hence it
	 * will not be possible to raise IPIs that invoke __perf_event_disable.
@@ -451,27 +444,18 @@ int modify_user_hw_breakpoint(struct perf_event *bp, struct perf_event_attr *att
	bp->attr.bp_addr = attr->bp_addr;
	bp->attr.bp_type = attr->bp_type;
	bp->attr.bp_len = attr->bp_len;
	bp->attr.disabled = 1;

	if (attr->disabled)
		goto end;
	if (!attr->disabled) {
		int err = validate_hw_breakpoint(bp);

	err = validate_hw_breakpoint(bp);
	if (!err)
		perf_event_enable(bp);
		if (err)
			return err;

	if (err) {
		bp->attr.bp_addr = old_addr;
		bp->attr.bp_type = old_type;
		bp->attr.bp_len = old_len;
		if (!bp->attr.disabled)
		perf_event_enable(bp);

		return err;
		bp->attr.disabled = 0;
	}

end:
	bp->attr.disabled = attr->disabled;

	return 0;
}
EXPORT_SYMBOL_GPL(modify_user_hw_breakpoint);