diff -Nru linux-2.5.1-pre11.xs2/Makefile linux-2.5.1-pre11.rqlxs2/Makefile
--- linux-2.5.1-pre11.xs2/Makefile	Thu Dec 13 11:03:41 2001
+++ linux-2.5.1-pre11.rqlxs2/Makefile	Thu Dec 20 19:44:32 2001
@@ -1,7 +1,7 @@
 VERSION = 2
 PATCHLEVEL = 5
 SUBLEVEL = 1
-EXTRAVERSION = -pre11-xs2
+EXTRAVERSION = -pre11-rqlxs2
 
 KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
 
diff -Nru linux-2.5.1-pre11.xs2/drivers/char/Makefile linux-2.5.1-pre11.rqlxs2/drivers/char/Makefile
--- linux-2.5.1-pre11.xs2/drivers/char/Makefile	Thu Dec 13 11:00:44 2001
+++ linux-2.5.1-pre11.rqlxs2/drivers/char/Makefile	Thu Dec 20 19:43:48 2001
@@ -16,7 +16,7 @@
 
 O_TARGET := char.o
 
-obj-y	 += mem.o tty_io.o n_tty.o tty_ioctl.o raw.o pty.o misc.o random.o
+obj-y	 += mem.o tty_io.o n_tty.o tty_ioctl.o raw.o pty.o misc.o random.o rqlsamp.o
 
 # All of the (potential) objects that export symbols.
 # This list comes from 'grep -l EXPORT_SYMBOL *.[hc]'.
