Commit 842134f1 authored by Trond Myklebust's avatar Trond Myklebust

RPC: Optimize away unnecessary del_timer_sync() operations, when we

      know there are no pending timers.
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@fys.uio.no>
parent 89a45174
...@@ -142,6 +142,7 @@ typedef void (*rpc_action)(struct rpc_task *); ...@@ -142,6 +142,7 @@ typedef void (*rpc_action)(struct rpc_task *);
#define RPC_TASK_RUNNING 0 #define RPC_TASK_RUNNING 0
#define RPC_TASK_QUEUED 1 #define RPC_TASK_QUEUED 1
#define RPC_TASK_WAKEUP 2 #define RPC_TASK_WAKEUP 2
#define RPC_TASK_HAS_TIMER 3
#define RPC_IS_RUNNING(t) (test_bit(RPC_TASK_RUNNING, &(t)->tk_runstate)) #define RPC_IS_RUNNING(t) (test_bit(RPC_TASK_RUNNING, &(t)->tk_runstate))
#define rpc_set_running(t) (set_bit(RPC_TASK_RUNNING, &(t)->tk_runstate)) #define rpc_set_running(t) (set_bit(RPC_TASK_RUNNING, &(t)->tk_runstate))
......
...@@ -104,6 +104,9 @@ static void rpc_run_timer(struct rpc_task *task) ...@@ -104,6 +104,9 @@ static void rpc_run_timer(struct rpc_task *task)
dprintk("RPC: %4d running timer\n", task->tk_pid); dprintk("RPC: %4d running timer\n", task->tk_pid);
callback(task); callback(task);
} }
smp_mb__before_clear_bit();
clear_bit(RPC_TASK_HAS_TIMER, &task->tk_runstate);
smp_mb__after_clear_bit();
} }
/* /*
...@@ -122,6 +125,7 @@ __rpc_add_timer(struct rpc_task *task, rpc_action timer) ...@@ -122,6 +125,7 @@ __rpc_add_timer(struct rpc_task *task, rpc_action timer)
task->tk_timeout_fn = timer; task->tk_timeout_fn = timer;
else else
task->tk_timeout_fn = __rpc_default_timer; task->tk_timeout_fn = __rpc_default_timer;
set_bit(RPC_TASK_HAS_TIMER, &task->tk_runstate);
mod_timer(&task->tk_timer, jiffies + task->tk_timeout); mod_timer(&task->tk_timer, jiffies + task->tk_timeout);
} }
...@@ -132,8 +136,10 @@ __rpc_add_timer(struct rpc_task *task, rpc_action timer) ...@@ -132,8 +136,10 @@ __rpc_add_timer(struct rpc_task *task, rpc_action timer)
static inline void static inline void
rpc_delete_timer(struct rpc_task *task) rpc_delete_timer(struct rpc_task *task)
{ {
if (del_timer_sync(&task->tk_timer)) if (test_and_clear_bit(RPC_TASK_HAS_TIMER, &task->tk_runstate)) {
del_singleshot_timer_sync(&task->tk_timer);
dprintk("RPC: %4d deleting timer\n", task->tk_pid); dprintk("RPC: %4d deleting timer\n", task->tk_pid);
}
} }
/* /*
......
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