2013-03-01 09:11:18

by Li Guang

[permalink] [raw]
Subject: [PATCH 1/2] semaphore: give an unlikely for down's timeout

Signed-off-by: liguang <[email protected]>
---
kernel/semaphore.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/kernel/semaphore.c b/kernel/semaphore.c
index 4567fc0..9c7017d 100644
--- a/kernel/semaphore.c
+++ b/kernel/semaphore.c
@@ -214,7 +214,7 @@ static inline int __sched __down_common(struct semaphore *sem, long state,
for (;;) {
if (signal_pending_state(state, task))
goto interrupted;
- if (timeout <= 0)
+ if (unlikely(timeout <= 0))
goto timed_out;
__set_task_state(task, state);
raw_spin_unlock_irq(&sem->lock);
--
1.7.2.5


2013-03-01 09:11:35

by Li Guang

[permalink] [raw]
Subject: [PATCH 2/2] semaphore: boolize semaphore_waiter's up

Signed-off-by: liguang <[email protected]>
---
kernel/semaphore.c | 6 +++---
1 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/kernel/semaphore.c b/kernel/semaphore.c
index 9c7017d..6815171 100644
--- a/kernel/semaphore.c
+++ b/kernel/semaphore.c
@@ -193,7 +193,7 @@ EXPORT_SYMBOL(up);
struct semaphore_waiter {
struct list_head list;
struct task_struct *task;
- int up;
+ bool up;
};

/*
@@ -209,7 +209,7 @@ static inline int __sched __down_common(struct semaphore *sem, long state,

list_add_tail(&waiter.list, &sem->wait_list);
waiter.task = task;
- waiter.up = 0;
+ waiter.up = false;

for (;;) {
if (signal_pending_state(state, task))
@@ -258,6 +258,6 @@ static noinline void __sched __up(struct semaphore *sem)
struct semaphore_waiter *waiter = list_first_entry(&sem->wait_list,
struct semaphore_waiter, list);
list_del(&waiter->list);
- waiter->up = 1;
+ waiter->up = true;
wake_up_process(waiter->task);
}
--
1.7.2.5

2013-03-01 13:09:12

by Jiri Kosina

[permalink] [raw]
Subject: Re: [PATCH 1/2] semaphore: give an unlikely for down's timeout

On Fri, 1 Mar 2013, liguang wrote:

> Signed-off-by: liguang <[email protected]>

Acked-by: Jiri Kosina <[email protected]>


Makes sense. Adding Andrew to CC.

> ---
> kernel/semaphore.c | 2 +-
> 1 files changed, 1 insertions(+), 1 deletions(-)
>
> diff --git a/kernel/semaphore.c b/kernel/semaphore.c
> index 4567fc0..9c7017d 100644
> --- a/kernel/semaphore.c
> +++ b/kernel/semaphore.c
> @@ -214,7 +214,7 @@ static inline int __sched __down_common(struct semaphore *sem, long state,
> for (;;) {
> if (signal_pending_state(state, task))
> goto interrupted;
> - if (timeout <= 0)
> + if (unlikely(timeout <= 0))
> goto timed_out;
> __set_task_state(task, state);
> raw_spin_unlock_irq(&sem->lock);
> --
> 1.7.2.5
>

--
Jiri Kosina
SUSE Labs