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 + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + + + + + +#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 + * + */ + +#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; +} +