Commit 69b3bb65 authored by Robin Holt's avatar Robin Holt Committed by Linus Torvalds

sgi-xpc: ensure flags are updated before bte_copy

The clearing of the msg->flags needs a barrier between it and the notify
of the channel threads that the messages are cleaned and ready for use.
Signed-off-by: default avatarRobin Holt <holt@sgi.com>
Signed-off-by: default avatarDean Nelson <dcn@sgi.com>
Cc: <stable@kernel.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent de33c8db
...@@ -1836,6 +1836,7 @@ xpc_process_msg_chctl_flags_sn2(struct xpc_partition *part, int ch_number) ...@@ -1836,6 +1836,7 @@ xpc_process_msg_chctl_flags_sn2(struct xpc_partition *part, int ch_number)
*/ */
xpc_clear_remote_msgqueue_flags_sn2(ch); xpc_clear_remote_msgqueue_flags_sn2(ch);
smp_wmb(); /* ensure flags have been cleared before bte_copy */
ch_sn2->w_remote_GP.put = ch_sn2->remote_GP.put; ch_sn2->w_remote_GP.put = ch_sn2->remote_GP.put;
dev_dbg(xpc_chan, "w_remote_GP.put changed to %ld, partid=%d, " dev_dbg(xpc_chan, "w_remote_GP.put changed to %ld, partid=%d, "
...@@ -1934,7 +1935,7 @@ xpc_get_deliverable_payload_sn2(struct xpc_channel *ch) ...@@ -1934,7 +1935,7 @@ xpc_get_deliverable_payload_sn2(struct xpc_channel *ch)
break; break;
get = ch_sn2->w_local_GP.get; get = ch_sn2->w_local_GP.get;
rmb(); /* guarantee that .get loads before .put */ smp_rmb(); /* guarantee that .get loads before .put */
if (get == ch_sn2->w_remote_GP.put) if (get == ch_sn2->w_remote_GP.put)
break; break;
...@@ -2053,7 +2054,7 @@ xpc_allocate_msg_sn2(struct xpc_channel *ch, u32 flags, ...@@ -2053,7 +2054,7 @@ xpc_allocate_msg_sn2(struct xpc_channel *ch, u32 flags,
while (1) { while (1) {
put = ch_sn2->w_local_GP.put; put = ch_sn2->w_local_GP.put;
rmb(); /* guarantee that .put loads before .get */ smp_rmb(); /* guarantee that .put loads before .get */
if (put - ch_sn2->w_remote_GP.get < ch->local_nentries) { if (put - ch_sn2->w_remote_GP.get < ch->local_nentries) {
/* There are available message entries. We need to try /* There are available message entries. We need to try
...@@ -2186,7 +2187,7 @@ xpc_send_payload_sn2(struct xpc_channel *ch, u32 flags, void *payload, ...@@ -2186,7 +2187,7 @@ xpc_send_payload_sn2(struct xpc_channel *ch, u32 flags, void *payload,
* The preceding store of msg->flags must occur before the following * The preceding store of msg->flags must occur before the following
* load of local_GP->put. * load of local_GP->put.
*/ */
mb(); smp_mb();
/* see if the message is next in line to be sent, if so send it */ /* see if the message is next in line to be sent, if so send it */
...@@ -2287,7 +2288,7 @@ xpc_received_payload_sn2(struct xpc_channel *ch, void *payload) ...@@ -2287,7 +2288,7 @@ xpc_received_payload_sn2(struct xpc_channel *ch, void *payload)
* The preceding store of msg->flags must occur before the following * The preceding store of msg->flags must occur before the following
* load of local_GP->get. * load of local_GP->get.
*/ */
mb(); smp_mb();
/* /*
* See if this message is next in line to be acknowledged as having * See if this message is next in line to be acknowledged as having
......
...@@ -1423,7 +1423,7 @@ xpc_send_payload_uv(struct xpc_channel *ch, u32 flags, void *payload, ...@@ -1423,7 +1423,7 @@ xpc_send_payload_uv(struct xpc_channel *ch, u32 flags, void *payload,
atomic_inc(&ch->n_to_notify); atomic_inc(&ch->n_to_notify);
msg_slot->key = key; msg_slot->key = key;
wmb(); /* a non-NULL func must hit memory after the key */ smp_wmb(); /* a non-NULL func must hit memory after the key */
msg_slot->func = func; msg_slot->func = func;
if (ch->flags & XPC_C_DISCONNECTING) { if (ch->flags & XPC_C_DISCONNECTING) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment