Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 407
b: refs/heads/master
c: d5ac99a
h: refs/heads/master
i:
  405: e12cd9d
  403: 83263fc
  399: 5b8ff42
v: v3
  • Loading branch information
David S. Miller authored and David S. Miller committed Apr 25, 2005
1 parent 3f9d2a1 commit 11845c1
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 17 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 158a0e45b69254a9ee4d7795e3b98d8c959fb799
refs/heads/master: d5ac99a648b8c61d0c7f1c32a8ab7f1dca0123d2
11 changes: 6 additions & 5 deletions trunk/include/net/tcp.h
Original file line number Diff line number Diff line change
Expand Up @@ -1417,19 +1417,20 @@ tcp_nagle_check(const struct tcp_sock *tp, const struct sk_buff *skb,
tcp_minshall_check(tp))));
}

extern void tcp_set_skb_tso_segs(struct sk_buff *, unsigned int);
extern void tcp_set_skb_tso_segs(struct sock *, struct sk_buff *);

/* This checks if the data bearing packet SKB (usually sk->sk_send_head)
* should be put on the wire right now.
*/
static __inline__ int tcp_snd_test(const struct tcp_sock *tp,
static __inline__ int tcp_snd_test(struct sock *sk,
struct sk_buff *skb,
unsigned cur_mss, int nonagle)
{
struct tcp_sock *tp = tcp_sk(sk);
int pkts = tcp_skb_pcount(skb);

if (!pkts) {
tcp_set_skb_tso_segs(skb, tp->mss_cache_std);
tcp_set_skb_tso_segs(sk, skb);
pkts = tcp_skb_pcount(skb);
}

Expand Down Expand Up @@ -1490,7 +1491,7 @@ static __inline__ void __tcp_push_pending_frames(struct sock *sk,
if (skb) {
if (!tcp_skb_is_last(sk, skb))
nonagle = TCP_NAGLE_PUSH;
if (!tcp_snd_test(tp, skb, cur_mss, nonagle) ||
if (!tcp_snd_test(sk, skb, cur_mss, nonagle) ||
tcp_write_xmit(sk, nonagle))
tcp_check_probe_timer(sk, tp);
}
Expand All @@ -1508,7 +1509,7 @@ static __inline__ int tcp_may_send_now(struct sock *sk, struct tcp_sock *tp)
struct sk_buff *skb = sk->sk_send_head;

return (skb &&
tcp_snd_test(tp, skb, tcp_current_mss(sk, 1),
tcp_snd_test(sk, skb, tcp_current_mss(sk, 1),
tcp_skb_is_last(sk, skb) ? TCP_NAGLE_PUSH : tp->nonagle));
}

Expand Down
25 changes: 14 additions & 11 deletions trunk/net/ipv4/tcp_output.c
Original file line number Diff line number Diff line change
Expand Up @@ -427,7 +427,7 @@ void tcp_push_one(struct sock *sk, unsigned cur_mss)
struct tcp_sock *tp = tcp_sk(sk);
struct sk_buff *skb = sk->sk_send_head;

if (tcp_snd_test(tp, skb, cur_mss, TCP_NAGLE_PUSH)) {
if (tcp_snd_test(sk, skb, cur_mss, TCP_NAGLE_PUSH)) {
/* Send it out now. */
TCP_SKB_CB(skb)->when = tcp_time_stamp;
tcp_tso_set_push(skb);
Expand All @@ -440,9 +440,12 @@ void tcp_push_one(struct sock *sk, unsigned cur_mss)
}
}

void tcp_set_skb_tso_segs(struct sk_buff *skb, unsigned int mss_std)
void tcp_set_skb_tso_segs(struct sock *sk, struct sk_buff *skb)
{
if (skb->len <= mss_std) {
struct tcp_sock *tp = tcp_sk(sk);

if (skb->len <= tp->mss_cache_std ||
!(sk->sk_route_caps & NETIF_F_TSO)) {
/* Avoid the costly divide in the normal
* non-TSO case.
*/
Expand All @@ -451,10 +454,10 @@ void tcp_set_skb_tso_segs(struct sk_buff *skb, unsigned int mss_std)
} else {
unsigned int factor;

factor = skb->len + (mss_std - 1);
factor /= mss_std;
factor = skb->len + (tp->mss_cache_std - 1);
factor /= tp->mss_cache_std;
skb_shinfo(skb)->tso_segs = factor;
skb_shinfo(skb)->tso_size = mss_std;
skb_shinfo(skb)->tso_size = tp->mss_cache_std;
}
}

Expand Down Expand Up @@ -525,8 +528,8 @@ static int tcp_fragment(struct sock *sk, struct sk_buff *skb, u32 len)
}

/* Fix up tso_factor for both original and new SKB. */
tcp_set_skb_tso_segs(skb, tp->mss_cache_std);
tcp_set_skb_tso_segs(buff, tp->mss_cache_std);
tcp_set_skb_tso_segs(sk, skb);
tcp_set_skb_tso_segs(sk, buff);

if (TCP_SKB_CB(skb)->sacked & TCPCB_LOST) {
tp->lost_out += tcp_skb_pcount(skb);
Expand Down Expand Up @@ -601,7 +604,7 @@ int tcp_trim_head(struct sock *sk, struct sk_buff *skb, u32 len)
* factor and mss.
*/
if (tcp_skb_pcount(skb) > 1)
tcp_set_skb_tso_segs(skb, tcp_skb_mss(skb));
tcp_set_skb_tso_segs(sk, skb);

return 0;
}
Expand Down Expand Up @@ -752,7 +755,7 @@ int tcp_write_xmit(struct sock *sk, int nonagle)
mss_now = tcp_current_mss(sk, 1);

while ((skb = sk->sk_send_head) &&
tcp_snd_test(tp, skb, mss_now,
tcp_snd_test(sk, skb, mss_now,
tcp_skb_is_last(sk, skb) ? nonagle :
TCP_NAGLE_PUSH)) {
if (skb->len > mss_now) {
Expand Down Expand Up @@ -1676,7 +1679,7 @@ int tcp_write_wakeup(struct sock *sk)
tp->mss_cache = tp->mss_cache_std;
}
} else if (!tcp_skb_pcount(skb))
tcp_set_skb_tso_segs(skb, tp->mss_cache_std);
tcp_set_skb_tso_segs(sk, skb);

TCP_SKB_CB(skb)->flags |= TCPCB_FLAG_PSH;
TCP_SKB_CB(skb)->when = tcp_time_stamp;
Expand Down

0 comments on commit 11845c1

Please sign in to comment.