Skip to content

Commit

Permalink
Add support for PREEMPT_RT kernels
Browse files Browse the repository at this point in the history
Add a series of #ifdefs in gckOS_WaitSignal() to support RT kernels,
where the completion mechanism has been changed to use swait instead of
complex wait queues.

This is based on a patch previously provided to meta-fsl-arm by
Jacob Kroon:
Freescale/meta-freescale@5ebb4e1

In order to be able to load the RT version of the module, the kernel
itself must be patched to export the swait_prepare_locked() and
swait_finish_locked() functions.

Signed-off-by: Dominic Sacré <dominic.sacre@gmx.de>
  • Loading branch information
dsacre committed Nov 17, 2016
1 parent bfa78b0 commit f73c35b
Showing 1 changed file with 23 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7386,7 +7386,11 @@ gckOS_WaitSignal(

might_sleep();

#ifdef CONFIG_PREEMPT_RT_BASE
raw_spin_lock_irq(&signal->obj.wait.lock);
#else
spin_lock_irq(&signal->obj.wait.lock);
#endif

if (signal->obj.done)
{
Expand All @@ -7408,9 +7412,14 @@ gckOS_WaitSignal(
? MAX_SCHEDULE_TIMEOUT
: Wait * HZ / 1000;

#ifdef CONFIG_PREEMPT_RT_BASE
DEFINE_SWAITER(wait);
swait_prepare_locked(&signal->obj.wait, &wait);
#else
DECLARE_WAITQUEUE(wait, current);
wait.flags |= WQ_FLAG_EXCLUSIVE;
__add_wait_queue_tail(&signal->obj.wait, &wait);
#endif

while (gcvTRUE)
{
Expand All @@ -7422,9 +7431,15 @@ gckOS_WaitSignal(
}

__set_current_state(TASK_INTERRUPTIBLE);
#ifdef CONFIG_PREEMPT_RT_BASE
raw_spin_unlock_irq(&signal->obj.wait.lock);
timeout = schedule_timeout(timeout);
raw_spin_lock_irq(&signal->obj.wait.lock);
#else
spin_unlock_irq(&signal->obj.wait.lock);
timeout = schedule_timeout(timeout);
spin_lock_irq(&signal->obj.wait.lock);
#endif

if (signal->obj.done)
{
Expand All @@ -7445,10 +7460,18 @@ gckOS_WaitSignal(
}
}

#ifdef CONFIG_PREEMPT_RT_BASE
swait_finish_locked(&signal->obj.wait, &wait);
#else
__remove_wait_queue(&signal->obj.wait, &wait);
#endif
}

#ifdef CONFIG_PREEMPT_RT_BASE
raw_spin_unlock_irq(&signal->obj.wait.lock);
#else
spin_unlock_irq(&signal->obj.wait.lock);
#endif

OnError:
/* Return status. */
Expand Down

0 comments on commit f73c35b

Please sign in to comment.