diff -urN unlock/net/ipv4/tcp.c cksum/net/ipv4/tcp.c
--- unlock/net/ipv4/tcp.c	Thu Sep 14 17:41:07 2000
+++ cksum/net/ipv4/tcp.c	Thu Sep 14 17:48:27 2000
@@ -767,6 +767,7 @@
 	int iovlen, flags;
 	int mss_now;
 	int err, copied;
+	DECLARE_LOCAL_LOCK_DEPTH(lock_depth);
 
 	lock_sock(sk);
 
@@ -848,10 +849,13 @@
 						skb->csum = csum_partial(skb->data,
 									 skb->len, 0);
 					} else {
+						release_kernel_lock_save(lock_depth);
 						skb->csum =
 							csum_and_copy_from_user(
 							from, skb_put(skb, copy),
 							copy, skb->csum, &err);
+						conditional_schedule();
+						reacquire_kernel_lock_restore(lock_depth);
 					}
 		
 					/*
@@ -966,8 +970,11 @@
 			 * Reserve header space and checksum the data.
 			 */
 			skb_reserve(skb, MAX_HEADER + sk->prot->max_header);
+			release_kernel_lock_save(lock_depth);
 			skb->csum = csum_and_copy_from_user(from,
 					skb_put(skb, copy), copy, 0, &err);
+			conditional_schedule();
+			reacquire_kernel_lock_restore(lock_depth);
 
 			if (err)
 				goto do_fault;