diff options
author | Ingo Molnar <mingo@elte.hu> | 2009-07-03 08:30:12 -0500 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2009-07-24 12:46:53 +0200 |
commit | 3c96a21d186d7cadff3e356ecbea8ee9ad2692aa (patch) | |
tree | 387a607c5cff5b23c16d599ac78fadbbba6ba163 /ipc/msg.c | |
parent | 769610edf15e38b8fa5f6beac8e6bfaeaff690d1 (diff) | |
download | lwn-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/msg.c')
-rw-r--r-- | ipc/msg.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/ipc/msg.c b/ipc/msg.c index 2ceab7f12fcb..6de2720b369b 100644 --- a/ipc/msg.c +++ b/ipc/msg.c @@ -259,12 +259,20 @@ static void expunge_all(struct msg_queue *msq, int res) while (tmp != &msq->q_receivers) { struct msg_receiver *msr; + /* + * Make sure that the wakeup doesnt preempt + * this CPU prematurely. (on PREEMPT_RT) + */ + preempt_disable_rt(); + msr = list_entry(tmp, struct msg_receiver, r_list); tmp = tmp->next; msr->r_msg = NULL; wake_up_process(msr->r_tsk); smp_mb(); msr->r_msg = ERR_PTR(res); + + preempt_enable_rt(); } } @@ -611,6 +619,12 @@ static inline int pipelined_send(struct msg_queue *msq, struct msg_msg *msg) !security_msg_queue_msgrcv(msq, msg, msr->r_tsk, msr->r_msgtype, msr->r_mode)) { + /* + * Make sure that the wakeup doesnt preempt + * this CPU prematurely. (on PREEMPT_RT) + */ + preempt_disable_rt(); + list_del(&msr->r_list); if (msr->r_maxsize < msg->m_ts) { msr->r_msg = NULL; @@ -624,9 +638,11 @@ static inline int pipelined_send(struct msg_queue *msq, struct msg_msg *msg) wake_up_process(msr->r_tsk); smp_mb(); msr->r_msg = msg; + preempt_enable_rt(); return 1; } + preempt_enable_rt(); } } return 0; |