diff -Nru linux-2.5.1-pre11.xs2/drivers/char/rqlsamp.c linux-2.5.1-pre11.rqlxs2/drivers/char/rqlsamp.c
--- linux-2.5.1-pre11.xs2/drivers/char/rqlsamp.c	Wed Dec 31 16:00:00 1969
+++ linux-2.5.1-pre11.rqlxs2/drivers/char/rqlsamp.c	Thu Dec 20 19:40:56 2001
@@ -0,0 +1,133 @@
+/*
+ *  linux/kernel/rqlsamp.c
+ *
+ *  Kernel scheduler runqueue length sampler
+ *
+ *  Copyright (C) 2001, Davide Libenzi <davidel@xmailserver.org>
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/fs.h>
+#include <linux/file.h>
+#include <linux/signal.h>
+#include <linux/errno.h>
+#include <linux/mm.h>
+#include <linux/vmalloc.h>
+#include <linux/slab.h>
+#include <linux/poll.h>
+#include <linux/miscdevice.h>
+#include <linux/random.h>
+#include <linux/smp_lock.h>
+#include <linux/wrapper.h>
+#include <linux/string.h>
+#include <linux/list.h>
+#include <linux/spinlock.h>
+#include <linux/wait.h>
+#include <asm/bitops.h>
+#include <asm/uaccess.h>
+#include <asm/system.h>
+#include <asm/io.h>
+#include <asm/atomic.h>
+
+#include <linux/rqlsamp.h>
+
+
+
+
+
+#define DEBUG	0
+#ifdef DEBUG
+#define DPRINTK(x)	printk x
+#define DNPRINTK(n,x)	if (n <= DEBUG) printk x
+#else
+#define DPRINTK(x)
+#define DNPRINTK(n,x)
+#endif
+
+
+
+static int open_rqlsamp(struct inode *inode, struct file *file);
+static int close_rqlsamp(struct inode *inode, struct file *file);
+static ssize_t read_rqlsamp(struct file *file, char *buffer, size_t count,
+							loff_t *ppos);
+
+
+static struct file_operations rqlsamp_fops = {
+	open: open_rqlsamp,
+	release: close_rqlsamp,
+	read: read_rqlsamp,
+};
+
+static struct miscdevice rqlsamp = {
+	RQLSAMP_MINOR, "rqlsamp", &rqlsamp_fops
+};
+
+
+
+
+
+static int open_rqlsamp(struct inode *inode, struct file *file)
+{
+	int *rqbuff;
+
+    if (!(rqbuff = kmalloc((NR_CPUS + 1) * 2 * sizeof(int), GFP_KERNEL)))
+        return -ENOMEM;
+ 
+    file->private_data = rqbuff;
+
+	MOD_INC_USE_COUNT;
+
+	DNPRINTK(3, (KERN_INFO "[%p] /dev/rqlsamp: open()\n", current));
+	return 0;
+}
+
+
+static int close_rqlsamp(struct inode *inode, struct file *file)
+{
+	int *rqbuff = (int *) file->private_data;
+
+	kfree(rqbuff);
+
+	MOD_DEC_USE_COUNT;
+
+	DNPRINTK(3, (KERN_INFO "[%p] /dev/rqlsamp: close()\n", current));
+	return 0;
+}
+
+
+static ssize_t read_rqlsamp(struct file *file, char *buffer, size_t count,
+					   loff_t *ppos)
+{
+	int res;
+	int *rqbuff = (int *) file->private_data;
+
+	if ((res = verify_area(VERIFY_WRITE, buffer, count)))
+		return res;
+
+	if (count < ((NR_CPUS + 1) * 2 * sizeof(int)))
+		return -EINVAL;
+
+	res = rql_snapshot(rqbuff, NR_CPUS + 1);
+
+	copy_to_user((void *) buffer, rqbuff, res * 2 * sizeof(int));
+
+	return res * 2 * sizeof(int);
+}
+
+
+int __init init_rqlsamp(void)
+{
+	misc_register(&rqlsamp);
+
+	printk(KERN_INFO "[%p] /dev/rqlsamp: driver installed.\n", current);
+
+	return 0;
+}
+
+
+module_init(init_rqlsamp);
+
diff -Nru linux-2.5.1-pre11.xs2/include/linux/rqlsamp.h linux-2.5.1-pre11.rqlxs2/include/linux/rqlsamp.h
--- linux-2.5.1-pre11.xs2/include/linux/rqlsamp.h	Wed Dec 31 16:00:00 1969
+++ linux-2.5.1-pre11.rqlxs2/include/linux/rqlsamp.h	Thu Dec 20 19:16:41 2001
@@ -0,0 +1,20 @@
+/*
+ *  linux/include/linux/rqlsamp.h
+ *
+ *  Kernel scheduler runqueue length sampler
+ *
+ *  Copyright (C) 2001, Davide Libenzi <davidel@xmailserver.org>
+ *
+ */
+
+#ifndef _LINUX_RQLSAMP_H
+#define _LINUX_RQLSAMP_H
+
+
+#define RQLSAMP_MINOR	116
+
+
+
+
+#endif	/* #ifndef _LINUX_RQLSAMP_H */
+
diff -Nru linux-2.5.1-pre11.xs2/include/linux/sched.h linux-2.5.1-pre11.rqlxs2/include/linux/sched.h
--- linux-2.5.1-pre11.xs2/include/linux/sched.h	Thu Dec 20 15:41:57 2001
+++ linux-2.5.1-pre11.rqlxs2/include/linux/sched.h	Thu Dec 20 19:47:38 2001
@@ -145,6 +145,7 @@
 extern rwlock_t tasklist_lock;
 extern spinlock_t mmlist_lock;
 
+extern int rql_snapshot(int *rql, int size);
 extern void sched_cpudmap_init(void);
 extern void sched_init(void);
 extern void init_idle(void);
diff -Nru linux-2.5.1-pre11.xs2/kernel/sched.c linux-2.5.1-pre11.rqlxs2/kernel/sched.c
--- linux-2.5.1-pre11.xs2/kernel/sched.c	Thu Dec 20 17:10:11 2001
+++ linux-2.5.1-pre11.rqlxs2/kernel/sched.c	Thu Dec 20 19:28:40 2001
@@ -1795,3 +1795,20 @@
 	atomic_inc(&init_mm.mm_count);
 	enter_lazy_tlb(&init_mm, current, cpu);
 }
+
+
+int rql_snapshot(int *rql, int size)
+{
+	int i;
+
+	if ((smp_num_cpus + 1) > size)
+		return -1;
+	for (i = 0; i < smp_num_cpus; i++) {
+		*rql++ = cpu_logical_map(i);
+		*rql++ = qnr_running(i);
+	}
+	*rql++ = -1;
+	*rql++ = qnr_running(RT_QID);
+	return smp_num_cpus + 1;
+}
+
