stats.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:4k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * linux/net/sunrpc/stats.c
  3.  *
  4.  * procfs-based user access to generic RPC statistics. The stats files
  5.  * reside in /proc/net/rpc.
  6.  *
  7.  * The read routines assume that the buffer passed in is just big enough.
  8.  * If you implement an RPC service that has its own stats routine which
  9.  * appends the generic RPC stats, make sure you don't exceed the PAGE_SIZE
  10.  * limit.
  11.  *
  12.  * Copyright (C) 1995, 1996, 1997 Olaf Kirch <okir@monad.swb.de>
  13.  */
  14. #define __NO_VERSION__
  15. #include <linux/module.h>
  16. #include <linux/init.h>
  17. #include <linux/kernel.h>
  18. #include <linux/sched.h>
  19. #include <linux/proc_fs.h>
  20. #include <linux/sunrpc/clnt.h>
  21. #include <linux/sunrpc/svcsock.h>
  22. #include <linux/init.h>
  23. #define RPCDBG_FACILITY RPCDBG_MISC
  24. static struct proc_dir_entry *proc_net_rpc = NULL;
  25. /*
  26.  * Get RPC client stats
  27.  */
  28. int
  29. rpc_proc_read(char *buffer, char **start, off_t offset, int count,
  30. int *eof, void *data)
  31. {
  32. struct rpc_stat *statp = (struct rpc_stat *) data;
  33. struct rpc_program *prog = statp->program;
  34. struct rpc_version *vers;
  35. int len, i, j;
  36. len = sprintf(buffer,
  37. "net %d %d %d %dn",
  38. statp->netcnt,
  39. statp->netudpcnt,
  40. statp->nettcpcnt,
  41. statp->nettcpconn);
  42. len += sprintf(buffer + len,
  43. "rpc %d %d %dn",
  44. statp->rpccnt,
  45. statp->rpcretrans,
  46. statp->rpcauthrefresh);
  47. for (i = 0; i < prog->nrvers; i++) {
  48. if (!(vers = prog->version[i]))
  49. continue;
  50. len += sprintf(buffer + len, "proc%d %d",
  51. vers->number, vers->nrprocs);
  52. for (j = 0; j < vers->nrprocs; j++)
  53. len += sprintf(buffer + len, " %d",
  54. vers->procs[j].p_count);
  55. buffer[len++] = 'n';
  56. }
  57. if (offset >= len) {
  58. *start = buffer;
  59. *eof = 1;
  60. return 0;
  61. }
  62. *start = buffer + offset;
  63. if ((len -= offset) > count)
  64. return count;
  65. *eof = 1;
  66. return len;
  67. }
  68. /*
  69.  * Get RPC server stats
  70.  */
  71. int
  72. svc_proc_read(char *buffer, char **start, off_t offset, int count,
  73. int *eof, void *data)
  74. {
  75. struct svc_stat *statp = (struct svc_stat *) data;
  76. struct svc_program *prog = statp->program;
  77. struct svc_procedure *proc;
  78. struct svc_version *vers;
  79. int len, i, j;
  80. len = sprintf(buffer,
  81. "net %d %d %d %dn",
  82. statp->netcnt,
  83. statp->netudpcnt,
  84. statp->nettcpcnt,
  85. statp->nettcpconn);
  86. len += sprintf(buffer + len,
  87. "rpc %d %d %d %d %dn",
  88. statp->rpccnt,
  89. statp->rpcbadfmt+statp->rpcbadauth+statp->rpcbadclnt,
  90. statp->rpcbadfmt,
  91. statp->rpcbadauth,
  92. statp->rpcbadclnt);
  93. for (i = 0; i < prog->pg_nvers; i++) {
  94. if (!(vers = prog->pg_vers[i]) || !(proc = vers->vs_proc))
  95. continue;
  96. len += sprintf(buffer + len, "proc%d %d", i, vers->vs_nproc);
  97. for (j = 0; j < vers->vs_nproc; j++, proc++)
  98. len += sprintf(buffer + len, " %d", proc->pc_count);
  99. buffer[len++] = 'n';
  100. }
  101. if (offset >= len) {
  102. *start = buffer;
  103. *eof = 1;
  104. return 0;
  105. }
  106. *start = buffer + offset;
  107. if ((len -= offset) > count)
  108. return count;
  109. *eof = 1;
  110. return len;
  111. }
  112. /*
  113.  * Register/unregister RPC proc files
  114.  */
  115. static inline struct proc_dir_entry *
  116. do_register(const char *name, void *data, int issvc)
  117. {
  118. rpc_proc_init();
  119. dprintk("RPC: registering /proc/net/rpc/%sn", name);
  120. return create_proc_read_entry(name, 0, proc_net_rpc, 
  121.       issvc? svc_proc_read : rpc_proc_read,
  122.       data);
  123. }
  124. struct proc_dir_entry *
  125. rpc_proc_register(struct rpc_stat *statp)
  126. {
  127. return do_register(statp->program->name, statp, 0);
  128. }
  129. void
  130. rpc_proc_unregister(const char *name)
  131. {
  132. remove_proc_entry(name, proc_net_rpc);
  133. }
  134. struct proc_dir_entry *
  135. svc_proc_register(struct svc_stat *statp)
  136. {
  137. return do_register(statp->program->pg_name, statp, 1);
  138. }
  139. void
  140. svc_proc_unregister(const char *name)
  141. {
  142. remove_proc_entry(name, proc_net_rpc);
  143. }
  144. void
  145. rpc_proc_init(void)
  146. {
  147. dprintk("RPC: registering /proc/net/rpcn");
  148. if (!proc_net_rpc) {
  149. struct proc_dir_entry *ent;
  150. ent = proc_mkdir("net/rpc", 0);
  151. if (ent) {
  152. ent->owner = THIS_MODULE;
  153. proc_net_rpc = ent;
  154. }
  155. }
  156. }
  157. void
  158. rpc_proc_exit(void)
  159. {
  160. dprintk("RPC: unregistering /proc/net/rpcn");
  161. if (proc_net_rpc) {
  162. proc_net_rpc = NULL;
  163. remove_proc_entry("net/rpc", 0);
  164. }
  165. }
  166. static int __init
  167. init_sunrpc(void)
  168. {
  169. #ifdef RPC_DEBUG
  170. rpc_register_sysctl();
  171. #endif
  172. rpc_proc_init();
  173. return 0;
  174. }
  175. static void __exit
  176. cleanup_sunrpc(void)
  177. {
  178. #ifdef RPC_DEBUG
  179. rpc_unregister_sysctl();
  180. #endif
  181. rpc_proc_exit();
  182. }
  183. MODULE_LICENSE("GPL");
  184. module_init(init_sunrpc);
  185. module_exit(cleanup_sunrpc);