diff options
Diffstat (limited to 'ipc/msg.c')
-rw-r--r-- | ipc/msg.c | 16 |
1 files changed, 16 insertions, 0 deletions
@@ -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; |