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

Commit a3af28c9 authored by Sahitya Tummala's avatar Sahitya Tummala
Browse files

f2fs: do not use mutex lock in atomic context



Fix below warning coming because of using mutex lock in atomic context.

BUG: sleeping function called from invalid context at kernel/locking/mutex.c:98
in_atomic(): 1, irqs_disabled(): 0, pid: 585, name: sh
Preemption disabled at: __radix_tree_preload+0x28/0x130
Call trace:
 dump_backtrace+0x0/0x2b4
 show_stack+0x20/0x28
 dump_stack+0xa8/0xe0
 ___might_sleep+0x144/0x194
 __might_sleep+0x58/0x8c
 mutex_lock+0x2c/0x48
 f2fs_trace_pid+0x88/0x14c
 f2fs_set_node_page_dirty+0xd0/0x184

Do not use f2fs_radix_tree_insert() to avoid doing cond_resched() with
spin_lock() acquired.

Change-Id: I6ccb99eb314d78337f1ab448862e1ad7828117c4
Signed-off-by: default avatarSahitya Tummala <stummala@codeaurora.org>
parent 6c457fab
Loading
Loading
Loading
Loading
+13 −7
Original line number Diff line number Diff line
@@ -17,7 +17,7 @@
#include "trace.h"

static RADIX_TREE(pids, GFP_ATOMIC);
static struct mutex pids_lock;
static spinlock_t pids_lock;
static struct last_io_info last_io;

static inline void __print_last_io(void)
@@ -61,23 +61,29 @@ void f2fs_trace_pid(struct page *page)

	set_page_private(page, (unsigned long)pid);

retry:
	if (radix_tree_preload(GFP_NOFS))
		return;

	mutex_lock(&pids_lock);
	spin_lock(&pids_lock);
	p = radix_tree_lookup(&pids, pid);
	if (p == current)
		goto out;
	if (p)
		radix_tree_delete(&pids, pid);

	f2fs_radix_tree_insert(&pids, pid, current);
	if (radix_tree_insert(&pids, pid, current)) {
		spin_unlock(&pids_lock);
		radix_tree_preload_end();
		cond_resched();
		goto retry;
	}

	trace_printk("%3x:%3x %4x %-16s\n",
			MAJOR(inode->i_sb->s_dev), MINOR(inode->i_sb->s_dev),
			pid, current->comm);
out:
	mutex_unlock(&pids_lock);
	spin_unlock(&pids_lock);
	radix_tree_preload_end();
}

@@ -122,7 +128,7 @@ void f2fs_trace_ios(struct f2fs_io_info *fio, int flush)

void f2fs_build_trace_ios(void)
{
	mutex_init(&pids_lock);
	spin_lock_init(&pids_lock);
}

#define PIDVEC_SIZE	128
@@ -150,7 +156,7 @@ void f2fs_destroy_trace_ios(void)
	pid_t next_pid = 0;
	unsigned int found;

	mutex_lock(&pids_lock);
	spin_lock(&pids_lock);
	while ((found = gang_lookup_pids(pid, next_pid, PIDVEC_SIZE))) {
		unsigned idx;

@@ -158,5 +164,5 @@ void f2fs_destroy_trace_ios(void)
		for (idx = 0; idx < found; idx++)
			radix_tree_delete(&pids, pid[idx]);
	}
	mutex_unlock(&pids_lock);
	spin_unlock(&pids_lock);
}