[Cbe-oss-dev] [PATCH 2:5] spusched: fix the visibility of the flag SPU_CONTEXT_SWITCH_PENDING

Luke Browning lukebr at linux.vnet.ibm.com
Mon Apr 28 04:41:51 EST 2008


Fix the serialization of the flag SPU_CONTEXT_SWITCH_PENDING

synchronize_irq() provides the serialization for this flag which
is read with a simple load. This routine guarantees that the relevant
interrupt handlers are not running, so that the next time they do run 
they will see the update memory value. 

This must be done correctly so that exception handling code does not 
restart the mfc in the middle of a context switch while we are trying 
to atomically stop it and save state. 

Signed-off-by: Luke Browning <lukebr at linux.vnet.ibm.com>

---

Index: spufs/arch/powerpc/platforms/cell/spufs/switch.c
===================================================================
--- spufs.orig/arch/powerpc/platforms/cell/spufs/switch.c
+++ spufs/arch/powerpc/platforms/cell/spufs/switch.c
@@ -132,6 +132,13 @@ static inline void disable_interrupts(st
 	spu_int_mask_set(spu, 2, 0ul);
 	eieio();
 	spin_unlock_irq(&spu->register_lock);
+
+	/*
+	 * This flag needs to be set before calling synchronize_irq so
+	 * that the update will be visible to the relevant handlers
+	 * via a simple load.
+	 */
+	set_bit(SPU_CONTEXT_SWITCH_PENDING, &spu->flags);
 	synchronize_irq(spu->irqs[0]);
 	synchronize_irq(spu->irqs[1]);
 	synchronize_irq(spu->irqs[2]);
@@ -166,9 +173,8 @@ static inline void set_switch_pending(st
 	/* Save, Step 7:
 	 * Restore, Step 5:
 	 *     Set a software context switch pending flag.
+	 *     Done above in Step 3 - disable_interrupts().
 	 */
-	set_bit(SPU_CONTEXT_SWITCH_PENDING, &spu->flags);
-	mb();
 }
 
 static inline void save_mfc_cntl(struct spu_state *csa, struct spu *spu)





More information about the cbe-oss-dev mailing list