Commit 21ead9ff authored by Chuck Lever's avatar Chuck Lever Committed by Anna Schumaker

SUNRPC: Micro-optimize __rpc_execute

The common case: There are 13 to 14 actions per RPC, and tk_callback
is non-NULL in only one of them. There's no need to store a NULL in
the tk_callback field during each FSM step.

This slightly improves throughput results in dbench and other multi-
threaded benchmarks on my two-socket client on 56Gb InfiniBand, but
will probably be inconsequential on slower systems.
Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
Signed-off-by: default avatarAnna Schumaker <Anna.Schumaker@Netapp.com>
parent cf08d6f2
...@@ -755,21 +755,19 @@ static void __rpc_execute(struct rpc_task *task) ...@@ -755,21 +755,19 @@ static void __rpc_execute(struct rpc_task *task)
void (*do_action)(struct rpc_task *); void (*do_action)(struct rpc_task *);
/* /*
* Execute any pending callback first. * Perform the next FSM step or a pending callback.
*/ *
do_action = task->tk_callback;
task->tk_callback = NULL;
if (do_action == NULL) {
/*
* Perform the next FSM step.
* tk_action may be NULL if the task has been killed. * tk_action may be NULL if the task has been killed.
* In particular, note that rpc_killall_tasks may * In particular, note that rpc_killall_tasks may
* do this at any time, so beware when dereferencing. * do this at any time, so beware when dereferencing.
*/ */
do_action = task->tk_action; do_action = task->tk_action;
if (do_action == NULL) if (task->tk_callback) {
break; do_action = task->tk_callback;
task->tk_callback = NULL;
} }
if (!do_action)
break;
trace_rpc_task_run_action(task->tk_client, task, do_action); trace_rpc_task_run_action(task->tk_client, task, do_action);
do_action(task); do_action(task);
......
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