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: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
parent
cf08d6f2e6
commit
21ead9ff3d
|
@ -755,21 +755,19 @@ static void __rpc_execute(struct rpc_task *task)
|
|||
void (*do_action)(struct rpc_task *);
|
||||
|
||||
/*
|
||||
* Execute any pending callback first.
|
||||
* Perform the next FSM step or a pending callback.
|
||||
*
|
||||
* tk_action may be NULL if the task has been killed.
|
||||
* In particular, note that rpc_killall_tasks may
|
||||
* do this at any time, so beware when dereferencing.
|
||||
*/
|
||||
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.
|
||||
* In particular, note that rpc_killall_tasks may
|
||||
* do this at any time, so beware when dereferencing.
|
||||
*/
|
||||
do_action = task->tk_action;
|
||||
if (do_action == NULL)
|
||||
break;
|
||||
do_action = task->tk_action;
|
||||
if (task->tk_callback) {
|
||||
do_action = task->tk_callback;
|
||||
task->tk_callback = NULL;
|
||||
}
|
||||
if (!do_action)
|
||||
break;
|
||||
trace_rpc_task_run_action(task->tk_client, task, do_action);
|
||||
do_action(task);
|
||||
|
||||
|
|
Loading…
Reference in a new issue