[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); _