[PATCH] large pid and a few other fixes
Andries.Brouwer en cwi.nl
Andries.Brouwer en cwi.nl
Dom Ene 23 23:18:18 CST 2000
Below a patch with 31-bit pids and various compilation fixes.
The fork patch makes a fork measurably faster on a system
with more than 5000 processes.
I started making CONFIG_15BIT_PID a config option,
but decided against it as long as no need had been established.
(Yesterday or so I did a grep on "all Linux sources" for
msqid_ds and shmid_ds, more in particular msg_lspid, msg_lrpid,
shm_cpid, shm_lpid, and these are used in only a handful of places,
but I have not yet studied these places. Maybe it will turn out
to be necessary to have a config option after all, say for ibcs users,
we'll see. In case you like the opposite default, change the
#ifdef CONFIG_15BIT_PID
into
#if 1
or so, below in threads.h. (But as long as 2.4 has not been released
some testing is good, to see the effects of a larger pid.
Maybe someone will adapt ps.)
The other changes fix some compilation problems on Sparc,
and some miscellaneous warnings.
Andries
diff -u --recursive --new-file ../linux-2.3.40/linux/drivers/block/ide-geometry.c ./linux/drivers/block/ide-geometry.c
--- ../linux-2.3.40/linux/drivers/block/ide-geometry.c Fri Jan 21 14:28:07 2000
+++ ./linux/drivers/block/ide-geometry.c Fri Jan 21 14:30:03 2000
@@ -2,6 +2,8 @@
* linux/drivers/block/ide-geometry.c
*/
#include <linux/config.h>
+
+#ifdef CONFIG_BLK_DEV_IDE
#include <linux/ide.h>
#include <asm/io.h>
@@ -237,3 +239,4 @@
drive->bios_cyl, drive->bios_head, drive->bios_sect);
return ret;
}
+#endif /* CONFIG_BLK_DEV_IDE */
diff -u --recursive --new-file ../linux-2.3.40/linux/drivers/net/ppp_generic.c ./linux/drivers/net/ppp_generic.c
--- ../linux-2.3.40/linux/drivers/net/ppp_generic.c Tue Nov 9 20:50:49 1999
+++ ./linux/drivers/net/ppp_generic.c Fri Jan 21 15:36:15 2000
@@ -559,7 +559,9 @@
{
int err;
#ifndef MODULE
+#ifdef CONFIG_PPP_DEFLATE
extern struct compressor ppp_deflate, ppp_deflate_draft;
+#endif
extern int ppp_async_init(void);
extern int ppp_sync_init(void);
#endif
diff -u --recursive --new-file ../linux-2.3.40/linux/fs/partitions/check.c ./linux/fs/partitions/check.c
--- ../linux-2.3.40/linux/fs/partitions/check.c Fri Jan 21 14:28:09 2000
+++ ./linux/fs/partitions/check.c Fri Jan 21 14:53:07 2000
@@ -276,7 +276,6 @@
void register_disk(struct gendisk *gdev, kdev_t dev, unsigned minors,
struct block_device_operations *ops, long size)
{
- unsigned first = (unsigned)dev;
if (!gdev)
return;
grok_partitions(gdev, MINOR(dev)>>gdev->minor_shift, minors, size);
diff -u --recursive --new-file ../linux-2.3.40/linux/fs/partitions/msdos.c ./linux/fs/partitions/msdos.c
--- ../linux-2.3.40/linux/fs/partitions/msdos.c Fri Jan 21 14:28:09 2000
+++ ./linux/fs/partitions/msdos.c Fri Jan 21 14:30:03 2000
@@ -26,7 +26,9 @@
#include <linux/major.h>
#include <linux/string.h>
#include <linux/blk.h>
-#include <linux/ide.h> /* IDE xlate */
+#ifdef CONFIG_BLK_DEV_IDE
+#include <linux/ide.h> /* for ide_xlate_1024() */
+#endif
#include <asm/system.h>
diff -u --recursive --new-file ../linux-2.3.40/linux/fs/proc/base.c ./linux/fs/proc/base.c
--- ../linux-2.3.40/linux/fs/proc/base.c Fri Jan 7 21:59:42 2000
+++ ./linux/fs/proc/base.c Fri Jan 21 18:50:53 2000
@@ -29,9 +29,12 @@
* inumbers of the rest of procfs (currently those are in 0x0000--0xffff).
* As soon as we'll get a separate superblock we will be able to forget
* about magical ranges too.
+ *
+ * For example, the define below may be replaced by
+ * #define fake_ino(pid,ino) 0x10000
*/
-#define fake_ino(pid,ino) (((pid)<<16)|(ino))
+#define fake_ino(pid,ino) (((1)<<16)|(ino))
ssize_t proc_pid_read_maps(struct task_struct*,struct file*,char*,size_t,loff_t*);
int proc_pid_stat(struct task_struct*,char*);
@@ -610,7 +613,9 @@
return 1;
p = base_stuff + i;
while (p->name) {
- if (filldir(dirent, p->name, p->len, filp->f_pos, fake_ino(pid, p->type)) < 0)
+ if (filldir(dirent, p->name, p->len,
+ filp->f_pos,
+ fake_ino(pid, p->type)) < 0)
return 0;
filp->f_pos++;
p++;
@@ -621,7 +626,8 @@
/* building an inode */
-static struct inode *proc_pid_make_inode(struct super_block * sb, struct task_struct *task, int ino)
+static struct inode *proc_pid_make_inode(struct super_block * sb,
+ struct task_struct *task, int ino)
{
struct inode * inode;
@@ -923,9 +929,7 @@
goto out;
pid *= 10;
pid += c;
- if (!pid)
- goto out;
- if (pid & 0xffff0000)
+ if (pid <= 0 || pid >= PID_MAX)
goto out;
}
diff -u --recursive --new-file ../linux-2.3.40/linux/fs/super.c ./linux/fs/super.c
--- ../linux-2.3.40/linux/fs/super.c Fri Jan 21 14:28:09 2000
+++ ./linux/fs/super.c Fri Jan 21 14:51:02 2000
@@ -1272,7 +1272,7 @@
}
return 0;
}
- printk(KERN_ERR "error %d\n",PTR_ERR(bdev));
+ printk(KERN_ERR "error %ld\n",PTR_ERR(bdev));
return error;
}
remove_vfsmnt(old_root_dev);
diff -u --recursive --new-file ../linux-2.3.40/linux/include/linux/threads.h ./linux/include/linux/threads.h
--- ../linux-2.3.40/linux/include/linux/threads.h Tue Jan 11 03:29:07 2000
+++ ./linux/include/linux/threads.h Fri Jan 21 19:12:26 2000
@@ -15,8 +15,18 @@
#define MIN_THREADS_LEFT_FOR_ROOT 4
/*
- * This controls the maximum pid allocated to a process
+ * One more than the maximum pid allocated to a process
+ * (should be positive when assigned to an int)
*/
+#ifdef CONFIG_15BIT_PID
#define PID_MAX 0x8000
+#else
+#define PID_MAX 0x7fffffff
+#endif
+
+/*
+ * Place where we start again after a full cycle
+ */
+#define PID_MIN 300
#endif
diff -u --recursive --new-file ../linux-2.3.40/linux/kernel/fork.c ./linux/kernel/fork.c
--- ../linux-2.3.40/linux/kernel/fork.c Tue Dec 14 00:39:24 1999
+++ ./linux/kernel/fork.c Fri Jan 21 14:30:04 2000
@@ -194,26 +194,19 @@
return current->pid;
spin_lock(&lastpid_lock);
- if((++last_pid) & 0xffff8000) {
- last_pid = 300; /* Skip daemons etc. */
- goto inside;
- }
- if(last_pid >= next_safe) {
-inside:
- next_safe = PID_MAX;
+ if(++last_pid >= next_safe) {
read_lock(&tasklist_lock);
repeat:
+ if (last_pid >= PID_MAX)
+ last_pid = PID_MIN;
+ next_safe = PID_MAX;
+
for_each_task(p) {
if(p->pid == last_pid ||
p->pgrp == last_pid ||
- p->session == last_pid) {
- if(++last_pid >= next_safe) {
- if(last_pid & 0xffff8000)
- last_pid = 300;
- next_safe = PID_MAX;
- }
- goto repeat;
- }
+ p->session == last_pid)
+ if(++last_pid >= next_safe)
+ goto repeat;
if(p->pid > last_pid && next_safe > p->pid)
next_safe = p->pid;
if(p->pgrp > last_pid && next_safe > p->pgrp)
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo en vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/
Más información sobre la lista de distribución Ayuda