]> rtime.felk.cvut.cz Git - zynq/linux.git/blobdiff - ipc/msg.c
Merge branch '4.0.8-rt6'
[zynq/linux.git] / ipc / msg.c
index a7261d5cbc89be93c1f1bd41b39ebe9683e82a19..81c8dc60f7a7f5a078c19620b071f43db019d45c 100644 (file)
--- a/ipc/msg.c
+++ b/ipc/msg.c
@@ -188,6 +188,12 @@ static void expunge_all(struct msg_queue *msq, int res)
        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 *msq, int res)
                 */
                smp_mb();
                msr->r_msg = ERR_PTR(res);
+
+               preempt_enable_rt();
        }
 }
 
@@ -574,6 +582,11 @@ static inline int pipelined_send(struct msg_queue *msq, struct msg_msg *msg)
                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 msg_queue *msq, struct msg_msg *msg)
                                 */
                                smp_mb();
                                msr->r_msg = msg;
+                               preempt_enable_rt();
 
                                return 1;
                        }
+                       preempt_enable_rt();
                }
        }
-
        return 0;
 }