aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/oprofile/event_buffer.c
diff options
context:
space:
mode:
authorJiri Kosina <jkosina@suse.cz>2007-03-28 12:12:34 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-03-28 16:58:02 -0400
commit4dfc896e90359df04c80da5ab08ec31e87846c43 (patch)
tree1d68ae9c2e07c87f7cbc2f4b5c10d98a6c60a874 /drivers/oprofile/event_buffer.c
parent6faee84b006af55bab9908741dd76916c8450be2 (diff)
[PATCH] oprofile: fix potential deadlock on oprofilefs_lock
nmi_cpu_setup() is called from hardirq context and acquires oprofilefs_lock. alloc_event_buffer() and oprofilefs_ulong_from_user() acquire this lock without disabling irqs, which could deadlock. Signed-off-by: Jiri Kosina <jkosina@suse.cz> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/oprofile/event_buffer.c')
-rw-r--r--drivers/oprofile/event_buffer.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/oprofile/event_buffer.c b/drivers/oprofile/event_buffer.c
index 00e937e9240e..e7fbac529935 100644
--- a/drivers/oprofile/event_buffer.c
+++ b/drivers/oprofile/event_buffer.c
@@ -70,11 +70,12 @@ void wake_up_buffer_waiter(void)
70int alloc_event_buffer(void) 70int alloc_event_buffer(void)
71{ 71{
72 int err = -ENOMEM; 72 int err = -ENOMEM;
73 unsigned long flags;
73 74
74 spin_lock(&oprofilefs_lock); 75 spin_lock_irqsave(&oprofilefs_lock, flags);
75 buffer_size = fs_buffer_size; 76 buffer_size = fs_buffer_size;
76 buffer_watershed = fs_buffer_watershed; 77 buffer_watershed = fs_buffer_watershed;
77 spin_unlock(&oprofilefs_lock); 78 spin_unlock_irqrestore(&oprofilefs_lock, flags);
78 79
79 if (buffer_watershed >= buffer_size) 80 if (buffer_watershed >= buffer_size)
80 return -EINVAL; 81 return -EINVAL;