aboutsummaryrefslogtreecommitdiffstats
path: root/ipc/msg.c
diff options
context:
space:
mode:
Diffstat (limited to 'ipc/msg.c')
-rw-r--r--ipc/msg.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/ipc/msg.c b/ipc/msg.c
index af42ef8900a6..b1b796dad3f1 100644
--- a/ipc/msg.c
+++ b/ipc/msg.c
@@ -260,12 +260,20 @@ static void expunge_all(struct msg_queue *msq, int res)
260 while (tmp != &msq->q_receivers) { 260 while (tmp != &msq->q_receivers) {
261 struct msg_receiver *msr; 261 struct msg_receiver *msr;
262 262
263 /*
264 * Make sure that the wakeup doesnt preempt
265 * this CPU prematurely. (on PREEMPT_RT)
266 */
267 preempt_disable_rt();
268
263 msr = list_entry(tmp, struct msg_receiver, r_list); 269 msr = list_entry(tmp, struct msg_receiver, r_list);
264 tmp = tmp->next; 270 tmp = tmp->next;
265 msr->r_msg = NULL; 271 msr->r_msg = NULL;
266 wake_up_process(msr->r_tsk); 272 wake_up_process(msr->r_tsk);
267 smp_mb(); 273 smp_mb();
268 msr->r_msg = ERR_PTR(res); 274 msr->r_msg = ERR_PTR(res);
275
276 preempt_enable_rt();
269 } 277 }
270} 278}
271 279
@@ -612,6 +620,12 @@ static inline int pipelined_send(struct msg_queue *msq, struct msg_msg *msg)
612 !security_msg_queue_msgrcv(msq, msg, msr->r_tsk, 620 !security_msg_queue_msgrcv(msq, msg, msr->r_tsk,
613 msr->r_msgtype, msr->r_mode)) { 621 msr->r_msgtype, msr->r_mode)) {
614 622
623 /*
624 * Make sure that the wakeup doesnt preempt
625 * this CPU prematurely. (on PREEMPT_RT)
626 */
627 preempt_disable_rt();
628
615 list_del(&msr->r_list); 629 list_del(&msr->r_list);
616 if (msr->r_maxsize < msg->m_ts) { 630 if (msr->r_maxsize < msg->m_ts) {
617 msr->r_msg = NULL; 631 msr->r_msg = NULL;
@@ -625,9 +639,11 @@ static inline int pipelined_send(struct msg_queue *msq, struct msg_msg *msg)
625 wake_up_process(msr->r_tsk); 639 wake_up_process(msr->r_tsk);
626 smp_mb(); 640 smp_mb();
627 msr->r_msg = msg; 641 msr->r_msg = msg;
642 preempt_enable_rt();
628 643
629 return 1; 644 return 1;
630 } 645 }
646 preempt_enable_rt();
631 } 647 }
632 } 648 }
633 return 0; 649 return 0;