summaryrefslogtreecommitdiff
path: root/ipc/mqueue.c
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2009-07-03 08:30:12 -0500
committerThomas Gleixner <tglx@linutronix.de>2009-07-24 12:46:53 +0200
commit3c96a21d186d7cadff3e356ecbea8ee9ad2692aa (patch)
tree387a607c5cff5b23c16d599ac78fadbbba6ba163 /ipc/mqueue.c
parent769610edf15e38b8fa5f6beac8e6bfaeaff690d1 (diff)
downloadlwn-3c96a21d186d7cadff3e356ecbea8ee9ad2692aa.tar.gz
lwn-3c96a21d186d7cadff3e356ecbea8ee9ad2692aa.zip
ipc: Make the ipc code -rt aware
RT serializes the code with the (rt)spinlock but keeps preemption enabled. Some parts of the code need to be atomic nevertheless. Protect it with preempt_disable/enable_rt pairts. Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'ipc/mqueue.c')
-rw-r--r--ipc/mqueue.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/ipc/mqueue.c b/ipc/mqueue.c
index c5e68adc6732..63a47f7c0c40 100644
--- a/ipc/mqueue.c
+++ b/ipc/mqueue.c
@@ -820,12 +820,17 @@ static inline void pipelined_send(struct mqueue_inode_info *info,
struct msg_msg *message,
struct ext_wait_queue *receiver)
{
+ /*
+ * Keep them in one critical section for PREEMPT_RT:
+ */
+ preempt_disable_rt();
receiver->msg = message;
list_del(&receiver->list);
receiver->state = STATE_PENDING;
wake_up_process(receiver->task);
smp_wmb();
receiver->state = STATE_READY;
+ preempt_enable_nort();
}
/* pipelined_receive() - if there is task waiting in sys_mq_timedsend()