| @@ -978,11 +978,10 @@ out: · 977 unmodified lines |
| 978 | } | 978 | } |
| 979 | EXPORT_SYMBOL_GPL(rpc_bind_new_program); | 979 | EXPORT_SYMBOL_GPL(rpc_bind_new_program); |
| 980 | | 980 | |
| 981 | static struct rpc_xprt * | 981 | struct rpc_xprt * |
| 982 | rpc_task_get_xprt(struct rpc_clnt *clnt) | 982 | rpc_task_get_xprt(struct rpc_clnt *clnt, struct rpc_xprt *xprt) |
| 983 | { | 983 | { |
| 984 | struct rpc_xprt_switch *xps; | 984 | struct rpc_xprt_switch *xps; |
| 985 | struct rpc_xprt *xprt= xprt_iter_get_next(&clnt->cl_xpi); | | |
| 986 | | 985 | |
| 987 | if (!xprt) | 986 | if (!xprt) |
| 988 | return NULL; | 987 | return NULL; |
| @@ -995,24 +994,6 @@ rpc_task_get_xprt(struct rpc_clnt *clnt) · 6 unmodified lines |
| 995 | return xprt; | 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 | static void | 997 | static void |
| 1017 | rpc_task_release_xprt(struct rpc_clnt *clnt, struct rpc_xprt *xprt) | 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 | static | 1058 | static |
| 1061 | void rpc_task_set_transport(struct rpc_task *task, struct rpc_clnt *clnt) | 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 | if (task->tk_flags & RPC_TASK_NO_ROUND_ROBIN) | 1063 | if (task->tk_flags & RPC_TASK_NO_ROUND_ROBIN) |
| 1066 | task->tk_xprt = rpc_task_get_first_xprt(clnt); | 1064 | task->tk_xprt = rpc_task_get_first_xprt(clnt); |
| 1067 | else | 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 | static | 1069 | static |