| From: Ingo Molnar <mingo@elte.hu> |
| Date: Fri, 3 Jul 2009 08:30:12 -0500 |
| Subject: 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> |
| |
| --- |
| ipc/msg.c | 16 +++++++++++++++- |
| 1 file changed, 15 insertions(+), 1 deletion(-) |
| |
| --- a/ipc/msg.c |
| +++ b/ipc/msg.c |
| @@ -188,6 +188,12 @@ static void expunge_all(struct msg_queue |
| struct msg_receiver *msr, *t; |
| |
| list_for_each_entry_safe(msr, t, &msq->q_receivers, r_list) { |
| + /* |
| + * Make sure that the wakeup doesnt preempt |
| + * this CPU prematurely. (on PREEMPT_RT) |
| + */ |
| + preempt_disable_rt(); |
| + |
| msr->r_msg = NULL; /* initialize expunge ordering */ |
| wake_up_process(msr->r_tsk); |
| /* |
| @@ -198,6 +204,8 @@ static void expunge_all(struct msg_queue |
| */ |
| smp_mb(); |
| msr->r_msg = ERR_PTR(res); |
| + |
| + preempt_enable_rt(); |
| } |
| } |
| |
| @@ -574,6 +582,11 @@ static inline int pipelined_send(struct |
| if (testmsg(msg, msr->r_msgtype, msr->r_mode) && |
| !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) { |
| @@ -595,12 +608,13 @@ static inline int pipelined_send(struct |
| */ |
| smp_mb(); |
| msr->r_msg = msg; |
| + preempt_enable_rt(); |
| |
| return 1; |
| } |
| + preempt_enable_rt(); |
| } |
| } |
| - |
| return 0; |
| } |
| |