lkml.org 
[lkml]   [2005]   [Aug]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [ck] [PATCH] Timer Top was: i386 No-Idle-Hz aka Dynamic-Ticks 3
    Hi,

    Here we have a new version that includes Jens Axboe's corrections and
    Con Kolivas tweaks.

    Thanks,

    Daniel
    --
    10LE - Linux
    INdT - Manaus - Brazil
    diff -uprN linux-2.6.12-orig/kernel/Makefile linux-dyn-tick/kernel/Makefile
    --- linux-2.6.12-orig/kernel/Makefile 2005-08-05 09:33:24.000000000 -0400
    +++ linux-dyn-tick/kernel/Makefile 2005-08-05 09:28:18.000000000 -0400
    @@ -30,7 +30,7 @@ obj-$(CONFIG_SYSFS) += ksysfs.o
    obj-$(CONFIG_GENERIC_HARDIRQS) += irq/
    obj-$(CONFIG_CRASH_DUMP) += crash_dump.o
    obj-$(CONFIG_SECCOMP) += seccomp.o
    -obj-$(CONFIG_NO_IDLE_HZ) += dyn-tick.o
    +obj-$(CONFIG_NO_IDLE_HZ) += dyn-tick.o timer_top.o

    ifneq ($(CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER),y)
    # According to Alan Modra <alan@linuxcare.com.au>, the -fno-omit-frame-pointer is
    diff -uprN linux-2.6.12-orig/kernel/timer.c linux-dyn-tick/kernel/timer.c
    --- linux-2.6.12-orig/kernel/timer.c 2005-08-05 09:33:31.000000000 -0400
    +++ linux-dyn-tick/kernel/timer.c 2005-08-05 09:38:33.000000000 -0400
    @@ -508,6 +508,9 @@ static inline void __run_timers(tvec_bas
    }

    #ifdef CONFIG_NO_IDLE_HZ
    +extern struct timer_top_info top_info;
    +extern int account_timer(unsigned int function,
    + struct timer_top_info * top_info);
    /*
    * Find out when the next timer event is due to happen. This
    * is used on S/390 to stop all activity when a cpus is idle.
    @@ -571,6 +574,7 @@ found:
    expires = nte->expires;
    }
    }
    + account_timer((unsigned int)nte->function, &top_info);
    spin_unlock(&base->t_base.lock);
    return expires;
    }
    diff -uprN linux-2.6.12-orig/kernel/timer_top.c linux-dyn-tick/kernel/timer_top.c
    --- linux-2.6.12-orig/kernel/timer_top.c 1969-12-31 20:00:00.000000000 -0400
    +++ linux-dyn-tick/kernel/timer_top.c 2005-08-05 09:28:38.000000000 -0400
    @@ -0,0 +1,108 @@
    +/*
    + * kernel/timer_top.c
    + *
    + * Export Timers information to /proc/top_info
    + *
    + * Copyright (C) 2005 Instituto Nokia de Tecnologia - INdT - Manaus
    + * Written by Daniel Petrini <d.pensator@gmail.com>
    + *
    + * 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/list.h>
    +#include <linux/proc_fs.h>
    +#include <linux/module.h>
    +#include <linux/spinlock.h>
    +
    +static LIST_HEAD(timer_list);
    +
    +struct timer_top_info {
    + unsigned int func_pointer;
    + unsigned long counter;
    + struct list_head list;
    +};
    +
    +struct timer_top_info top_info;
    +
    +static spinlock_t timer_lock = SPIN_LOCK_UNLOCKED;
    +static unsigned long flags;
    +
    +
    +int account_timer(unsigned int function, struct timer_top_info * top_info)
    +{
    + struct timer_top_info *top;
    +
    + spin_lock_irqsave(&timer_lock, flags);
    +
    + list_for_each_entry(top, &timer_list, list) {
    + /* if it is in the list increment its count */
    + if (top->func_pointer == function) {
    + top->counter++;
    + spin_unlock_irqrestore(&timer_lock, flags);
    + goto out;
    + }
    + }
    +
    + /* if you are here then it didnt find so inserts in the list */
    +
    + top = kmalloc(sizeof(struct timer_top_info), GFP_ATOMIC);
    + if (!top)
    + return -ENOMEM;
    + top->func_pointer = function;
    + top->counter = 1;
    + list_add(&top->list, &timer_list);
    +
    + spin_unlock_irqrestore(&timer_lock, flags);
    +
    +out:
    + return 0;
    +}
    +
    +EXPORT_SYMBOL(account_timer);
    +
    +struct top_info_poll {
    + char value[18];
    +};
    +
    +static struct top_info_poll top_info_poll_dt;
    +static struct proc_dir_entry *top_info_file;
    +
    +static int proc_read_top_info(char *page, char **start, off_t off,
    + int count, int *eof, void *data)
    +{
    + char aux[18];
    + struct timer_top_info *top;
    +
    + struct top_info_poll *info_poll_data=(struct top_info_poll *)data;
    +
    + sprintf(page, "Function counter - %s\n", info_poll_data->value);
    +
    + list_for_each_entry(top, &timer_list, list) {
    + sprintf(aux, "%x %lu\n", top->func_pointer, top->counter);
    + strcat(page, aux);
    + }
    +
    + return strlen(page);
    +}
    +
    +static int init_top_info(void)
    +{
    + top_info_file = create_proc_entry("top_info", 0666, NULL);
    + if (top_info_file == NULL) {
    + return -ENOMEM;
    + }
    +
    + strcpy(top_info_poll_dt.value, "Timer Top v0.9.1");
    +
    + top_info_file->data = &top_info_poll_dt;
    + top_info_file->read_proc = &proc_read_top_info;
    + top_info_file->owner = THIS_MODULE;
    +
    + return 0;
    +}
    +
    +module_init(init_top_info);
    +//module_exit();
    \
     
     \ /
      Last update: 2005-08-05 15:59    [W:0.039 / U:0.500 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site