stats.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:4k
源码类别:

嵌入式Linux

开发平台:

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/kernel.h>
  17. #include <linux/sched.h>
  18. #include <linux/proc_fs.h>
  19. #include <linux/sunrpc/clnt.h>
  20. #include <linux/sunrpc/svcsock.h>
  21. #define RPCDBG_FACILITY RPCDBG_MISC
  22. static struct proc_dir_entry *proc_net_rpc = NULL;
  23. /*
  24.  * Get RPC client stats
  25.  */
  26. int
  27. rpc_proc_read(char *buffer, char **start, off_t offset, int count,
  28. int *eof, void *data)
  29. {
  30. struct rpc_stat *statp = (struct rpc_stat *) data;
  31. struct rpc_program *prog = statp->program;
  32. struct rpc_version *vers;
  33. int len, i, j;
  34. len = sprintf(buffer,
  35. "net %d %d %d %dn",
  36. statp->netcnt,
  37. statp->netudpcnt,
  38. statp->nettcpcnt,
  39. statp->nettcpconn);
  40. len += sprintf(buffer + len,
  41. "rpc %d %d %dn",
  42. statp->rpccnt,
  43. statp->rpcretrans,
  44. statp->rpcauthrefresh);
  45. for (i = 0; i < prog->nrvers; i++) {
  46. if (!(vers = prog->version[i]))
  47. continue;
  48. len += sprintf(buffer + len, "proc%d %d",
  49. vers->number, vers->nrprocs);
  50. for (j = 0; j < vers->nrprocs; j++)
  51. len += sprintf(buffer + len, " %d",
  52. vers->procs[j].p_count);
  53. buffer[len++] = 'n';
  54. }
  55. if (offset >= len) {
  56. *start = buffer;
  57. *eof = 1;
  58. return 0;
  59. }
  60. *start = buffer + offset;
  61. if ((len -= offset) > count)
  62. return count;
  63. *eof = 1;
  64. return len;
  65. }
  66. /*
  67.  * Get RPC server stats
  68.  */
  69. int
  70. svc_proc_read(char *buffer, char **start, off_t offset, int count,
  71. int *eof, void *data)
  72. {
  73. struct svc_stat *statp = (struct svc_stat *) data;
  74. struct svc_program *prog = statp->program;
  75. struct svc_procedure *proc;
  76. struct svc_version *vers;
  77. int len, i, j;
  78. len = sprintf(buffer,
  79. "net %d %d %d %dn",
  80. statp->netcnt,
  81. statp->netudpcnt,
  82. statp->nettcpcnt,
  83. statp->nettcpconn);
  84. len += sprintf(buffer + len,
  85. "rpc %d %d %d %d %dn",
  86. statp->rpccnt,
  87. statp->rpcbadfmt+statp->rpcbadauth+statp->rpcbadclnt,
  88. statp->rpcbadfmt,
  89. statp->rpcbadauth,
  90. statp->rpcbadclnt);
  91. for (i = 0; i < prog->pg_nvers; i++) {
  92. if (!(vers = prog->pg_vers[i]) || !(proc = vers->vs_proc))
  93. continue;
  94. len += sprintf(buffer + len, "proc%d %d", i, vers->vs_nproc);
  95. for (j = 0; j < vers->vs_nproc; j++, proc++)
  96. len += sprintf(buffer + len, " %d", proc->pc_count);
  97. buffer[len++] = 'n';
  98. }
  99. if (offset >= len) {
  100. *start = buffer;
  101. *eof = 1;
  102. return 0;
  103. }
  104. *start = buffer + offset;
  105. if ((len -= offset) > count)
  106. return count;
  107. *eof = 1;
  108. return len;
  109. }
  110. /*
  111.  * Register/unregister RPC proc files
  112.  */
  113. static inline struct proc_dir_entry *
  114. do_register(const char *name, void *data, int issvc)
  115. {
  116. rpc_proc_init();
  117. dprintk("RPC: registering /proc/net/rpc/%sn", name);
  118. return create_proc_read_entry(name, 0, proc_net_rpc, 
  119.       issvc? svc_proc_read : rpc_proc_read,
  120.       data);
  121. }
  122. struct proc_dir_entry *
  123. rpc_proc_register(struct rpc_stat *statp)
  124. {
  125. return do_register(statp->program->name, statp, 0);
  126. }
  127. void
  128. rpc_proc_unregister(const char *name)
  129. {
  130. remove_proc_entry(name, proc_net_rpc);
  131. }
  132. struct proc_dir_entry *
  133. svc_proc_register(struct svc_stat *statp)
  134. {
  135. return do_register(statp->program->pg_name, statp, 1);
  136. }
  137. void
  138. svc_proc_unregister(const char *name)
  139. {
  140. remove_proc_entry(name, proc_net_rpc);
  141. }
  142. void
  143. rpc_proc_init(void)
  144. {
  145. dprintk("RPC: registering /proc/net/rpcn");
  146. if (!proc_net_rpc) {
  147. struct proc_dir_entry *ent;
  148. ent = proc_mkdir("net/rpc", 0);
  149. if (ent) {
  150. ent->owner = THIS_MODULE;
  151. proc_net_rpc = ent;
  152. }
  153. }
  154. }
  155. void
  156. rpc_proc_exit(void)
  157. {
  158. dprintk("RPC: unregistering /proc/net/rpcn");
  159. if (proc_net_rpc) {
  160. proc_net_rpc = NULL;
  161. remove_proc_entry("net/rpc", 0);
  162. }
  163. }
  164. #ifdef MODULE
  165. int
  166. init_module(void)
  167. {
  168. #ifdef RPC_DEBUG
  169. rpc_register_sysctl();
  170. #endif
  171. rpc_proc_init();
  172. return 0;
  173. }
  174. void
  175. cleanup_module(void)
  176. {
  177. #ifdef RPC_DEBUG
  178. rpc_unregister_sysctl();
  179. #endif
  180. rpc_proc_exit();
  181. }
  182. #endif
  183. MODULE_LICENSE("GPL");