Lines Matching +full:rpc +full:- +full:if
1 // SPDX-License-Identifier: GPL-2.0-only
5 * procfs-based user access to generic RPC statistics. The stats files
6 * reside in /proc/net/rpc.
9 * If you implement an RPC service that has its own stats routine which
10 * appends the generic RPC stats, make sure you don't exceed the PAGE_SIZE
35 * Get RPC client stats
38 const struct rpc_stat *statp = seq->private; in rpc_proc_show()
39 const struct rpc_program *prog = statp->program; in rpc_proc_show()
44 statp->netcnt, in rpc_proc_show()
45 statp->netudpcnt, in rpc_proc_show()
46 statp->nettcpcnt, in rpc_proc_show()
47 statp->nettcpconn); in rpc_proc_show()
49 "rpc %u %u %u\n", in rpc_proc_show()
50 statp->rpccnt, in rpc_proc_show()
51 statp->rpcretrans, in rpc_proc_show()
52 statp->rpcauthrefresh); in rpc_proc_show()
54 for (i = 0; i < prog->nrvers; i++) { in rpc_proc_show()
55 const struct rpc_version *vers = prog->version[i]; in rpc_proc_show()
56 if (!vers) in rpc_proc_show()
59 vers->number, vers->nrprocs); in rpc_proc_show()
60 for (j = 0; j < vers->nrprocs; j++) in rpc_proc_show()
61 seq_printf(seq, " %u", vers->counts[j]); in rpc_proc_show()
80 * Get RPC server stats
84 const struct svc_program *prog = statp->program; in svc_seq_show()
91 statp->netcnt, in svc_seq_show()
92 statp->netudpcnt, in svc_seq_show()
93 statp->nettcpcnt, in svc_seq_show()
94 statp->nettcpconn); in svc_seq_show()
96 "rpc %u %u %u %u %u\n", in svc_seq_show()
97 statp->rpccnt, in svc_seq_show()
98 statp->rpcbadfmt+statp->rpcbadauth+statp->rpcbadclnt, in svc_seq_show()
99 statp->rpcbadfmt, in svc_seq_show()
100 statp->rpcbadauth, in svc_seq_show()
101 statp->rpcbadclnt); in svc_seq_show()
103 for (i = 0; i < prog->pg_nvers; i++) { in svc_seq_show()
104 vers = prog->pg_vers[i]; in svc_seq_show()
105 if (!vers) in svc_seq_show()
107 seq_printf(seq, "proc%d %u", i, vers->vs_nproc); in svc_seq_show()
108 for (j = 0; j < vers->vs_nproc; j++) { in svc_seq_show()
111 count += per_cpu(vers->vs_count[j], k); in svc_seq_show()
120 * rpc_alloc_iostats - allocate an rpc_iostats structure
121 * @clnt: RPC program, version, and xprt
129 stats = kcalloc(clnt->cl_maxproc, sizeof(*stats), GFP_KERNEL); in rpc_alloc_iostats()
130 if (stats) { in rpc_alloc_iostats()
131 for (i = 0; i < clnt->cl_maxproc; i++) in rpc_alloc_iostats()
139 * rpc_free_iostats - release an rpc_iostats structure
150 * rpc_count_iostats_metrics - tally up per-task stats
157 struct rpc_rqst *req = task->tk_rqstp; in rpc_count_iostats_metrics()
160 if (!op_metrics || !req) in rpc_count_iostats_metrics()
164 spin_lock(&op_metrics->om_lock); in rpc_count_iostats_metrics()
166 op_metrics->om_ops++; in rpc_count_iostats_metrics()
168 op_metrics->om_ntrans += max(req->rq_ntrans, 1); in rpc_count_iostats_metrics()
169 op_metrics->om_timeouts += task->tk_timeouts; in rpc_count_iostats_metrics()
171 op_metrics->om_bytes_sent += req->rq_xmit_bytes_sent; in rpc_count_iostats_metrics()
172 op_metrics->om_bytes_recv += req->rq_reply_bytes_recvd; in rpc_count_iostats_metrics()
175 if (ktime_to_ns(req->rq_xtime)) { in rpc_count_iostats_metrics()
176 backlog = ktime_sub(req->rq_xtime, task->tk_start); in rpc_count_iostats_metrics()
177 op_metrics->om_queue = ktime_add(op_metrics->om_queue, backlog); in rpc_count_iostats_metrics()
180 op_metrics->om_rtt = ktime_add(op_metrics->om_rtt, req->rq_rtt); in rpc_count_iostats_metrics()
182 execute = ktime_sub(now, task->tk_start); in rpc_count_iostats_metrics()
183 op_metrics->om_execute = ktime_add(op_metrics->om_execute, execute); in rpc_count_iostats_metrics()
184 if (task->tk_status < 0) in rpc_count_iostats_metrics()
185 op_metrics->om_error_status++; in rpc_count_iostats_metrics()
187 spin_unlock(&op_metrics->om_lock); in rpc_count_iostats_metrics()
189 trace_rpc_stats_latency(req->rq_task, backlog, req->rq_rtt, execute); in rpc_count_iostats_metrics()
194 * rpc_count_iostats - tally up per-task stats
203 &stats[task->tk_msg.rpc_proc->p_statidx]); in rpc_count_iostats()
210 if (procs[op].p_name) in _print_name()
212 else if (op == 0) in _print_name()
220 a->om_ops += b->om_ops; in _add_rpc_iostats()
221 a->om_ntrans += b->om_ntrans; in _add_rpc_iostats()
222 a->om_timeouts += b->om_timeouts; in _add_rpc_iostats()
223 a->om_bytes_sent += b->om_bytes_sent; in _add_rpc_iostats()
224 a->om_bytes_recv += b->om_bytes_recv; in _add_rpc_iostats()
225 a->om_queue = ktime_add(a->om_queue, b->om_queue); in _add_rpc_iostats()
226 a->om_rtt = ktime_add(a->om_rtt, b->om_rtt); in _add_rpc_iostats()
227 a->om_execute = ktime_add(a->om_execute, b->om_execute); in _add_rpc_iostats()
228 a->om_error_status += b->om_error_status; in _add_rpc_iostats()
236 stats->om_ops, in _print_rpc_iostats()
237 stats->om_ntrans, in _print_rpc_iostats()
238 stats->om_timeouts, in _print_rpc_iostats()
239 stats->om_bytes_sent, in _print_rpc_iostats()
240 stats->om_bytes_recv, in _print_rpc_iostats()
241 ktime_to_ms(stats->om_queue), in _print_rpc_iostats()
242 ktime_to_ms(stats->om_rtt), in _print_rpc_iostats()
243 ktime_to_ms(stats->om_execute), in _print_rpc_iostats()
244 stats->om_error_status); in _print_rpc_iostats()
251 xprt->ops->print_stats(xprt, seq); in do_print_stats()
257 unsigned int op, maxproc = clnt->cl_maxproc; in rpc_clnt_show_stats()
259 if (!clnt->cl_metrics) in rpc_clnt_show_stats()
264 clnt->cl_prog, clnt->cl_vers, clnt->cl_program->name); in rpc_clnt_show_stats()
268 seq_printf(seq, "\tper-op statistics\n"); in rpc_clnt_show_stats()
273 _add_rpc_iostats(&stats, &next->cl_metrics[op]); in rpc_clnt_show_stats()
274 if (next == next->cl_parent) in rpc_clnt_show_stats()
276 next = next->cl_parent; in rpc_clnt_show_stats()
278 _print_rpc_iostats(seq, &stats, op, clnt->cl_procinfo); in rpc_clnt_show_stats()
284 * Register/unregister RPC proc files
292 dprintk("RPC: registering /proc/net/rpc/%s\n", name); in do_register()
294 return proc_create_data(name, 0, sn->proc_net_rpc, proc_ops, data); in do_register()
300 return do_register(net, statp->program->name, statp, &rpc_proc_ops); in rpc_proc_register()
310 remove_proc_entry(name, sn->proc_net_rpc); in rpc_proc_unregister()
317 return do_register(net, statp->program->pg_name, statp, proc_ops); in svc_proc_register()
327 remove_proc_entry(name, sn->proc_net_rpc); in svc_proc_unregister()
335 dprintk("RPC: registering /proc/net/rpc\n"); in rpc_proc_init()
337 sn->proc_net_rpc = proc_mkdir("rpc", net->proc_net); in rpc_proc_init()
338 if (sn->proc_net_rpc == NULL) in rpc_proc_init()
339 return -ENOMEM; in rpc_proc_init()
346 dprintk("RPC: unregistering /proc/net/rpc\n"); in rpc_proc_exit()
347 remove_proc_entry("rpc", net->proc_net); in rpc_proc_exit()