diff -urN tux-ref/fs/proc/proc_misc.c tux/fs/proc/proc_misc.c --- tux-ref/fs/proc/proc_misc.c Thu Apr 18 04:08:34 2002 +++ tux/fs/proc/proc_misc.c Thu Apr 18 04:08:58 2002 @@ -255,6 +255,66 @@ }; #endif + +/* + * print out TUX internal statistics into /proc/stat. + * (Most of them are not maintained if CONFIG_TUX_DEBUG is off.) + */ + +static int print_tux_procinfo (char *page) +{ + unsigned int len = 0, i; + +#define P(x) \ + do { len += sprintf(page + len, #x ": %u\n", x); } while(0) + + P(kstat.input_fastpath); + P(kstat.input_slowpath); + P(kstat.inputqueue_got_packet); + P(kstat.inputqueue_no_packet); + P(kstat.nr_keepalive_optimized); + P(kstat.parse_static_incomplete); + P(kstat.parse_static_redirect); + P(kstat.parse_static_cachemiss); + P(kstat.parse_static_nooutput); + P(kstat.parse_static_normal); + P(kstat.parse_dynamic_incomplete); + P(kstat.parse_dynamic_redirect); + P(kstat.parse_dynamic_cachemiss); + P(kstat.parse_dynamic_nooutput); + P(kstat.parse_dynamic_normal); + P(kstat.complete_parsing); + P(kstat.nr_free_pending); + P(kstat.nr_allocated); + P(kstat.nr_idle_input_pending); + P(kstat.nr_output_space_pending); + P(kstat.nr_input_pending); + P(kstat.nr_cachemiss_pending); + P(kstat.nr_secondary_pending); + P(kstat.nr_output_pending); + P(kstat.nr_redirect_pending); + P(kstat.nr_finish_pending); + P(kstat.nr_userspace_pending); + P(kstat.nr_postpone_pending); + P(kstat.static_lookup_cachemisses); + P(kstat.static_sendfile_cachemisses); + P(kstat.user_lookup_cachemisses); + P(kstat.user_fetch_cachemisses); + P(kstat.user_sendobject_cachemisses); + P(kstat.user_sendobject_write_misses); + P(kstat.nr_keepalive_reqs); + P(kstat.nr_nonkeepalive_reqs); + + len += sprintf(page + len, "keephist: "); + for (i = 0; i < KEEPALIVE_HIST_SIZE; i++) + if (kstat.keepalive_hist[i]) + len += sprintf(page + len, "%d(%d) ", + i, kstat.keepalive_hist[i]); + len += sprintf(page + len, "\n"); +#undef P + + return len; +} static int kstat_read_proc(char *page, char **start, off_t off, int count, int *eof, void *data) { @@ -329,6 +389,8 @@ kstat.context_swtch, xtime.tv_sec - jif / HZ, total_forks); + + len += print_tux_procinfo(page+len); return proc_calc_metrics(page, start, off, count, eof, len); } diff -urN tux-ref/include/linux/kernel_stat.h tux/include/linux/kernel_stat.h --- tux-ref/include/linux/kernel_stat.h Thu Apr 18 04:08:37 2002 +++ tux/include/linux/kernel_stat.h Thu Apr 18 04:10:03 2002 @@ -30,6 +30,53 @@ unsigned int irqs[NR_CPUS][NR_IRQS]; #endif unsigned int context_swtch; + unsigned int context_swtch_cross; + unsigned int nr_free_pending; + unsigned int nr_allocated; + unsigned int nr_idle_input_pending; + unsigned int nr_output_space_pending; + unsigned int nr_work_pending; + unsigned int nr_input_pending; + unsigned int nr_cachemiss_pending; + unsigned int nr_secondary_pending; + unsigned int nr_output_pending; + unsigned int nr_redirect_pending; + unsigned int nr_postpone_pending; + unsigned int nr_finish_pending; + unsigned int nr_userspace_pending; + unsigned int static_lookup_cachemisses; + unsigned int static_sendfile_cachemisses; + unsigned int user_lookup_cachemisses; + unsigned int user_fetch_cachemisses; + unsigned int user_sendobject_cachemisses; + unsigned int user_sendobject_write_misses; + unsigned int user_sendbuf_cachemisses; + unsigned int user_sendbuf_write_misses; +#define URL_HIST_SIZE 1000 + unsigned int url_hist_hits[URL_HIST_SIZE]; + unsigned int url_hist_misses[URL_HIST_SIZE]; + unsigned int input_fastpath; + unsigned int input_slowpath; + unsigned int inputqueue_got_packet; + unsigned int inputqueue_no_packet; + unsigned int nr_keepalive_optimized; + + unsigned int parse_static_incomplete; + unsigned int parse_static_redirect; + unsigned int parse_static_cachemiss; + unsigned int parse_static_nooutput; + unsigned int parse_static_normal; + unsigned int parse_dynamic_incomplete; + unsigned int parse_dynamic_redirect; + unsigned int parse_dynamic_cachemiss; + unsigned int parse_dynamic_nooutput; + unsigned int parse_dynamic_normal; + unsigned int complete_parsing; + + unsigned int nr_keepalive_reqs; + unsigned int nr_nonkeepalive_reqs; +#define KEEPALIVE_HIST_SIZE 100 + unsigned int keepalive_hist[KEEPALIVE_HIST_SIZE]; }; extern struct kernel_stat kstat;