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

Commit bee415ce authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge branch 'perf-fixes-for-linus' of...

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

* 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  perf probe: Init struct probe_point and set counter correctly
  hw-breakpoint: Keep track of dr7 local enable bits
  hw-breakpoints: Accept breakpoints on NULL address
  perf_events: Fix FORK events
parents 627fa177 388c3aab
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -450,6 +450,8 @@ struct thread_struct {
	struct perf_event	*ptrace_bps[HBP_NUM];
	/* Debug status used for traps, single steps, etc... */
	unsigned long           debugreg6;
	/* Keep track of the exact dr7 value set by the user */
	unsigned long           ptrace_dr7;
	/* Fault info: */
	unsigned long		cr2;
	unsigned long		trap_no;
+7 −23
Original line number Diff line number Diff line
@@ -212,25 +212,6 @@ static int arch_check_va_in_kernelspace(unsigned long va, u8 hbp_len)
	return (va >= TASK_SIZE) && ((va + len - 1) >= TASK_SIZE);
}

/*
 * Store a breakpoint's encoded address, length, and type.
 */
static int arch_store_info(struct perf_event *bp)
{
	struct arch_hw_breakpoint *info = counter_arch_bp(bp);
	/*
	 * For kernel-addresses, either the address or symbol name can be
	 * specified.
	 */
	if (info->name)
		info->address = (unsigned long)
				kallsyms_lookup_name(info->name);
	if (info->address)
		return 0;

	return -EINVAL;
}

int arch_bp_generic_fields(int x86_len, int x86_type,
			   int *gen_len, int *gen_type)
{
@@ -362,10 +343,13 @@ int arch_validate_hwbkpt_settings(struct perf_event *bp,
		return ret;
	}

	ret = arch_store_info(bp);

	if (ret < 0)
		return ret;
	/*
	 * For kernel-addresses, either the address or symbol name can be
	 * specified.
	 */
	if (info->name)
		info->address = (unsigned long)
				kallsyms_lookup_name(info->name);
	/*
	 * Check that the low-order bits of the address are appropriate
	 * for the alignment implied by len.
+5 −2
Original line number Diff line number Diff line
@@ -702,7 +702,7 @@ static unsigned long ptrace_get_debugreg(struct task_struct *tsk, int n)
	} else if (n == 6) {
		val = thread->debugreg6;
	 } else if (n == 7) {
		val = ptrace_get_dr7(thread->ptrace_bps);
		val = thread->ptrace_dr7;
	}
	return val;
}
@@ -778,8 +778,11 @@ int ptrace_set_debugreg(struct task_struct *tsk, int n, unsigned long val)
			return rc;
	}
	/* All that's left is DR7 */
	if (n == 7)
	if (n == 7) {
		rc = ptrace_write_dr7(tsk, val);
		if (!rc)
			thread->ptrace_dr7 = val;
	}

ret_path:
	return rc;
+5 −6
Original line number Diff line number Diff line
@@ -3259,8 +3259,6 @@ static void perf_event_task_output(struct perf_event *event,
	task_event->event_id.tid = perf_event_tid(event, task);
	task_event->event_id.ptid = perf_event_tid(event, current);

	task_event->event_id.time = perf_clock();

	perf_output_put(&handle, task_event->event_id);

	perf_output_end(&handle);
@@ -3268,7 +3266,7 @@ static void perf_event_task_output(struct perf_event *event,

static int perf_event_task_match(struct perf_event *event)
{
	if (event->state != PERF_EVENT_STATE_ACTIVE)
	if (event->state < PERF_EVENT_STATE_INACTIVE)
		return 0;

	if (event->cpu != -1 && event->cpu != smp_processor_id())
@@ -3300,7 +3298,7 @@ static void perf_event_task_event(struct perf_task_event *task_event)
	cpuctx = &get_cpu_var(perf_cpu_context);
	perf_event_task_ctx(&cpuctx->ctx, task_event);
	if (!ctx)
		ctx = rcu_dereference(task_event->task->perf_event_ctxp);
		ctx = rcu_dereference(current->perf_event_ctxp);
	if (ctx)
		perf_event_task_ctx(ctx, task_event);
	put_cpu_var(perf_cpu_context);
@@ -3331,6 +3329,7 @@ static void perf_event_task(struct task_struct *task,
			/* .ppid */
			/* .tid  */
			/* .ptid */
			.time = perf_clock(),
		},
	};

@@ -3380,7 +3379,7 @@ static void perf_event_comm_output(struct perf_event *event,

static int perf_event_comm_match(struct perf_event *event)
{
	if (event->state != PERF_EVENT_STATE_ACTIVE)
	if (event->state < PERF_EVENT_STATE_INACTIVE)
		return 0;

	if (event->cpu != -1 && event->cpu != smp_processor_id())
@@ -3500,7 +3499,7 @@ static void perf_event_mmap_output(struct perf_event *event,
static int perf_event_mmap_match(struct perf_event *event,
				   struct perf_mmap_event *mmap_event)
{
	if (event->state != PERF_EVENT_STATE_ACTIVE)
	if (event->state < PERF_EVENT_STATE_INACTIVE)
		return 0;

	if (event->cpu != -1 && event->cpu != smp_processor_id())
+3 −0
Original line number Diff line number Diff line
@@ -272,6 +272,7 @@ int synthesize_perf_probe_point(struct probe_point *pp)
	int ret;

	pp->probes[0] = buf = zalloc(MAX_CMDLEN);
	pp->found = 1;
	if (!buf)
		die("Failed to allocate memory by zalloc.");
	if (pp->offset) {
@@ -294,6 +295,7 @@ int synthesize_perf_probe_point(struct probe_point *pp)
error:
		free(pp->probes[0]);
		pp->probes[0] = NULL;
		pp->found = 0;
	}
	return ret;
}
@@ -455,6 +457,7 @@ void show_perf_probe_events(void)
	struct strlist *rawlist;
	struct str_node *ent;

	memset(&pp, 0, sizeof(pp));
	fd = open_kprobe_events(O_RDONLY, 0);
	rawlist = get_trace_kprobe_event_rawlist(fd);
	close(fd);