[Cbe-oss-dev] [PATCH 9/10 v2] MARS: remove separate atomic implementation
Yuji Mano
Yuji.Mano at am.sony.com
Fri Aug 29 08:09:52 EST 2008
This removes the atomic.h headers for both host and mpu. Since the atomics are
now used only in the mutex implementation, we get rid of the extra abstraction
and use the atomic intrinsics directly in the mutex implementations.
Signed-off-by: Yuji Mano <yuji.mano at am.sony.com>
---
v2:
- remove unnecessary clearing of phantom events
- save previous event mask and restore later
- unconditionally ack any remnant MFC_LLR_LOST_EVENT after restoring mask
include/Makefile.am | 2
include/host/mars/mars_atomic.h | 74 -----------------------------
include/mpu/mars/mars_atomic.h | 99 ----------------------------------------
src/host/lib/mars_mutex.c | 11 ++--
src/mpu/lib/mars_mutex.c | 28 ++++++++---
5 files changed, 27 insertions(+), 187 deletions(-)
--- a/include/Makefile.am
+++ b/include/Makefile.am
@@ -79,11 +79,9 @@ EXTRA_DIST = \
common/mars/mars_debug.h \
common/mars/mars_kernel_types.h \
common/mars/mars_workload_types.h \
- host/mars/mars_atomic.h \
host/mars/mars_elf.h \
host/mars/mars_timer.h \
host/mars/mars_workload_queue.h \
- mpu/mars/mars_atomic.h \
mpu/mars/mars_dma.h \
mpu/mars/mars_kernel.h \
mpu/mars/mars_timer.h \
--- a/include/host/mars/mars_atomic.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright 2008 Sony Corporation of America
- *
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this Library and associated documentation files (the
- * "Library"), to deal in the Library without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Library, and to
- * permit persons to whom the Library is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Library.
- *
- * If you modify the Library, you may copy and distribute your modified
- * version of the Library in object code or as an executable provided
- * that you also do one of the following:
- *
- * Accompany the modified version of the Library with the complete
- * corresponding machine-readable source code for the modified version
- * of the Library; or,
- *
- * Accompany the modified version of the Library with a written offer
- * for a complete machine-readable copy of the corresponding source
- * code of the modified version of the Library.
- *
- *
- * THE LIBRARY IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * LIBRARY OR THE USE OR OTHER DEALINGS IN THE LIBRARY.
- */
-
-#ifndef MARS_ATOMIC_H
-#define MARS_ATOMIC_H
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-#include <ppu_intrinsics.h>
-#include "mars/mars_debug.h"
-
-#define MARS_ATOMIC_ALIGNMENT_MASK 0x7f
-
-static inline int atomic_get(void *addr)
-{
- MARS_ASSERT(((uintptr_t)addr & MARS_ATOMIC_ALIGNMENT_MASK) == 0);
-
- return __lwarx(addr);
-}
-
-static inline int atomic_put(void *addr, uint32_t val)
-{
- MARS_ASSERT(((uintptr_t)addr & MARS_ATOMIC_ALIGNMENT_MASK) == 0);
-
- __lwsync();
- return __stwcx(addr, val);
-}
-
-static inline void atomic_sync(void)
-{
- __isync();
-}
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
--- a/include/mpu/mars/mars_atomic.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright 2008 Sony Corporation of America
- *
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this Library and associated documentation files (the
- * "Library"), to deal in the Library without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Library, and to
- * permit persons to whom the Library is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Library.
- *
- * If you modify the Library, you may copy and distribute your modified
- * version of the Library in object code or as an executable provided
- * that you also do one of the following:
- *
- * Accompany the modified version of the Library with the complete
- * corresponding machine-readable source code for the modified version
- * of the Library; or,
- *
- * Accompany the modified version of the Library with a written offer
- * for a complete machine-readable copy of the corresponding source
- * code of the modified version of the Library.
- *
- *
- * THE LIBRARY IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * LIBRARY OR THE USE OR OTHER DEALINGS IN THE LIBRARY.
- */
-
-#ifndef MARS_ATOMIC_H
-#define MARS_ATOMIC_H
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-#include <spu_mfcio.h>
-#include "mars/mars_debug.h"
-
-#define MARS_ATOMIC_ALIGNMENT_MASK 0x7f
-
-static inline void atomic_event_setup(void)
-{
- /* clear phantom events and set event mask */
- if (spu_stat_event_status())
- spu_write_event_ack(spu_read_event_status());
- spu_write_event_mask(MFC_LLR_LOST_EVENT);
-}
-
-static inline void atomic_event_restore(void)
-{
- /* clean up any remnant events, as needed */
- spu_write_event_mask(0);
-
- if (spu_stat_event_status()) {
- spu_read_event_status();
- spu_write_event_ack(MFC_LLR_LOST_EVENT);
- }
-}
-
-static inline void atomic_event_wait(void)
-{
- /* wait until reservation is lost */
- spu_read_event_status();
- spu_write_event_ack(MFC_LLR_LOST_EVENT);
-}
-
-static inline void atomic_get(void *ls, uint64_t ea)
-{
- MARS_ASSERT(((uintptr_t)ls & MARS_ATOMIC_ALIGNMENT_MASK) == 0);
- MARS_ASSERT((ea & MARS_ATOMIC_ALIGNMENT_MASK) == 0);
-
- mfc_getllar(ls, ea, 0, 0);
- mfc_read_atomic_status();
-}
-
-static inline int atomic_put(void *ls, uint64_t ea)
-{
- MARS_ASSERT(((uintptr_t)ls & MARS_ATOMIC_ALIGNMENT_MASK) == 0);
- MARS_ASSERT((ea & MARS_ATOMIC_ALIGNMENT_MASK) == 0);
-
- spu_dsync();
- mfc_putllc(ls, ea, 0, 0);
- return mfc_read_atomic_status() & MFC_PUTLLC_STATUS;
-}
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
--- a/src/host/lib/mars_mutex.c
+++ b/src/host/lib/mars_mutex.c
@@ -35,8 +35,9 @@
* LIBRARY OR THE USE OR OTHER DEALINGS IN THE LIBRARY.
*/
+#include <ppu_intrinsics.h>
+
#include "mars/mars_mutex.h"
-#include "mars/mars_atomic.h"
#include "mars/mars_error.h"
#include "mars/mars_debug.h"
@@ -47,6 +48,7 @@ int mars_mutex_initialize(struct mars_mu
MARS_ERROR_ALIGN);
mutex->lock = MARS_MUTEX_UNLOCKED;
+ __lwsync();
return MARS_SUCCESS;
}
@@ -59,10 +61,10 @@ int mars_mutex_lock(struct mars_mutex *m
do {
do {
- } while (atomic_get(&mutex->lock) == MARS_MUTEX_LOCKED);
- } while (!atomic_put(&mutex->lock, MARS_MUTEX_LOCKED));
+ } while (__lwarx(&mutex->lock) == MARS_MUTEX_LOCKED);
+ } while (!__stwcx(&mutex->lock, MARS_MUTEX_LOCKED));
- atomic_sync();
+ __isync();
return MARS_SUCCESS;
}
@@ -74,6 +76,7 @@ int mars_mutex_unlock(struct mars_mutex
MARS_ERROR_ALIGN);
MARS_CHECK_RET(mutex->lock == MARS_MUTEX_LOCKED, MARS_ERROR_STATE);
+ __lwsync();
mutex->lock = MARS_MUTEX_UNLOCKED;
return MARS_SUCCESS;
--- a/src/mpu/lib/mars_mutex.c
+++ b/src/mpu/lib/mars_mutex.c
@@ -35,8 +35,9 @@
* LIBRARY OR THE USE OR OTHER DEALINGS IN THE LIBRARY.
*/
+#include <spu_mfcio.h>
+
#include "mars/mars_mutex.h"
-#include "mars/mars_atomic.h"
#include "mars/mars_dma.h"
#include "mars/mars_error.h"
#include "mars/mars_debug.h"
@@ -76,23 +77,34 @@ int mars_mutex_lock_get(uint64_t mutex_e
MARS_CHECK_RET(((uintptr_t)mutex & MARS_MUTEX_ALIGN_MASK) == 0,
MARS_ERROR_ALIGN);
- int status;
+ int status, mask;
+
+ /* save event mask */
+ mask = spu_read_event_mask();
- atomic_event_setup();
+ /* set event mask for the lost event */
+ spu_write_event_mask(MFC_LLR_LOST_EVENT);
do {
- atomic_get(mutex, mutex_ea);
+ mfc_getllar(mutex, mutex_ea, 0, 0);
+ mfc_read_atomic_status();
if (mutex->lock == MARS_MUTEX_LOCKED) {
- atomic_event_wait();
- status = 1;
+ spu_read_event_status();
+ spu_write_event_ack(MFC_LLR_LOST_EVENT);
+ status = MFC_PUTLLC_STATUS;
} else {
mutex->lock = MARS_MUTEX_LOCKED;
- status = atomic_put(mutex, mutex_ea);
+ mfc_putllc(mutex, mutex_ea, 0, 0);
+ status = mfc_read_atomic_status() & MFC_PUTLLC_STATUS;
}
} while (status);
- atomic_event_restore();
+ /* restore event mask */
+ spu_write_event_mask(mask);
+
+ /* clear any remnant lost event */
+ spu_write_event_ack(MFC_LLR_LOST_EVENT);
return MARS_SUCCESS;
}
More information about the cbe-oss-dev
mailing list