浏览代码

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: Robin Holt <holt@sgi.com>
Signed-off-by: Dean Nelson <dcn@sgi.com>
Cc: <stable@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Robin Holt 16 年之前
父节点
当前提交
69b3bb65fa
共有 2 个文件被更改,包括 6 次插入5 次删除
  1. 5 4
      drivers/misc/sgi-xp/xpc_sn2.c
  2. 1 1
      drivers/misc/sgi-xp/xpc_uv.c

+ 5 - 4
drivers/misc/sgi-xp/xpc_sn2.c

@@ -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)
 			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,
 	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,
 	 * 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)
 	 * 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

+ 1 - 1
drivers/misc/sgi-xp/xpc_uv.c

@@ -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) {