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