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()
90 statp->netcnt, in svc_seq_show()
91 statp->netudpcnt, in svc_seq_show()
92 statp->nettcpcnt, in svc_seq_show()
93 statp->nettcpconn); in svc_seq_show()
95 "rpc %u %u %u %u %u\n", in svc_seq_show()
96 statp->rpccnt, in svc_seq_show()
97 statp->rpcbadfmt+statp->rpcbadauth+statp->rpcbadclnt, in svc_seq_show()
98 statp->rpcbadfmt, in svc_seq_show()
99 statp->rpcbadauth, in svc_seq_show()
100 statp->rpcbadclnt); in svc_seq_show()
102 for (i = 0; i < prog->pg_nvers; i++) { in svc_seq_show()
103 vers = prog->pg_vers[i]; in svc_seq_show()
104 if (!vers) in svc_seq_show()
106 seq_printf(seq, "proc%d %u", i, vers->vs_nproc); in svc_seq_show()
107 for (j = 0; j < vers->vs_nproc; j++) in svc_seq_show()
108 seq_printf(seq, " %u", vers->vs_count[j]); in svc_seq_show()
115 * rpc_alloc_iostats - allocate an rpc_iostats structure
116 * @clnt: RPC program, version, and xprt
124 stats = kcalloc(clnt->cl_maxproc, sizeof(*stats), GFP_KERNEL); in rpc_alloc_iostats()
125 if (stats) { in rpc_alloc_iostats()
126 for (i = 0; i < clnt->cl_maxproc; i++) in rpc_alloc_iostats()
134 * rpc_free_iostats - release an rpc_iostats structure
145 * rpc_count_iostats_metrics - tally up per-task stats
152 struct rpc_rqst *req = task->tk_rqstp; in rpc_count_iostats_metrics()
155 if (!op_metrics || !req) in rpc_count_iostats_metrics()
159 spin_lock(&op_metrics->om_lock); in rpc_count_iostats_metrics()
161 op_metrics->om_ops++; in rpc_count_iostats_metrics()
163 op_metrics->om_ntrans += max(req->rq_ntrans, 1); in rpc_count_iostats_metrics()
164 op_metrics->om_timeouts += task->tk_timeouts; in rpc_count_iostats_metrics()
166 op_metrics->om_bytes_sent += req->rq_xmit_bytes_sent; in rpc_count_iostats_metrics()
167 op_metrics->om_bytes_recv += req->rq_reply_bytes_recvd; in rpc_count_iostats_metrics()
170 if (ktime_to_ns(req->rq_xtime)) { in rpc_count_iostats_metrics()
171 backlog = ktime_sub(req->rq_xtime, task->tk_start); in rpc_count_iostats_metrics()
172 op_metrics->om_queue = ktime_add(op_metrics->om_queue, backlog); in rpc_count_iostats_metrics()
175 op_metrics->om_rtt = ktime_add(op_metrics->om_rtt, req->rq_rtt); in rpc_count_iostats_metrics()
177 execute = ktime_sub(now, task->tk_start); in rpc_count_iostats_metrics()
178 op_metrics->om_execute = ktime_add(op_metrics->om_execute, execute); in rpc_count_iostats_metrics()
179 if (task->tk_status < 0) in rpc_count_iostats_metrics()
180 op_metrics->om_error_status++; in rpc_count_iostats_metrics()
182 spin_unlock(&op_metrics->om_lock); in rpc_count_iostats_metrics()
184 trace_rpc_stats_latency(req->rq_task, backlog, req->rq_rtt, execute); in rpc_count_iostats_metrics()
189 * rpc_count_iostats - tally up per-task stats
198 &stats[task->tk_msg.rpc_proc->p_statidx]); in rpc_count_iostats()
205 if (procs[op].p_name) in _print_name()
207 else if (op == 0) in _print_name()
215 a->om_ops += b->om_ops; in _add_rpc_iostats()
216 a->om_ntrans += b->om_ntrans; in _add_rpc_iostats()
217 a->om_timeouts += b->om_timeouts; in _add_rpc_iostats()
218 a->om_bytes_sent += b->om_bytes_sent; in _add_rpc_iostats()
219 a->om_bytes_recv += b->om_bytes_recv; in _add_rpc_iostats()
220 a->om_queue = ktime_add(a->om_queue, b->om_queue); in _add_rpc_iostats()
221 a->om_rtt = ktime_add(a->om_rtt, b->om_rtt); in _add_rpc_iostats()
222 a->om_execute = ktime_add(a->om_execute, b->om_execute); in _add_rpc_iostats()
223 a->om_error_status += b->om_error_status; in _add_rpc_iostats()
231 stats->om_ops, in _print_rpc_iostats()
232 stats->om_ntrans, in _print_rpc_iostats()
233 stats->om_timeouts, in _print_rpc_iostats()
234 stats->om_bytes_sent, in _print_rpc_iostats()
235 stats->om_bytes_recv, in _print_rpc_iostats()
236 ktime_to_ms(stats->om_queue), in _print_rpc_iostats()
237 ktime_to_ms(stats->om_rtt), in _print_rpc_iostats()
238 ktime_to_ms(stats->om_execute), in _print_rpc_iostats()
239 stats->om_error_status); in _print_rpc_iostats()
246 xprt->ops->print_stats(xprt, seq); in do_print_stats()
252 unsigned int op, maxproc = clnt->cl_maxproc; in rpc_clnt_show_stats()
254 if (!clnt->cl_metrics) in rpc_clnt_show_stats()
259 clnt->cl_prog, clnt->cl_vers, clnt->cl_program->name); in rpc_clnt_show_stats()
263 seq_printf(seq, "\tper-op statistics\n"); in rpc_clnt_show_stats()
268 _add_rpc_iostats(&stats, &next->cl_metrics[op]); in rpc_clnt_show_stats()
269 if (next == next->cl_parent) in rpc_clnt_show_stats()
271 next = next->cl_parent; in rpc_clnt_show_stats()
273 _print_rpc_iostats(seq, &stats, op, clnt->cl_procinfo); in rpc_clnt_show_stats()
279 * Register/unregister RPC proc files
287 dprintk("RPC: registering /proc/net/rpc/%s\n", name); in do_register()
289 return proc_create_data(name, 0, sn->proc_net_rpc, proc_ops, data); in do_register()
295 return do_register(net, statp->program->name, statp, &rpc_proc_ops); in rpc_proc_register()
305 remove_proc_entry(name, sn->proc_net_rpc); in rpc_proc_unregister()
312 return do_register(net, statp->program->pg_name, statp, proc_ops); in svc_proc_register()
322 remove_proc_entry(name, sn->proc_net_rpc); in svc_proc_unregister()
330 dprintk("RPC: registering /proc/net/rpc\n"); in rpc_proc_init()
332 sn->proc_net_rpc = proc_mkdir("rpc", net->proc_net); in rpc_proc_init()
333 if (sn->proc_net_rpc == NULL) in rpc_proc_init()
334 return -ENOMEM; in rpc_proc_init()
341 dprintk("RPC: unregistering /proc/net/rpc\n"); in rpc_proc_exit()
342 remove_proc_entry("rpc", net->proc_net); in rpc_proc_exit()