[LWN Logo]

Date: Wed, 11 Nov 1998 18:33:58 +0000
From: Nikita Schmidt <cetus@net-cs.ucd.ie>
To: axp-list@redhat.com
Subject: Patch for 2.1.127

Hi,

There seems to be a bug in 2.1.127 that causes kernel panic when the
kernel runs init.  I think the reason is the interface changes in
do_select(), which did not propagate into alpha-specific code.  The
patch below worked for me.

Nikita



--- linux-2.1.127/arch/alpha/kernel/osf_sys.c.orig	Wed Nov 11 15:02:13 1998
+++ linux-2.1.127/arch/alpha/kernel/osf_sys.c	Wed Nov 11 15:47:59 1998
@@ -1133,10 +1133,10 @@
 	   struct timeval32 *tvp)
 {
 	fd_set_buffer *fds;
-	unsigned long timeout;
+	long timeout;
 	int ret;
 
-	timeout = ~0UL;
+	timeout = MAX_SCHEDULE_TIMEOUT;
 	if (tvp) {
 		time_t sec, usec;
 
@@ -1147,8 +1147,6 @@
 
 		timeout = (usec + 1000000/HZ - 1) / (1000000/HZ);
 		timeout += sec * HZ;
-		if (timeout)
-			timeout += jiffies + 1;
 	}
 
 	ret = -ENOMEM;
@@ -1168,7 +1166,7 @@
 	zero_fd_set(n, fds->res_out);
 	zero_fd_set(n, fds->res_ex);
 
-	ret = do_select(n, fds, timeout);
+	ret = do_select(n, fds, &timeout);
 
 	/* OSF does not copy back the remaining time.  */
 
--- linux-2.1.127/arch/sparc64/kernel/sys_sparc32.c.orig	Wed Nov 11 15:25:30 1998
+++ linux-2.1.127/arch/sparc64/kernel/sys_sparc32.c	Wed Nov 11 15:47:59 1998
@@ -1110,10 +1110,11 @@
 {
 	fd_set_buffer *fds;
 	struct timeval32 *tvp = (struct timeval32 *)AA(tvp_x);
-	unsigned long timeout, nn;
+	long timeout;
+	unsigned long nn;
 	int ret;
 
-	timeout = ~0UL;
+	timeout = MAX_SCHEDULE_TIMEOUT;
 	if (tvp) {
 		time_t sec, usec;
 
@@ -1124,8 +1125,6 @@
 
 		timeout = (usec + 1000000/HZ - 1) / (1000000/HZ);
 		timeout += sec * HZ;
-		if (timeout)
-			timeout += jiffies + 1;
 	}
 
 	ret = -ENOMEM;
@@ -1147,12 +1146,11 @@
 	zero_fd_set(n, fds->res_out);
 	zero_fd_set(n, fds->res_ex);
 
-	ret = do_select(n, fds, timeout);
+	ret = do_select(n, fds, &timeout);
 
 	if (tvp && !(current->personality & STICKY_TIMEOUTS)) {
-		unsigned long timeout = current->timeout - jiffies - 1;
 		time_t sec = 0, usec = 0;
-		if ((long) timeout > 0) {
+		if (timeout) {
 			sec = timeout / HZ;
 			usec = timeout % HZ;
 			usec *= (1000000/HZ);
@@ -1160,7 +1158,6 @@
 		put_user(sec, &tvp->tv_sec);
 		put_user(usec, &tvp->tv_usec);
 	}
-	current->timeout = 0;
 
 	if (ret < 0)
 		goto out;


--  
To UNSUBSCRIBE, email to debian-alpha-request@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org