| @@ -978,11 +978,10 @@ out: · 977 unmodified lines |
| 978 | 978 | } |
| 979 | 979 | EXPORT_SYMBOL_GPL(rpc_bind_new_program); |
| 980 | 980 | |
| 981 | | −static struct rpc_xprt * |
| 982 | | −rpc_task_get_xprt(struct rpc_clnt *clnt) |
| 981 | +struct rpc_xprt * |
| 982 | +rpc_task_get_xprt(struct rpc_clnt *clnt, struct rpc_xprt *xprt) |
| 983 | 983 | { |
| 984 | 984 | struct rpc_xprt_switch *xps; |
| 985 | | − struct rpc_xprt *xprt= xprt_iter_get_next(&clnt->cl_xpi); |
| 986 | 985 | |
| 987 | 986 | if (!xprt) |
| 988 | 987 | return NULL; |
| @@ -995,24 +994,6 @@ rpc_task_get_xprt(struct rpc_clnt *clnt) · 6 unmodified lines |
| 995 | 994 | return xprt; |
| 996 | 995 | } |
| 997 | 996 | |
| 998 | | −static struct rpc_xprt * |
| 999 | | −rpc_task_get_first_xprt(struct rpc_clnt *clnt) |
| 1000 | | −{ |
| 1001 | | − struct rpc_xprt_switch *xps; |
| 1002 | | − struct rpc_xprt *xprt; |
| 1003 | | − |
| 1004 | | − rcu_read_lock(); |
| 1005 | | − xprt = xprt_get(rcu_dereference(clnt->cl_xprt)); |
| 1006 | | − if (xprt) { |
| 1007 | | − atomic_long_inc(&xprt->queuelen); |
| 1008 | | − xps = rcu_dereference(clnt->cl_xpi.xpi_xpswitch); |
| 1009 | | − atomic_long_inc(&xps->xps_queuelen); |
| 1010 | | − } |
| 1011 | | − rcu_read_unlock(); |
| 1012 | | − |
| 1013 | | − return xprt; |
| 1014 | | −} |
| 1015 | | − |
| 1016 | 997 | static void |
| 1017 | 998 | rpc_task_release_xprt(struct rpc_clnt *clnt, struct rpc_xprt *xprt) |
| 1018 | 999 | { |
| @@ -1057,6 +1038,23 @@ void rpc_task_release_client(struct rpc_task *task) · 38 unmodified lines |
| 1057 | 1038 | } |
| 1058 | 1039 | } |
| 1059 | 1040 | |
| 1041 | +static struct rpc_xprt * |
| 1042 | +rpc_task_get_first_xprt(struct rpc_clnt *clnt) |
| 1043 | +{ |
| 1044 | + struct rpc_xprt *xprt; |
| 1045 | + |
| 1046 | + rcu_read_lock(); |
| 1047 | + xprt = xprt_get(rcu_dereference(clnt->cl_xprt)); |
| 1048 | + rcu_read_unlock(); |
| 1049 | + return rpc_task_get_xprt(clnt, xprt); |
| 1050 | +} |
| 1051 | + |
| 1052 | +static struct rpc_xprt * |
| 1053 | +rpc_task_get_next_xprt(struct rpc_clnt *clnt) |
| 1054 | +{ |
| 1055 | + return rpc_task_get_xprt(clnt, xprt_iter_get_next(&clnt->cl_xpi)); |
| 1056 | +} |
| 1057 | + |
| 1060 | 1058 | static |
| 1061 | 1059 | void rpc_task_set_transport(struct rpc_task *task, struct rpc_clnt *clnt) |
| 1062 | 1060 | { |
| @@ -1065,7 +1063,7 @@ void rpc_task_set_transport(struct rpc_task *task, struct rpc_clnt *clnt) · 2 unmodified lines |
| 1065 | 1063 | if (task->tk_flags & RPC_TASK_NO_ROUND_ROBIN) |
| 1066 | 1064 | task->tk_xprt = rpc_task_get_first_xprt(clnt); |
| 1067 | 1065 | else |
| 1068 | | − task->tk_xprt = rpc_task_get_xprt(clnt); |
| 1066 | + task->tk_xprt = rpc_task_get_next_xprt(clnt); |
| 1069 | 1067 | } |
| 1070 | 1068 | |
| 1071 | 1069 | static |