Hi Davidlohr,

On 05/13/2014 10:27 PM, Davidlohr Bueso wrote:
The need for volatile is not obvious, document it.

Signed-off-by: Davidlohr Bueso <davidl...@hp.com>
Signed-off-by: Manfred Spraul <manf...@colorfullife.com>

In the long run, it would be great if the logic from sem.c would be moved to one central place.
- wake_up_sem_queue_prepare()
- wake_up_sem_queue_do()
- get_queue_result()
- the realtime compatible implementation that uses a completion instead of the busy loop in get_queue_result()

The code more or less just a reliable wait queue, nothing is specific to sysv: - the woken up task knows if it was woken up due to a signal or due to wake_up_process()
- wake_up_process() out of line, after dropping all locks
- only two lock operation (one for: check that task must wait and go to sleep, one for: identify the task that must be woken up).

With a "normal" wait queue, there are three lock operation (notice that task was woken up, cleanup)


---
  ipc/msg.c | 10 +++++++---
  1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/ipc/msg.c b/ipc/msg.c
index c2cdb5b..956cd65 100644
--- a/ipc/msg.c
+++ b/ipc/msg.c
@@ -42,9 +42,7 @@
  #include <linux/uaccess.h>
  #include "util.h"
-/*
- * one msg_receiver structure for each sleeping receiver:
- */
+/* one msg_receiver structure for each sleeping receiver */
  struct msg_receiver {
        struct list_head        r_list;
        struct task_struct      *r_tsk;
@@ -54,6 +52,12 @@ struct msg_receiver {
        long                    r_msgtype;
        long                    r_maxsize;
+ /*
+        * Mark r_msg volatile so that the compiler
+        * does not try to get smart and optimize
+        * it. We rely on this for the lockless
+        * receive algorithm.
+        */
        struct msg_msg          *volatile r_msg;
  };

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to