* + timer_stats-slimmed-down-using-statistics-infrastucture.patch added to -mm tree
@ 2007-04-21 0:18 akpm
2007-05-13 18:58 ` Arjan van de Ven
0 siblings, 1 reply; 6+ messages in thread
From: akpm @ 2007-04-21 0:18 UTC (permalink / raw)
To: mm-commits; +Cc: mp3, mingo, tglx
The patch titled
timer_stats slimmed down: using statistics infrastucture
has been added to the -mm tree. Its filename is
timer_stats-slimmed-down-using-statistics-infrastucture.patch
*** Remember to use Documentation/SubmitChecklist when testing your code ***
See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find
out what to do about this
------------------------------------------------------
Subject: timer_stats slimmed down: using statistics infrastucture
From: Martin Peschke <mp3@de.ibm.com>
This patch implements timer_stats based on the statistics infrastructure.
Here is some sample output, which even somewhat
resembles /proc/timer_stats.
(>80 char lines because of symbol names, sorry for line breaks).
It reads:
<statistic name> <basket> <hits> <label>
with label being:
<pid> <task name> <start_fn>(<stop_fn>)
[root@t2930041 timer_stats]# cat data
expired missed 0x0
expired - 5381 1019 multipathd do_nanosleep (hrtimer_wakeup)
expired - 2707 1 swapper queue_delayed_work_on
(delayed_work_timer_fn)
expired - 2707 1 swapper queue_delayed_work_on
(delayed_work_timer_fn)
expired - 2707 1 swapper queue_delayed_work_on
(delayed_work_timer_fn)
expired - 2707 1 swapper queue_delayed_work_on
(delayed_work_timer_fn)
expired - 1353 1 swapper neigh_table_init_no_netlink
(neigh_periodic_timer)
expired - 1083 0 swapper page_writeback_init (wb_timer_fn)
expired - 1083 1021 multipathd schedule_timeout
(process_timeout)
expired - 1081 1 init schedule_timeout
(process_timeout)
expired - 677 1 swapper neigh_table_init_no_netlink
(neigh_periodic_timer)
expired - 278 0 swapper sk_reset_timer (tcp_delack_timer)
expired - 193 1 swapper nfsd_export_init
(delayed_work_timer_fn)
expired - 181 975 syslogd do_setitimer (it_real_fn)
expired - 104 1296 sshd sk_reset_timer (tcp_write_timer)
expired - 90 1 swapper ip_rt_init (rt_check_expire)
expired - 90 1244 crond do_nanosleep (hrtimer_wakeup)
expired - 54 896 ip __netdev_watchdog_up
(dev_watchdog)
expired - 44 1 swapper inet_initpeers
(peer_check_expire)
expired - 44 0 swapper addrconf_verify (addrconf_verify)
.
.
.
expired - 1 1368 sadc schedule_timeout
(process_timeout)
expired - 1 1370 sadc blk_plug_device
(blk_unplug_timeout)
expired - 1 1370 sadc schedule_timeout
(process_timeout)
# cat /debug/timer_stats/definition
name=expired state=on units=timer/occurrence type=sparse entries=1024
data=[6920660.417313] started=[6920660.417313] stopped=[ 0.000000]
Signed-off-by: Martin Peschke <mp3@de.ibm.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
---
kernel/time/timer_stats.c | 385 +++++-------------------------------
kernel/timer.c | 2
2 files changed, 59 insertions(+), 328 deletions(-)
diff -puN kernel/time/timer_stats.c~timer_stats-slimmed-down-using-statistics-infrastucture kernel/time/timer_stats.c
--- a/kernel/time/timer_stats.c~timer_stats-slimmed-down-using-statistics-infrastucture
+++ a/kernel/time/timer_stats.c
@@ -26,197 +26,95 @@
* the pid and cmdline from the owner process if applicable.
*
* Start/stop data collection:
- * # echo 1[0] >/proc/timer_stats
+ * # echo state=on[off] > /debug/timer_stats/definition
*
* Display the information collected so far:
- * # cat /proc/timer_stats
+ * # cat /debug/timer_stats/data
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
-#include <linux/proc_fs.h>
#include <linux/module.h>
-#include <linux/spinlock.h>
#include <linux/sched.h>
#include <linux/seq_file.h>
#include <linux/kallsyms.h>
-
-#include <asm/uaccess.h>
+#include <linux/statistic.h>
/*
* This is our basic unit of interest: a timer expiry event identified
* by the timer, its start/expire functions and the PID of the task that
* started the timer. We count the number of times an event happens:
*/
-struct entry {
- /*
- * Hash list:
- */
- struct entry *next;
-
- /*
- * Hash keys:
- */
- void *timer;
- void *start_func;
- void *expire_func;
- pid_t pid;
-
- /*
- * Number of timeout events:
- */
- unsigned long count;
-
+struct tstat_key {
+ void *timer;
+ void *start_func;
+ void *expire_func;
+ pid_t pid;
/*
* We save the command-line string to preserve
* this information past task exit:
*/
- char comm[TASK_COMM_LEN + 1];
-
-} ____cacheline_aligned_in_smp;
-
-/*
- * Spinlock protecting the tables - not taken during lookup:
- */
-static DEFINE_SPINLOCK(table_lock);
-
-/*
- * Per-CPU lookup locks for fast hash lookup:
- */
-static DEFINE_PER_CPU(spinlock_t, lookup_lock);
-
-/*
- * Mutex to serialize state changes with show-stats activities:
- */
-static DEFINE_MUTEX(show_mutex);
-
-/*
- * Collection status, active/inactive:
- */
-static int __read_mostly active;
-
-/*
- * Beginning/end timestamps of measurement:
- */
-static ktime_t time_start, time_stop;
-
-/*
- * tstat entry structs only get allocated while collection is
- * active and never freed during that time - this simplifies
- * things quite a bit.
- *
- * They get freed when a new collection period is started.
- */
-#define MAX_ENTRIES_BITS 10
-#define MAX_ENTRIES (1UL << MAX_ENTRIES_BITS)
-
-static unsigned long nr_entries;
-static struct entry entries[MAX_ENTRIES];
-
-static atomic_t overflow_count;
-
-static void reset_entries(void)
-{
- nr_entries = 0;
- memset(entries, 0, sizeof(entries));
- atomic_set(&overflow_count, 0);
-}
+ char comm[TASK_COMM_LEN + 1];
+};
-static struct entry *alloc_entry(void)
+static void tstat_print_symbol(struct seq_file *m, unsigned long addr)
{
- if (nr_entries >= MAX_ENTRIES)
- return NULL;
-
- return entries + nr_entries++;
-}
-
-/*
- * The entries are in a hash-table, for fast lookup:
- */
-#define TSTAT_HASH_BITS (MAX_ENTRIES_BITS - 1)
-#define TSTAT_HASH_SIZE (1UL << TSTAT_HASH_BITS)
-#define TSTAT_HASH_MASK (TSTAT_HASH_SIZE - 1)
-
-#define __tstat_hashfn(entry) \
- (((unsigned long)(entry)->timer ^ \
- (unsigned long)(entry)->start_func ^ \
- (unsigned long)(entry)->expire_func ^ \
- (unsigned long)(entry)->pid ) & TSTAT_HASH_MASK)
-
-#define tstat_hashentry(entry) (tstat_hash_table + __tstat_hashfn(entry))
-
-static struct entry *tstat_hash_table[TSTAT_HASH_SIZE] __read_mostly;
+ char symname[KSYM_NAME_LEN+1];
-static int match_entries(struct entry *entry1, struct entry *entry2)
-{
- return entry1->timer == entry2->timer &&
- entry1->start_func == entry2->start_func &&
- entry1->expire_func == entry2->expire_func &&
- entry1->pid == entry2->pid;
+ if (lookup_symbol_name(addr, symname) < 0)
+ seq_printf(m, "<%p>", (void *)addr);
+ else
+ seq_printf(m, "%s", symname);
}
-/*
- * Look up whether an entry matching this item is present
- * in the hash already. Must be called with irqs off and the
- * lookup lock held:
- */
-static struct entry *tstat_lookup(struct entry *entry, char *comm)
+static void tstat_label(struct statistic_interface *interface, int i,
+ void *_key, struct seq_file *m)
{
- struct entry **head, *curr, *prev;
+ struct tstat_key *key = _key;
- head = tstat_hashentry(entry);
- curr = *head;
+ seq_printf(m, "\t%5d %-16s ", key->pid, key->comm);
+ tstat_print_symbol(m, (unsigned long)key->start_func);
+ seq_puts(m, " (");
+ tstat_print_symbol(m, (unsigned long)key->expire_func);
+ seq_puts(m, ")");
+}
- /*
- * The fastpath is when the entry is already hashed,
- * we do this with the lookup lock held, but with the
- * table lock not held:
- */
- while (curr) {
- if (match_entries(curr, entry))
- return curr;
+enum tstat_enum {
+ TSTAT_EXPIRED,
+ _TSTAT_NUMBER,
+};
- curr = curr->next;
+static struct statistic_info tstat_info[] = {
+ [TSTAT_EXPIRED] = {
+ .name = "expired",
+ .x_unit = "timer",
+ .y_unit = "occurrence",
+ .defaults = "type=sparse entries=1024",
+ .flags = STATISTIC_FLAGS_KEY,
+ .key_size = sizeof(struct tstat_key)
}
- /*
- * Slowpath: allocate, set up and link a new hash entry:
- */
- prev = NULL;
- curr = *head;
-
- spin_lock(&table_lock);
- /*
- * Make sure we have not raced with another CPU:
- */
- while (curr) {
- if (match_entries(curr, entry))
- goto out_unlock;
+};
- prev = curr;
- curr = curr->next;
- }
+struct statistic tstat_stat[_TSTAT_NUMBER];
- curr = alloc_entry();
- if (curr) {
- *curr = *entry;
- curr->count = 0;
- memcpy(curr->comm, comm, TASK_COMM_LEN);
- if (prev)
- prev->next = curr;
- else
- *head = curr;
- curr->next = NULL;
- }
- out_unlock:
- spin_unlock(&table_lock);
+struct statistic_interface tstat_interface = {
+ .stat = tstat_stat,
+ .info = tstat_info,
+ .number = _TSTAT_NUMBER,
+ .label = tstat_label,
+};
- return curr;
+static int __init tstat_init(void)
+{
+ statistic_create(&tstat_interface, "timer_stats");
+ return 0;
}
+__initcall(tstat_init);
/**
- * timer_stats_update_stats - Update the statistics for a timer.
+ * tstat_inc - Update the statistics for a timer.
* @timer: pointer to either a timer_list or a hrtimer
* @pid: the pid of the task which set up the timer
* @startf: pointer to the function which did the timer setup
@@ -229,179 +127,14 @@ static struct entry *tstat_lookup(struct
void timer_stats_update_stats(void *timer, pid_t pid, void *startf,
void *timerf, char * comm)
{
- /*
- * It doesnt matter which lock we take:
- */
- spinlock_t *lock = &per_cpu(lookup_lock, raw_smp_processor_id());
- struct entry *entry, input;
- unsigned long flags;
-
- input.timer = timer;
- input.start_func = startf;
- input.expire_func = timerf;
- input.pid = pid;
-
- spin_lock_irqsave(lock, flags);
- if (!active)
- goto out_unlock;
-
- entry = tstat_lookup(&input, comm);
- if (likely(entry))
- entry->count++;
- else
- atomic_inc(&overflow_count);
-
- out_unlock:
- spin_unlock_irqrestore(lock, flags);
-}
-
-static void print_name_offset(struct seq_file *m, unsigned long addr)
-{
- char symname[KSYM_NAME_LEN+1];
-
- if (lookup_symbol_name(addr, symname) < 0)
- seq_printf(m, "<%p>", (void *)addr);
- else
- seq_printf(m, "%s", symname);
-}
-
-static int tstats_show(struct seq_file *m, void *v)
-{
- struct timespec period;
- struct entry *entry;
- unsigned long ms;
- long events = 0;
- ktime_t time;
- int i;
-
- mutex_lock(&show_mutex);
- /*
- * If still active then calculate up to now:
- */
- if (active)
- time_stop = ktime_get();
-
- time = ktime_sub(time_stop, time_start);
-
- period = ktime_to_timespec(time);
- ms = period.tv_nsec / 1000000;
-
- seq_puts(m, "Timer Stats Version: v0.1\n");
- seq_printf(m, "Sample period: %ld.%03ld s\n", period.tv_sec, ms);
- if (atomic_read(&overflow_count))
- seq_printf(m, "Overflow: %d entries\n",
- atomic_read(&overflow_count));
-
- for (i = 0; i < nr_entries; i++) {
- entry = entries + i;
- seq_printf(m, "%4lu, %5d %-16s ",
- entry->count, entry->pid, entry->comm);
-
- print_name_offset(m, (unsigned long)entry->start_func);
- seq_puts(m, " (");
- print_name_offset(m, (unsigned long)entry->expire_func);
- seq_puts(m, ")\n");
-
- events += entry->count;
- }
-
- ms += period.tv_sec * 1000;
- if (!ms)
- ms = 1;
-
- if (events && period.tv_sec)
- seq_printf(m, "%ld total events, %ld.%ld events/sec\n", events,
- events / period.tv_sec, events * 1000 / ms);
- else
- seq_printf(m, "%ld total events\n", events);
-
- mutex_unlock(&show_mutex);
-
- return 0;
-}
-
-/*
- * After a state change, make sure all concurrent lookup/update
- * activities have stopped:
- */
-static void sync_access(void)
-{
- unsigned long flags;
- int cpu;
-
- for_each_online_cpu(cpu) {
- spin_lock_irqsave(&per_cpu(lookup_lock, cpu), flags);
- /* nothing */
- spin_unlock_irqrestore(&per_cpu(lookup_lock, cpu), flags);
- }
-}
-
-static ssize_t tstats_write(struct file *file, const char __user *buf,
- size_t count, loff_t *offs)
-{
- char ctl[2];
+ struct tstat_key key;
- if (count != 2 || *offs)
- return -EINVAL;
+ memset(&key, 0, sizeof(struct tstat_key)); /* FIXME: get rid of it? */
+ key.timer = timer;
+ key.start_func = startf;
+ key.expire_func = timerf;
+ key.pid = pid;
+ memcpy(key.comm, comm, TASK_COMM_LEN);
- if (copy_from_user(ctl, buf, count))
- return -EFAULT;
-
- mutex_lock(&show_mutex);
- switch (ctl[0]) {
- case '0':
- if (active) {
- active = 0;
- time_stop = ktime_get();
- sync_access();
- }
- break;
- case '1':
- if (!active) {
- reset_entries();
- time_start = ktime_get();
- active = 1;
- }
- break;
- default:
- count = -EINVAL;
- }
- mutex_unlock(&show_mutex);
-
- return count;
-}
-
-static int tstats_open(struct inode *inode, struct file *filp)
-{
- return single_open(filp, tstats_show, NULL);
-}
-
-static struct file_operations tstats_fops = {
- .open = tstats_open,
- .read = seq_read,
- .write = tstats_write,
- .llseek = seq_lseek,
- .release = seq_release,
-};
-
-void __init init_timer_stats(void)
-{
- int cpu;
-
- for_each_possible_cpu(cpu)
- spin_lock_init(&per_cpu(lookup_lock, cpu));
-}
-
-static int __init init_tstats_procfs(void)
-{
- struct proc_dir_entry *pe;
-
- pe = create_proc_entry("timer_stats", 0644, NULL);
- if (!pe)
- return -ENOMEM;
-
- pe->proc_fops = &tstats_fops;
-
- return 0;
+ statistic_inc_as_key(STAT_SPARSE, tstat_stat, TSTAT_EXPIRED, &key);
}
-__initcall(init_tstats_procfs);
diff -puN kernel/timer.c~timer_stats-slimmed-down-using-statistics-infrastucture kernel/timer.c
--- a/kernel/timer.c~timer_stats-slimmed-down-using-statistics-infrastucture
+++ a/kernel/timer.c
@@ -1315,8 +1315,6 @@ void __init init_timers(void)
int err = timer_cpu_notify(&timers_nb, (unsigned long)CPU_UP_PREPARE,
(void *)(long)smp_processor_id());
- init_timer_stats();
-
BUG_ON(err == NOTIFY_BAD);
register_cpu_notifier(&timers_nb);
open_softirq(TIMER_SOFTIRQ, run_timer_softirq, NULL);
_
Patches currently in -mm which might be from mp3@de.ibm.com are
sunrpc-cleanup-use-seq_release_private-where-appropriate.patch
kallsyms-cleanup-use-seq_release_private-where-appropriate.patch
proc-cleanup-use-seq_release_private-where-appropriate.patch
md-cleanup-use-seq_release_private-where-appropriate.patch
statistics-infrastructure-prerequisite-list.patch
statistics-infrastructure-prerequisite-parser.patch
statistics-infrastructure-prerequisite-parser-fix.patch
add-for_each_substring-and-match_substring.patch
statistics-infrastructure-prerequisite-timestamp.patch
statistics-infrastructure-make-printk_clock-a-generic-kernel-wide-nsec-resolution.patch
statistics-infrastructure-documentation.patch
statistics-infrastructure.patch
statistics-infrastructure-add-for_each_substring-and-match_substring-exploitation.patch
statistics-infrastructure-fix-parsing-of-statistics-type-attribute.patch
statistics-infrastructure-simplify-statistics-debugfs-write-function.patch
statistics-infrastructure-simplify-statistics-debugfs-read-functions.patch
statistics-infrastructure-fix-string-termination.patch
statistics-infrastructure-small-cleanup-in-debugfs-write-function.patch
statistics-infrastructure-fix-cpu-hot-unplug-related-memory-leak.patch
statistics-infrastructure-timer_stats-slimmed-down-statistics-prereq-cleanup.patch
statistics-infrastructure-timer_stats-slimmed-down-statistics-prereq-labels.patch
statistics-infrastructure-timer_stats-slimmed-down-statistics-prereq-keys.patch
statistics-infrastructure-exploitation-zfcp.patch
timer_stats-slimmed-down-using-statistics-infrastucture.patch
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: + timer_stats-slimmed-down-using-statistics-infrastucture.patch added to -mm tree
2007-04-21 0:18 + timer_stats-slimmed-down-using-statistics-infrastucture.patch added to -mm tree akpm
@ 2007-05-13 18:58 ` Arjan van de Ven
2007-05-13 19:20 ` Cédric Augonnet
2007-05-14 8:26 ` Martin Peschke
0 siblings, 2 replies; 6+ messages in thread
From: Arjan van de Ven @ 2007-05-13 18:58 UTC (permalink / raw)
To: linux-kernel; +Cc: akpm, mp3, mingo, tglx
On Fri, 2007-04-20 at 17:18 -0700, akpm@linux-foundation.org wrote:
> The patch titled
> timer_stats slimmed down: using statistics infrastucture
> has been added to the -mm tree. Its filename is
> timer_stats-slimmed-down-using-statistics-infrastucture.patch
>
> *** Remember to use Documentation/SubmitChecklist when testing your code ***
>
> See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find
> out what to do about this
>
> ------------------------------------------------------
> Subject: timer_stats slimmed down: using statistics infrastucture
> From: Martin Peschke <mp3@de.ibm.com>
>
> This patch implements timer_stats based on the statistics infrastructure.
>
> Here is some sample output, which even somewhat
> resembles /proc/timer_stats.
> (>80 char lines because of symbol names, sorry for line breaks).
>
> It reads:
> <statistic name> <basket> <hits> <label>
>
> with label being:
> <pid> <task name> <start_fn>(<stop_fn>)
>
> [root@t2930041 timer_stats]# cat data
this patch changes the userspace API though, and breaks PowerTOP :(
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: + timer_stats-slimmed-down-using-statistics-infrastucture.patch added to -mm tree
2007-05-13 18:58 ` Arjan van de Ven
@ 2007-05-13 19:20 ` Cédric Augonnet
2007-05-14 8:26 ` Martin Peschke
1 sibling, 0 replies; 6+ messages in thread
From: Cédric Augonnet @ 2007-05-13 19:20 UTC (permalink / raw)
To: Arjan van de Ven; +Cc: linux-kernel, akpm, mp3, mingo, tglx
2007/5/13, Arjan van de Ven <arjan@infradead.org>:
> On Fri, 2007-04-20 at 17:18 -0700, akpm@linux-foundation.org wrote:
> > The patch titled
> > timer_stats slimmed down: using statistics infrastucture
> > has been added to the -mm tree. Its filename is
> > timer_stats-slimmed-down-using-statistics-infrastucture.patch
> >
> > *** Remember to use Documentation/SubmitChecklist when testing your code ***
> >
> > See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find
> > out what to do about this
> >
> > ------------------------------------------------------
> > Subject: timer_stats slimmed down: using statistics infrastucture
> > From: Martin Peschke <mp3@de.ibm.com>
> >
> > This patch implements timer_stats based on the statistics infrastructure.
> >
> > Here is some sample output, which even somewhat
> > resembles /proc/timer_stats.
> > (>80 char lines because of symbol names, sorry for line breaks).
> >
> > It reads:
> > <statistic name> <basket> <hits> <label>
> >
> > with label being:
> > <pid> <task name> <start_fn>(<stop_fn>)
> >
> > [root@t2930041 timer_stats]# cat data
>
> this patch changes the userspace API though, and breaks PowerTOP :(
>
> -
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
>
Moreover, the documentation still refers to /proc/timer_stats which do
not appear in my 2.6.21-mm2 kernel.
Regards,
Cédric
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: + timer_stats-slimmed-down-using-statistics-infrastucture.patch added to -mm tree
2007-05-13 18:58 ` Arjan van de Ven
2007-05-13 19:20 ` Cédric Augonnet
@ 2007-05-14 8:26 ` Martin Peschke
2007-05-15 0:06 ` Arjan van de Ven
1 sibling, 1 reply; 6+ messages in thread
From: Martin Peschke @ 2007-05-14 8:26 UTC (permalink / raw)
To: Arjan van de Ven; +Cc: linux-kernel, akpm, mingo, tglx
Arjan van de Ven wrote:
> On Fri, 2007-04-20 at 17:18 -0700, akpm@linux-foundation.org wrote:
>> The patch titled
>> timer_stats slimmed down: using statistics infrastucture
>> has been added to the -mm tree. Its filename is
>> timer_stats-slimmed-down-using-statistics-infrastucture.patch
>>
>> *** Remember to use Documentation/SubmitChecklist when testing your code ***
>>
>> See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find
>> out what to do about this
>>
>> ------------------------------------------------------
>> Subject: timer_stats slimmed down: using statistics infrastucture
>> From: Martin Peschke <mp3@de.ibm.com>
>>
>> This patch implements timer_stats based on the statistics infrastructure.
>>
>> Here is some sample output, which even somewhat
>> resembles /proc/timer_stats.
>> (>80 char lines because of symbol names, sorry for line breaks).
>>
>> It reads:
>> <statistic name> <basket> <hits> <label>
>>
>> with label being:
>> <pid> <task name> <start_fn>(<stop_fn>)
>>
>> [root@t2930041 timer_stats]# cat data
>
> this patch changes the userspace API though, and breaks PowerTOP :(
Though I think it was unfortunate to add the "old" proc API in 2.6.21.
timer_stats is clearly labeled as debug stuff in config help, which is why
debugfs would have been a proper place.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: + timer_stats-slimmed-down-using-statistics-infrastucture.patch added to -mm tree
2007-05-14 8:26 ` Martin Peschke
@ 2007-05-15 0:06 ` Arjan van de Ven
2007-05-15 15:25 ` Martin Peschke
0 siblings, 1 reply; 6+ messages in thread
From: Arjan van de Ven @ 2007-05-15 0:06 UTC (permalink / raw)
To: Martin Peschke; +Cc: linux-kernel, akpm, mingo, tglx
On Mon, 2007-05-14 at 10:26 +0200, Martin Peschke wrote:
> >
> >> [root@t2930041 timer_stats]# cat data
> >
> > this patch changes the userspace API though, and breaks PowerTOP :(
>
> Though I think it was unfortunate to add the "old" proc API in 2.6.21.
> timer_stats is clearly labeled as debug stuff in config help, which is why
> debugfs would have been a proper place.
but it's not there, it's in it's current place. And userspace apps
depend on it... so what's the reason to change this after it became
ABI ? If there's a good one I can fix powertop.. but....
oh well I hope you kept the rest of the file format the same ;)
--
if you want to mail me at work (you don't), use arjan (at) linux.intel.com
Test the interaction between Linux and your BIOS via http://www.linuxfirmwarekit.org
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: + timer_stats-slimmed-down-using-statistics-infrastucture.patch added to -mm tree
2007-05-15 0:06 ` Arjan van de Ven
@ 2007-05-15 15:25 ` Martin Peschke
0 siblings, 0 replies; 6+ messages in thread
From: Martin Peschke @ 2007-05-15 15:25 UTC (permalink / raw)
To: Arjan van de Ven; +Cc: linux-kernel, akpm, mingo, tglx
Arjan van de Ven wrote:
> On Mon, 2007-05-14 at 10:26 +0200, Martin Peschke wrote:
>>>> [root@t2930041 timer_stats]# cat data
>>> this patch changes the userspace API though, and breaks PowerTOP :(
>> Though I think it was unfortunate to add the "old" proc API in 2.6.21.
>> timer_stats is clearly labeled as debug stuff in config help, which is why
>> debugfs would have been a proper place.
>
> but it's not there, it's in it's current place. And userspace apps
> depend on it...
mea culpa
> so what's the reason to change this after it became ABI ?
A sort of race condition ;-)
I posted this as an RFC when one of the last 2.6.21-rc's came out, that is
timerstats wasn't ABI yet, anticipating that I was late anyway.
> If there's a good one I can fix powertop..
kernel/time/timer_stats.c | 385 +++++-------------------------------
kernel/timer.c | 2
2 files changed, 59 insertions(+), 328 deletions(-)
It would be similar for other kernel code I have looked at.
And I think there would be an advantage if one was able to understand device
driver A's statistics code immediately because it was written against some
common library functions.
But it isn't easy to get this interface into the kernel by finding users.
I have got to "intercept" candidates before they add some own ABI to proc or
whereever, while I can't change established statistics.
In short, if you would like to help in this case, I would appreciate it.
> but.... oh well I hope you kept the rest of the file format the same ;)
Almost. Though, there might be ways to keep the old format totally unchanged.
It would be a matter of stretching the concepts of a unified user interface for
statistics.
Currently, my format comes with a substring representing <statistics name>
<basket> preceding each line, which currently reads "expired - " plus the line
powertop is familiar with.
Would it be feasible to to teach powertop to skip the first two elements?
Martin
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2007-05-15 15:25 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-04-21 0:18 + timer_stats-slimmed-down-using-statistics-infrastucture.patch added to -mm tree akpm
2007-05-13 18:58 ` Arjan van de Ven
2007-05-13 19:20 ` Cédric Augonnet
2007-05-14 8:26 ` Martin Peschke
2007-05-15 0:06 ` Arjan van de Ven
2007-05-15 15:25 ` Martin Peschke
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.