Commit 9099ee79 authored by Philippe Gerum's avatar Philippe Gerum Committed by Jan Kiszka

cobalt/lock: pipeline: abstract hard lock API

Dovetail implements two types of locks: hard, and hybrid ones.  See
https://evlproject.org/dovetail/pipeline/locking/ for details.

Cobalt is interested in using Dovetail's hard_spinlock_t locks, which
are strictly equivalent to the ipipe_spinlock_t locks. Provide a
wrapper mapping a generic hard lock to the proper implementation
depending on the underlying pipeline flavour.

No functional change is introduced.
Signed-off-by: Philippe Gerum's avatarPhilippe Gerum <rpm@xenomai.org>
Signed-off-by: Jan Kiszka's avatarJan Kiszka <jan.kiszka@siemens.com>
parent d3a0b654
/*
* SPDX-License-Identifier: GPL-2.0
*/
#ifndef _COBALT_KERNEL_IPIPE_LOCK_H
#define _COBALT_KERNEL_IPIPE_LOCK_H
#include <pipeline/pipeline.h>
typedef ipipe_spinlock_t pipeline_spinlock_t;
#define PIPELINE_SPIN_LOCK_UNLOCKED(__name) IPIPE_SPIN_LOCK_UNLOCKED
#ifdef CONFIG_XENO_OPT_DEBUG_LOCKING
/* Disable UP-over-SMP kernel optimization in debug mode. */
#define __locking_active__ 1
#else
#define __locking_active__ ipipe_smp_p
#endif
#endif /* !_COBALT_KERNEL_IPIPE_LOCK_H */
/*
* SPDX-License-Identifier: GPL-2.0
*/
#ifndef _COBALT_KERNEL_IPIPE_PIPELINE_H
#define _COBALT_KERNEL_IPIPE_PIPELINE_H
#include <linux/ipipe.h>
typedef unsigned long spl_t;
#define splhigh(x) ((x) = ipipe_test_and_stall_head() & 1)
#ifdef CONFIG_SMP
#define splexit(x) ipipe_restore_head(x & 1)
#else /* !CONFIG_SMP */
#define splexit(x) ipipe_restore_head(x)
#endif /* !CONFIG_SMP */
#define splmax() ipipe_stall_head()
#define splnone() ipipe_unstall_head()
#define spltest() ipipe_test_head()
#define is_secondary_domain() ipipe_root_p
#define is_primary_domain() (!ipipe_root_p)
#endif /* !_COBALT_KERNEL_IPIPE_PIPELINE_H */
......@@ -20,49 +20,16 @@
#ifndef _COBALT_KERNEL_LOCK_H
#define _COBALT_KERNEL_LOCK_H
#include <linux/ipipe.h>
#include <pipeline/lock.h>
#include <linux/percpu.h>
#include <cobalt/kernel/assert.h>
#include <pipeline/pipeline.h>
/**
* @addtogroup cobalt_core_lock
*
* @{
*/
typedef unsigned long spl_t;
/**
* Hard disable interrupts on the local processor, saving previous state.
*
* @param[out] x An unsigned long integer context variable
*/
#define splhigh(x) ((x) = ipipe_test_and_stall_head() & 1)
#ifdef CONFIG_SMP
/**
* Restore the saved hard interrupt state on the local processor.
*
* @param[in] x The context variable previously updated by splhigh()
*/
#define splexit(x) ipipe_restore_head(x & 1)
#else /* !CONFIG_SMP */
#define splexit(x) ipipe_restore_head(x)
#endif /* !CONFIG_SMP */
/**
* Hard disable interrupts on the local processor.
*/
#define splmax() ipipe_stall_head()
/**
* Hard enable interrupts on the local processor.
*/
#define splnone() ipipe_unstall_head()
/**
* Test hard interrupt state on the local processor.
*
* @return Zero if the local processor currently accepts interrupts,
* non-zero otherwise.
*/
#define spltest() ipipe_test_head()
#ifdef CONFIG_XENO_OPT_DEBUG_LOCKING
struct xnlock {
......@@ -209,13 +176,6 @@ int ___xnlock_get(struct xnlock *lock /*, */ XNLOCK_DBG_CONTEXT_ARGS);
void ___xnlock_put(struct xnlock *lock /*, */ XNLOCK_DBG_CONTEXT_ARGS);
#endif /* out of line xnlock */
#ifdef CONFIG_XENO_OPT_DEBUG_LOCKING
/* Disable UP-over-SMP kernel optimization in debug mode. */
#define __locking_active__ 1
#else
#define __locking_active__ ipipe_smp_p
#endif
static inline spl_t
__xnlock_get_irqsave(struct xnlock *lock /*, */ XNLOCK_DBG_CONTEXT_ARGS)
{
......
......@@ -32,6 +32,7 @@
#include <linux/cdev.h>
#include <linux/wait.h>
#include <linux/notifier.h>
#include <pipeline/lock.h>
#include <xenomai/version.h>
#include <cobalt/kernel/heap.h>
#include <cobalt/kernel/sched.h>
......@@ -541,13 +542,13 @@ rtdm_execute_atomically(void) { }
/**
* Static lock initialisation
*/
#define RTDM_LOCK_UNLOCKED(__name) IPIPE_SPIN_LOCK_UNLOCKED
#define RTDM_LOCK_UNLOCKED(__name) PIPELINE_SPIN_LOCK_UNLOCKED(__name)
#define DEFINE_RTDM_LOCK(__name) \
rtdm_lock_t __name = RTDM_LOCK_UNLOCKED(__name)
/** Lock variable */
typedef ipipe_spinlock_t rtdm_lock_t;
typedef pipeline_spinlock_t rtdm_lock_t;
/** Variable to save the context while holding a lock */
typedef unsigned long rtdm_lockctx_t;
......@@ -606,7 +607,7 @@ static inline rtdm_lockctx_t __rtdm_lock_get_irqsave(rtdm_lock_t *lock)
{
rtdm_lockctx_t context;
context = ipipe_test_and_stall_head();
splhigh(context);
raw_spin_lock(lock);
xnsched_lock();
......@@ -626,7 +627,7 @@ void rtdm_lock_put_irqrestore(rtdm_lock_t *lock, rtdm_lockctx_t context)
{
raw_spin_unlock(lock);
xnsched_unlock();
ipipe_restore_head(context);
splexit(context);
}
/**
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment