#ifndef LITMUS_RSM_H #define LITMUS_RSM_H #include #include #include /* struct for semaphore with priority inheritance */ struct rsm_mutex { struct litmus_lock litmus_lock; /* current resource holder */ struct task_struct *owner; /* highest-priority waiter */ struct task_struct *hp_waiter; /* FIFO queue of waiting tasks -- for now. time stamp in the future. */ wait_queue_head_t wait; /* we do some nesting within spinlocks, so we can't use the normal sleeplocks found in wait_queue_head_t. */ raw_spinlock_t lock; }; static inline struct rsm_mutex* rsm_mutex_from_lock(struct litmus_lock* lock) { return container_of(lock, struct rsm_mutex, litmus_lock); } #ifdef CONFIG_LITMUS_DGL_SUPPORT int rsm_mutex_is_owner(struct litmus_lock *l, struct task_struct *t); int rsm_mutex_dgl_lock(struct litmus_lock *l, dgl_wait_state_t* dgl_wait, wait_queue_t* wq_node); void rsm_mutex_enable_priority(struct litmus_lock *l, dgl_wait_state_t* dgl_wait); #endif void rsm_mutex_propagate_increase_inheritance(struct litmus_lock* l, struct task_struct* t, raw_spinlock_t* to_unlock, unsigned long irqflags); void rsm_mutex_propagate_decrease_inheritance(struct litmus_lock* l, struct task_struct* t, raw_spinlock_t* to_unlock, unsigned long irqflags); int rsm_mutex_lock(struct litmus_lock* l); int rsm_mutex_unlock(struct litmus_lock* l); int rsm_mutex_close(struct litmus_lock* l); void rsm_mutex_free(struct litmus_lock* l); struct litmus_lock* rsm_mutex_new(struct litmus_lock_ops*); #endif