diff -urNp tux-ref/fs/proc/proc_misc.c tux/fs/proc/proc_misc.c --- tux-ref/fs/proc/proc_misc.c Thu Jun 6 17:26:55 2002 +++ tux/fs/proc/proc_misc.c Thu Jun 6 17:27:59 2002 @@ -289,6 +289,66 @@ static struct file_operations proc_slabi release: seq_release, }; +/* + * 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) { @@ -367,6 +427,8 @@ static int kstat_read_proc(char *page, c xtime.tv_sec - jif / HZ, total_forks); + len += print_tux_procinfo(page+len); + return proc_calc_metrics(page, start, off, count, eof, len); } diff -urNp tux-ref/include/linux/kernel_stat.h tux/include/linux/kernel_stat.h --- tux-ref/include/linux/kernel_stat.h Thu Jun 6 17:26:56 2002 +++ tux/include/linux/kernel_stat.h Thu Jun 6 17:27:07 2002 @@ -29,6 +29,53 @@ struct kernel_stat { #if !defined(CONFIG_ARCH_S390) unsigned int irqs[NR_CPUS][NR_IRQS]; #endif + 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 unsigned long nr_context_switches(void);