Messages in this thread Patch in this message |  | | From | kuznet@ms2 ... | Subject | Re: 2.4.4: Kernel crash, possibly tcp related | Date | Tue, 1 May 2001 20:44:52 +0400 (MSK DST) |
| |
Hello!
> this is the strict fix:
Andrea, you caught the problem!
The fix is not right though (it is equivalent to straight tp->send_head=NULL, as you noticed. It also corrupts queue in an opposite manner.) Right fix is appended.
Explanation: in do_fault we must undo effect of enqueueing new segment in the case the segment remained empty. tp->send_head points to the first unsent skb in queue and it is NULL when and only when all the skbs are already sent. (Invariant is: tp->send_head==NULL || tp->send_head->seq == tp->snd_nxt) I crapped this case except for the case when queue is completely empty, so that the last sent skb was accounted in packets_out twice...
Damn, what a silly mistake was it... shame.
Alexey
--- ../vger3-010426/linux/net/ipv4/tcp.c Wed Apr 25 21:02:18 2001 +++ linux/net/ipv4/tcp.c Tue May 1 20:38:44 2001 @@ -1185,7 +1187,7 @@ if (skb->len==0) { if (tp->send_head == skb) { tp->send_head = skb->prev; - if (tp->send_head == (struct sk_buff*)&sk->write_queue) + if (TCP_SKB_CB(skb)->seq == tp->snd_nxt) tp->send_head = NULL; } __skb_unlink(skb, skb->list); - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
|  |