From 0a592c152a9cd57b2685a420d01f4cfe4912c00a Mon Sep 17 00:00:00 2001 From: Bastien Nocera Date: Fri, 17 Feb 2006 15:44:55 +0000 Subject: [PATCH] more ifdef's to make it work with Red Hat Enterprise Linux 4's 2.6.9-based 2006-02-17 Bastien Nocera * configure.ac: * module/sysprof-module.c: (timer_notify), (sysprof_open), (sysprof_release): more ifdef's to make it work with Red Hat Enterprise Linux 4's 2.6.9-based kernel --- ChangeLog | 7 +++++++ configure.ac | 4 ++-- module/sysprof-module.c | 39 +++++++++++++++++++++++++++++++++++---- 3 files changed, 44 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index c442614..2316d32 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2006-02-17 Bastien Nocera + + * configure.ac: + * module/sysprof-module.c: (timer_notify), (sysprof_open), + (sysprof_release): more ifdef's to make it work with Red Hat + Enterprise Linux 4's 2.6.9-based kernel + Sat Feb 4 23:53:05 2006 Søren Sandmann * sysprof.glade: Remove ancestors pane in favor of radiobuttons in diff --git a/configure.ac b/configure.ac index 6523b08..f1998d7 100644 --- a/configure.ac +++ b/configure.ac @@ -61,9 +61,9 @@ if test $kernel_module = "yes"; then KMINOR=`uname -r | cut -d"." -f 2` KMICRO=`uname -r | cut -d"." -f 3 | cut -d"-" -f 1` - if [[ $KMICRO -lt 11 ]] ; then + if [[ $KMICRO -lt 9 ]] ; then echo \* - echo \* Linux \>= 2.6.11 is required + echo \* Linux \>= 2.6.9 is required echo \* exit 1 fi diff --git a/module/sysprof-module.c b/module/sysprof-module.c index e0dff7f..d3ef07a 100644 --- a/module/sysprof-module.c +++ b/module/sysprof-module.c @@ -40,9 +40,15 @@ #include "sysprof-module.h" #include -#if (KERNEL_VERSION(2,6,11) > LINUX_VERSION_CODE) || (!CONFIG_PROFILING) -# error Sysprof needs a Linux 2.6.11 kernel or later, with profiling support compiled in. +#if (KERNEL_VERSION(2,6,9) > LINUX_VERSION_CODE) || (!CONFIG_PROFILING) +# error Sysprof needs a Linux 2.6.9 kernel or later, with profiling support compiled in. #endif + +#if (KERNEL_VERSION(2,6,11) > LINUX_VERSION_CODE) +#define OLD_PROFILE +#include +#endif + #include MODULE_LICENSE("GPL"); @@ -101,9 +107,16 @@ read_frame (void *frame_pointer, StackFrame *frame) return 0; } +#ifdef OLD_PROFILE +static int timer_notify(struct notifier_block * self, unsigned long val, void * data) +#else static int timer_notify (struct pt_regs *regs) +#endif { +#ifdef OLD_PROFILE + struct pt_regs * regs = (struct pt_regs *)data; +#endif void *frame_pointer; static int n_samples; SysprofStackTrace *trace = head; @@ -161,6 +174,14 @@ timer_notify (struct pt_regs *regs) return 0; } +#ifdef OLD_PROFILE +static struct notifier_block timer_notifier = { + .notifier_call = timer_notify, + NULL, + 0 +}; +#endif + static int sysprof_read(struct file *file, char *buffer, size_t count, loff_t *offset) { @@ -208,8 +229,13 @@ sysprof_open(struct inode *inode, struct file *file) { int retval = 0; - if (atomic_inc_return(&client_count) == 1) + if (atomic_inc_return(&client_count) == 1) { +#ifndef OLD_PROFILE retval = register_timer_hook (timer_notify); +#else + retval = register_profile_notifier (&timer_notifier); +#endif + } file->private_data = head; @@ -219,8 +245,13 @@ sysprof_open(struct inode *inode, struct file *file) static int sysprof_release(struct inode *inode, struct file *file) { - if (atomic_dec_return(&client_count) == 0) + if (atomic_dec_return(&client_count) == 0) { +#ifndef OLD_PROFILE unregister_timer_hook (timer_notify); +#else + unregister_profile_notifier (&timer_notifier); +#endif + } return 0; } -- 2.7.4