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;