Skip to content

Commit

Permalink
sched: clean up sleep_on() APIs
Browse files Browse the repository at this point in the history
clean up the sleep_on() APIs:

 - do not use fastcall
 - replace fragile macro magic with proper inline functions

Signed-off-by: Ingo Molnar <mingo@elte.hu>
  • Loading branch information
Ingo Molnar committed Jul 9, 2007
1 parent 9761eea commit 0fec171
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 38 deletions.
16 changes: 8 additions & 8 deletions include/linux/wait.h
Original file line number Diff line number Diff line change
Expand Up @@ -366,15 +366,15 @@ static inline void remove_wait_queue_locked(wait_queue_head_t *q,

/*
* These are the old interfaces to sleep waiting for an event.
* They are racy. DO NOT use them, use the wait_event* interfaces above.
* We plan to remove these interfaces during 2.7.
* They are racy. DO NOT use them, use the wait_event* interfaces above.
* We plan to remove these interfaces.
*/
extern void FASTCALL(sleep_on(wait_queue_head_t *q));
extern long FASTCALL(sleep_on_timeout(wait_queue_head_t *q,
signed long timeout));
extern void FASTCALL(interruptible_sleep_on(wait_queue_head_t *q));
extern long FASTCALL(interruptible_sleep_on_timeout(wait_queue_head_t *q,
signed long timeout));
extern void sleep_on(wait_queue_head_t *q);
extern long sleep_on_timeout(wait_queue_head_t *q,
signed long timeout);
extern void interruptible_sleep_on(wait_queue_head_t *q);
extern long interruptible_sleep_on_timeout(wait_queue_head_t *q,
signed long timeout);

/*
* Waitqueues which are removed from the waitqueue_head at wakeup time
Expand Down
71 changes: 41 additions & 30 deletions kernel/sched.c
Original file line number Diff line number Diff line change
Expand Up @@ -3699,74 +3699,85 @@ wait_for_completion_interruptible_timeout(struct completion *x,
}
EXPORT_SYMBOL(wait_for_completion_interruptible_timeout);


#define SLEEP_ON_VAR \
unsigned long flags; \
wait_queue_t wait; \
init_waitqueue_entry(&wait, current);

#define SLEEP_ON_HEAD \
spin_lock_irqsave(&q->lock,flags); \
__add_wait_queue(q, &wait); \
static inline void
sleep_on_head(wait_queue_head_t *q, wait_queue_t *wait, unsigned long *flags)
{
spin_lock_irqsave(&q->lock, *flags);
__add_wait_queue(q, wait);
spin_unlock(&q->lock);
}

#define SLEEP_ON_TAIL \
spin_lock_irq(&q->lock); \
__remove_wait_queue(q, &wait); \
spin_unlock_irqrestore(&q->lock, flags);
static inline void
sleep_on_tail(wait_queue_head_t *q, wait_queue_t *wait, unsigned long *flags)
{
spin_lock_irq(&q->lock);
__remove_wait_queue(q, wait);
spin_unlock_irqrestore(&q->lock, *flags);
}

void fastcall __sched interruptible_sleep_on(wait_queue_head_t *q)
void __sched interruptible_sleep_on(wait_queue_head_t *q)
{
SLEEP_ON_VAR
unsigned long flags;
wait_queue_t wait;

init_waitqueue_entry(&wait, current);

current->state = TASK_INTERRUPTIBLE;

SLEEP_ON_HEAD
sleep_on_head(q, &wait, &flags);
schedule();
SLEEP_ON_TAIL
sleep_on_tail(q, &wait, &flags);
}
EXPORT_SYMBOL(interruptible_sleep_on);

long fastcall __sched
long __sched
interruptible_sleep_on_timeout(wait_queue_head_t *q, long timeout)
{
SLEEP_ON_VAR
unsigned long flags;
wait_queue_t wait;

init_waitqueue_entry(&wait, current);

current->state = TASK_INTERRUPTIBLE;

SLEEP_ON_HEAD
sleep_on_head(q, &wait, &flags);
timeout = schedule_timeout(timeout);
SLEEP_ON_TAIL
sleep_on_tail(q, &wait, &flags);

return timeout;
}
EXPORT_SYMBOL(interruptible_sleep_on_timeout);

void fastcall __sched sleep_on(wait_queue_head_t *q)
void __sched sleep_on(wait_queue_head_t *q)
{
SLEEP_ON_VAR
unsigned long flags;
wait_queue_t wait;

init_waitqueue_entry(&wait, current);

current->state = TASK_UNINTERRUPTIBLE;

SLEEP_ON_HEAD
sleep_on_head(q, &wait, &flags);
schedule();
SLEEP_ON_TAIL
sleep_on_tail(q, &wait, &flags);
}
EXPORT_SYMBOL(sleep_on);

long fastcall __sched sleep_on_timeout(wait_queue_head_t *q, long timeout)
long __sched sleep_on_timeout(wait_queue_head_t *q, long timeout)
{
SLEEP_ON_VAR
unsigned long flags;
wait_queue_t wait;

init_waitqueue_entry(&wait, current);

current->state = TASK_UNINTERRUPTIBLE;

SLEEP_ON_HEAD
sleep_on_head(q, &wait, &flags);
timeout = schedule_timeout(timeout);
SLEEP_ON_TAIL
sleep_on_tail(q, &wait, &flags);

return timeout;
}

EXPORT_SYMBOL(sleep_on_timeout);

#ifdef CONFIG_RT_MUTEXES
Expand Down

0 comments on commit 0fec171

Please sign in to comment.