#include <linux/seq_file.h>
#include <linux/sunrpc/clnt.h>
#include <linux/sunrpc/svcsock.h>
-#include <linux/sunrpc/metrics.h>
#define RPCDBG_FACILITY RPCDBG_MISC
}
}
-/**
- * rpc_alloc_iostats - allocate an rpc_iostats structure
- * @clnt: RPC program, version, and xprt
- *
- */
-struct rpc_iostats *rpc_alloc_iostats(struct rpc_clnt *clnt)
-{
- struct rpc_iostats *new;
- new = kcalloc(clnt->cl_maxproc, sizeof(struct rpc_iostats), GFP_KERNEL);
- return new;
-}
-EXPORT_SYMBOL(rpc_alloc_iostats);
-
-/**
- * rpc_free_iostats - release an rpc_iostats structure
- * @stats: doomed rpc_iostats structure
- *
- */
-void rpc_free_iostats(struct rpc_iostats *stats)
-{
- kfree(stats);
-}
-EXPORT_SYMBOL(rpc_free_iostats);
-
-/**
- * rpc_count_iostats - tally up per-task stats
- * @task: completed rpc_task
- *
- * Relies on the caller for serialization.
- */
-void rpc_count_iostats(struct rpc_task *task)
-{
- struct rpc_rqst *req = task->tk_rqstp;
- struct rpc_iostats *stats = task->tk_client->cl_metrics;
- struct rpc_iostats *op_metrics;
- long rtt, execute, queue;
-
- if (!stats || !req)
- return;
- op_metrics = &stats[task->tk_msg.rpc_proc->p_statidx];
-
- op_metrics->om_ops++;
- op_metrics->om_ntrans += req->rq_ntrans;
- op_metrics->om_timeouts += task->tk_timeouts;
-
- op_metrics->om_bytes_sent += task->tk_bytes_sent;
- op_metrics->om_bytes_recv += req->rq_received;
-
- queue = (long)req->rq_xtime - task->tk_start;
- if (queue < 0)
- queue = -queue;
- op_metrics->om_queue += queue;
-
- rtt = task->tk_rtt;
- if (rtt < 0)
- rtt = -rtt;
- op_metrics->om_rtt += rtt;
-
- execute = (long)jiffies - task->tk_start;
- if (execute < 0)
- execute = -execute;
- op_metrics->om_execute += execute;
-}
-
-static void _print_name(struct seq_file *seq, unsigned int op,
- struct rpc_procinfo *procs)
-{
- if (procs[op].p_name)
- seq_printf(seq, "\t%12s: ", procs[op].p_name);
- else if (op == 0)
- seq_printf(seq, "\t NULL: ");
- else
- seq_printf(seq, "\t%12u: ", op);
-}
-
-#define MILLISECS_PER_JIFFY (1000 / HZ)
-
-void rpc_print_iostats(struct seq_file *seq, struct rpc_clnt *clnt)
-{
- struct rpc_iostats *stats = clnt->cl_metrics;
- struct rpc_xprt *xprt = clnt->cl_xprt;
- unsigned int op, maxproc = clnt->cl_maxproc;
-
- if (!stats)
- return;
-
- seq_printf(seq, "\tRPC iostats version: %s ", RPC_IOSTATS_VERS);
- seq_printf(seq, "p/v: %u/%u (%s)\n",
- clnt->cl_prog, clnt->cl_vers, clnt->cl_protname);
-
- if (xprt)
- xprt->ops->print_stats(xprt, seq);
-
- seq_printf(seq, "\tper-op statistics\n");
- for (op = 0; op < maxproc; op++) {
- struct rpc_iostats *metrics = &stats[op];
- _print_name(seq, op, clnt->cl_procinfo);
- seq_printf(seq, "%lu %lu %lu %Lu %Lu %Lu %Lu %Lu\n",
- metrics->om_ops,
- metrics->om_ntrans,
- metrics->om_timeouts,
- metrics->om_bytes_sent,
- metrics->om_bytes_recv,
- metrics->om_queue * MILLISECS_PER_JIFFY,
- metrics->om_rtt * MILLISECS_PER_JIFFY,
- metrics->om_execute * MILLISECS_PER_JIFFY);
- }
-}
-EXPORT_SYMBOL(rpc_print_iostats);
-
/*
* Register/unregister RPC proc files
*/
static inline struct proc_dir_entry *
-do_register(const char *name, void *data, const struct file_operations *fops)
+do_register(const char *name, void *data, struct file_operations *fops)
{
struct proc_dir_entry *ent;
}
struct proc_dir_entry *
-svc_proc_register(struct svc_stat *statp, const struct file_operations *fops)
+svc_proc_register(struct svc_stat *statp, struct file_operations *fops)
{
return do_register(statp->program->pg_name, statp, fops);
}