Binary files ref/ID and 2.4.4aa1/ID differ
diff -urN ref/arch/i386/lib/usercopy.c 2.4.4aa1/arch/i386/lib/usercopy.c
--- ref/arch/i386/lib/usercopy.c	Sat Apr 28 05:24:30 2001
+++ 2.4.4aa1/arch/i386/lib/usercopy.c	Sat Apr 28 19:25:20 2001
@@ -6,6 +6,7 @@
  * Copyright 1997 Linus Torvalds
  */
 #include <linux/config.h>
+#include <linux/condsched.h>
 #include <asm/uaccess.h>
 #include <asm/mmx.h>
 
@@ -91,6 +92,7 @@
 		  "=&D" (__d2)						   \
 		: "i"(-EFAULT), "0"(count), "1"(count), "3"(src), "4"(dst) \
 		: "memory");						   \
+	conditional_schedule();						   \
 } while (0)
 
 long
@@ -134,6 +136,7 @@
 		".previous"						\
 		: "=&c"(size), "=&D" (__d0)				\
 		: "r"(size & 3), "0"(size / 4), "1"(addr), "a"(0));	\
+	conditional_schedule();						\
 } while (0)
 
 unsigned long
@@ -180,5 +183,6 @@
 		:"=r" (n), "=D" (s), "=a" (res), "=c" (tmp)
 		:"0" (n), "1" (s), "2" (0), "3" (mask)
 		:"cc");
+	conditional_schedule();
 	return res & mask;
 }
diff -urN ref/include/asm-alpha/uaccess.h 2.4.4aa1/include/asm-alpha/uaccess.h
--- ref/include/asm-alpha/uaccess.h	Sun Apr  1 20:11:14 2001
+++ 2.4.4aa1/include/asm-alpha/uaccess.h	Sat Apr 28 19:33:36 2001
@@ -3,6 +3,7 @@
 
 #include <linux/errno.h>
 #include <linux/sched.h>
+#include <linux/condsched.h>
 
 
 /*
@@ -361,6 +362,7 @@
 		: "0" (__cu_len), "1" (__cu_from), "2" (__cu_to), "3"(pv)
 		: "$1","$2","$3","$4","$5","$28","memory");
 
+	conditional_schedule();
 	return __cu_len;
 }
 
@@ -380,6 +382,7 @@
 			  "3" (pv)
 			: "$1","$2","$3","$4","$5","$28","memory");
 		len = __cu_len;
+		conditional_schedule();
 	}
 	return len;
 }
@@ -417,6 +420,7 @@
 		: "=r"(__cl_len), "=r"(__cl_to), "=r"(pv)
 		: "0"(__cl_len), "1"(__cl_to), "2"(pv)
 		: "$1","$2","$3","$4","$5","$28","memory");
+	conditional_schedule();
 	return __cl_len;
 }
 
@@ -433,6 +437,7 @@
 			: "0"(__cl_len), "1"(__cl_to), "2"(pv)
 			: "$1","$2","$3","$4","$5","$28","memory");
 		len = __cl_len;
+		conditional_schedule();
 	}
 	return len;
 }
@@ -446,8 +451,10 @@
 strncpy_from_user(char *to, const char *from, long n)
 {
 	long ret = -EFAULT;
-	if (__access_ok((long)from, 0, get_fs()))
+	if (__access_ok((long)from, 0, get_fs())) {
 		ret = __strncpy_from_user(to, from, n);
+		conditional_schedule();
+	}
 	return ret;
 }
 
@@ -456,7 +463,12 @@
 
 extern inline long strlen_user(const char *str)
 {
-	return access_ok(VERIFY_READ,str,0) ? __strlen_user(str) : 0;
+	long ret = 0;
+	if (access_ok(VERIFY_READ,str,0)) {
+		ret = __strlen_user(str);
+		conditional_schedule();
+	}
+	return ret;
 }
 
 /* Returns: 0 if exception before NUL or reaching the supplied limit (N),
@@ -465,7 +477,12 @@
 
 extern inline long strnlen_user(const char *str, long n)
 {
-	return access_ok(VERIFY_READ,str,0) ? __strnlen_user(str, n) : 0;
+	long ret = 0;
+	if (access_ok(VERIFY_READ,str,0)) {
+		ret = __strnlen_user(str, n);
+		conditional_schedule();
+	}
+	return ret;
 }
 
 /*
diff -urN ref/include/asm-i386/uaccess.h 2.4.4aa1/include/asm-i386/uaccess.h
--- ref/include/asm-i386/uaccess.h	Sat Apr 28 05:24:45 2001
+++ 2.4.4aa1/include/asm-i386/uaccess.h	Sat Apr 28 19:46:07 2001
@@ -6,6 +6,7 @@
  */
 #include <linux/config.h>
 #include <linux/sched.h>
+#include <linux/condsched.h>
 #include <asm/page.h>
 
 #define VERIFY_READ 0
@@ -258,6 +259,7 @@
 		: "=&c"(size), "=&D" (__d0), "=&S" (__d1)		\
 		: "r"(size & 3), "0"(size / 4), "1"(to), "2"(from)	\
 		: "memory");						\
+	conditional_schedule();						\
 } while (0)
 
 #define __copy_user_zeroing(to,from,size)				\
@@ -286,6 +288,7 @@
 		: "=&c"(size), "=&D" (__d0), "=&S" (__d1)		\
 		: "r"(size & 3), "0"(size / 4), "1"(to), "2"(from)	\
 		: "memory");						\
+	conditional_schedule();						\
 } while (0)
 
 /* We let the __ versions of copy_from/to_user inline, because they're often
@@ -326,6 +329,7 @@
 			: "=c"(size), "=&S" (__d0), "=&D" (__d1)\
 			: "1"(from), "2"(to), "0"(size/4)	\
 			: "memory");				\
+		conditional_schedule();				\
 		break;						\
 	case 1:							\
 		__asm__ __volatile__(				\
@@ -416,6 +420,7 @@
 			: "=c"(size), "=&S" (__d0), "=&D" (__d1)\
 			: "1"(from), "2"(to), "0"(size/4)	\
 			: "memory");				\
+		conditional_schedule();				\
 		break;						\
 	case 1:							\
 		__asm__ __volatile__(				\
diff -urN ref/include/linux/condsched.h 2.4.4aa1/include/linux/condsched.h
--- ref/include/linux/condsched.h	Thu Jan  1 01:00:00 1970
+++ 2.4.4aa1/include/linux/condsched.h	Sat Apr 28 18:48:39 2001
@@ -0,0 +1,14 @@
+#ifndef _LINUX_CONDSCHED_H
+#define _LINUX_CONDSCHED_H
+
+#ifndef __ASSEMBLY__
+#define conditional_schedule() \
+do { \
+	if (current->need_resched) { \
+		current->state = TASK_RUNNING; \
+		schedule(); \
+	} \
+} while(0)
+#endif
+
+#endif