Skip to contentSkip to conversation

remove lockless receive from ipc/msg.c

RFC PATCH New Manfred Spraul 1 participant 1 message Nov 9, 2002

lore
Share & tools
lore
#0 lore raw

RFC PATCH 1/1 remove lockless receive from ipc/msg.c

Bernhard Kaindl noticed a race in the lockless receive path of msgrcv():
If a signal wakes up the thread that sleeps in msgrcv(), then pipelined_send() can access an already invalid structure. This can cause oopses during wake_up_process().

http://marc.theaimsgroup.com/?l=linux-kernel&m=103599896511067&w=2

The simplest solution is to remove the lockless receive, and always acquire the spinlock during receive.
Unfortunately this would increase the number of spinlock operations for ipc/msg.c by up to 50%. (from 2 to 3 spinlock calls for msgrcv()+msgsnd())

Any other ideas? Are there workloads that heavily rely on sysv msg?

Patch against 2.5.46 is attached.
--
Manfred

ipc/msg.c +0 -4
@@ -799,10 +799,6 @@
 		schedule();
 		current->state = TASK_RUNNING;
 
-		msg = (struct msg_msg*) msr_d.r_msg;
-		if(!IS_ERR(msg)) 
-			goto out_success;
-
 		msq = msg_lock(msqid);
 		msg = (struct msg_msg*)msr_d.r_msg;
 		if(!IS_ERR(msg)) {