[ppc64] Use an atomic_t instead of a volatile unsigned long, from Stephen Rothwell


---

 arch/ppc64/kernel/viopath.c |   10 ++++++----
 1 files changed, 6 insertions(+), 4 deletions(-)

diff -puN arch/ppc64/kernel/viopath.c~ppc64-viopath_fix arch/ppc64/kernel/viopath.c
--- 25/arch/ppc64/kernel/viopath.c~ppc64-viopath_fix	2004-01-13 23:23:11.000000000 -0800
+++ 25-akpm/arch/ppc64/kernel/viopath.c	2004-01-13 23:23:11.000000000 -0800
@@ -85,7 +85,7 @@ static void handleMonitorEvent(struct Hv
 struct doneAllocParms_t {
 	struct semaphore *sem;
 	int number;
-	volatile unsigned long *wait_atomic;
+	atomic_t *wait_atomic;
 	int used_wait_atomic;
 };
 
@@ -531,7 +531,7 @@ static void viopath_donealloc(void *parm
 
 	parmsp->number = number;
 	if (parmsp->used_wait_atomic)
-		*(parmsp->wait_atomic) = 0;
+		atomic_set(parmsp->wait_atomic, 0);
 	else
 		up(parmsp->sem);
 }
@@ -540,10 +540,11 @@ static int allocateEvents(HvLpIndex remo
 {
 	struct doneAllocParms_t parms;
 	DECLARE_MUTEX_LOCKED(Semaphore);
-	volatile unsigned long wait_atomic = 1;
+	atomic_t wait_atomic;
 
 	if (in_atomic()) {
 		parms.used_wait_atomic = 1;
+		atomic_set(&wait_atomic, 1);
 		parms.wait_atomic = &wait_atomic;
 	} else {
 		parms.used_wait_atomic = 0;
@@ -552,7 +553,7 @@ static int allocateEvents(HvLpIndex remo
 	mf_allocateLpEvents(remoteLp, HvLpEvent_Type_VirtualIo, 250,	/* It would be nice to put a real number here! */
 			    numEvents, &viopath_donealloc, &parms);
 	if (in_atomic()) {
-		while (wait_atomic)
+		while (atomic_read(&wait_atomic))
 			mb();
 	} else
 		down(&Semaphore);
@@ -656,6 +657,7 @@ int viopath_close(HvLpIndex remoteLp, in
 
 	spin_unlock_irqrestore(&statuslock, flags);
 
+	doneAllocParms.used_wait_atomic = 0;
 	doneAllocParms.sem = &Semaphore;
 	mf_deallocateLpEvents(remoteLp, HvLpEvent_Type_VirtualIo,
 			      numReq, &viopath_donealloc, &doneAllocParms);

_