+2006-02-17 Bastien Nocera <hadess@hadess.net>
+
+ * 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 <sandmann@redhat.com>
* sysprof.glade: Remove ancestors pane in favor of radiobuttons in
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
#include "sysprof-module.h"
#include <linux/version.h>
-#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 <linux/notifier.h>
+#endif
+
#include <linux/kallsyms.h>
MODULE_LICENSE("GPL");
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;
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)
{
{
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;
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;
}