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

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

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

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

* 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  ftrace: Revert 8ab2b7ef ftrace: Remove unnecessary disabling of irqs
  kprobes/trace: Fix kprobe selftest for gcc 4.6
  ftrace: Fix possible undefined return code
  oprofile, dcookies: Fix possible circular locking dependency
  oprofile: Fix locking dependency in sync_start()
  oprofile: Free potentially owned tasks in case of errors
  oprofile, x86: Add comments to IBS LVT offset initialization
parents 842c895d 5f127133
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -390,7 +390,8 @@ static unsigned int reserve_eilvt_offset(int offset, unsigned int new)

/*
 * If mask=1, the LVT entry does not generate interrupts while mask=0
 * enables the vector. See also the BKDGs.
 * enables the vector. See also the BKDGs. Must be called with
 * preemption disabled.
 */

int setup_APIC_eilvt(u8 offset, u8 vector, u8 msg_type, u8 mask)
+9 −4
Original line number Diff line number Diff line
@@ -609,16 +609,21 @@ static int setup_ibs_ctl(int ibs_eilvt_off)
	return 0;
}

/*
 * This runs only on the current cpu. We try to find an LVT offset and
 * setup the local APIC. For this we must disable preemption. On
 * success we initialize all nodes with this offset. This updates then
 * the offset in the IBS_CTL per-node msr. The per-core APIC setup of
 * the IBS interrupt vector is called from op_amd_setup_ctrs()/op_-
 * amd_cpu_shutdown() using the new offset.
 */
static int force_ibs_eilvt_setup(void)
{
	int offset;
	int ret;

	/*
	 * find the next free available EILVT entry, skip offset 0,
	 * pin search to this cpu
	 */
	preempt_disable();
	/* find the next free available EILVT entry, skip offset 0 */
	for (offset = 1; offset < APIC_EILVT_NR_MAX; offset++) {
		if (get_eilvt(offset))
			break;
+11 −10
Original line number Diff line number Diff line
@@ -141,6 +141,13 @@ static struct notifier_block module_load_nb = {
	.notifier_call = module_load_notify,
};

static void free_all_tasks(void)
{
	/* make sure we don't leak task structs */
	process_task_mortuary();
	process_task_mortuary();
}

int sync_start(void)
{
	int err;
@@ -148,8 +155,6 @@ int sync_start(void)
	if (!zalloc_cpumask_var(&marked_cpus, GFP_KERNEL))
		return -ENOMEM;

	mutex_lock(&buffer_mutex);

	err = task_handoff_register(&task_free_nb);
	if (err)
		goto out1;
@@ -166,7 +171,6 @@ int sync_start(void)
	start_cpu_work();

out:
	mutex_unlock(&buffer_mutex);
	return err;
out4:
	profile_event_unregister(PROFILE_MUNMAP, &munmap_nb);
@@ -174,6 +178,7 @@ int sync_start(void)
	profile_event_unregister(PROFILE_TASK_EXIT, &task_exit_nb);
out2:
	task_handoff_unregister(&task_free_nb);
	free_all_tasks();
out1:
	free_cpumask_var(marked_cpus);
	goto out;
@@ -182,20 +187,16 @@ int sync_start(void)

void sync_stop(void)
{
	/* flush buffers */
	mutex_lock(&buffer_mutex);
	end_cpu_work();
	unregister_module_notifier(&module_load_nb);
	profile_event_unregister(PROFILE_MUNMAP, &munmap_nb);
	profile_event_unregister(PROFILE_TASK_EXIT, &task_exit_nb);
	task_handoff_unregister(&task_free_nb);
	mutex_unlock(&buffer_mutex);
	flush_cpu_work();
	barrier();			/* do all of the above first */

	/* make sure we don't leak task structs */
	process_task_mortuary();
	process_task_mortuary();
	flush_cpu_work();

	free_all_tasks();
	free_cpumask_var(marked_cpus);
}

+3 −0
Original line number Diff line number Diff line
@@ -178,6 +178,8 @@ SYSCALL_DEFINE(lookup_dcookie)(u64 cookie64, char __user * buf, size_t len)
	/* FIXME: (deleted) ? */
	path = d_path(&dcs->path, kbuf, PAGE_SIZE);

	mutex_unlock(&dcookie_mutex);

	if (IS_ERR(path)) {
		err = PTR_ERR(path);
		goto out_free;
@@ -194,6 +196,7 @@ SYSCALL_DEFINE(lookup_dcookie)(u64 cookie64, char __user * buf, size_t len)

out_free:
	kfree(kbuf);
	return err;
out:
	mutex_unlock(&dcookie_mutex);
	return err;
+8 −1
Original line number Diff line number Diff line
@@ -2740,7 +2740,7 @@ static int ftrace_process_regex(struct ftrace_hash *hash,
{
	char *func, *command, *next = buff;
	struct ftrace_func_command *p;
	int ret;
	int ret = -EINVAL;

	func = strsep(&next, ":");

@@ -3330,6 +3330,7 @@ static int ftrace_process_locs(struct module *mod,
{
	unsigned long *p;
	unsigned long addr;
	unsigned long flags;

	mutex_lock(&ftrace_lock);
	p = start;
@@ -3346,7 +3347,13 @@ static int ftrace_process_locs(struct module *mod,
		ftrace_record_ip(addr);
	}

	/*
	 * Disable interrupts to prevent interrupts from executing
	 * code that is being modified.
	 */
	local_irq_save(flags);
	ftrace_update_code(mod);
	local_irq_restore(flags);
	mutex_unlock(&ftrace_lock);

	return 0;
Loading