/* inet_connection_sock has to be the first member of tcp_sock */
        struct inet_connection_sock     inet_conn;
        u16     tcp_header_len; /* Bytes of tcp header to send          */
+       u16     xmit_size_goal_segs; /* Goal for segmenting output packets */
 
 /*
  *     Header prediction flags
 
                                       int large_allowed)
 {
        struct tcp_sock *tp = tcp_sk(sk);
-       u32 xmit_size_goal;
+       u32 xmit_size_goal, old_size_goal;
 
        xmit_size_goal = mss_now;
 
                                  tp->tcp_header_len);
 
                xmit_size_goal = tcp_bound_to_half_wnd(tp, xmit_size_goal);
-               xmit_size_goal -= (xmit_size_goal % mss_now);
+
+               /* We try hard to avoid divides here */
+               old_size_goal = tp->xmit_size_goal_segs * mss_now;
+
+               if (likely(old_size_goal <= xmit_size_goal &&
+                          old_size_goal + mss_now > xmit_size_goal)) {
+                       xmit_size_goal = old_size_goal;
+               } else {
+                       tp->xmit_size_goal_segs = xmit_size_goal / mss_now;
+                       xmit_size_goal = tp->xmit_size_goal_segs * mss_now;
+               }
        }
 
        return xmit_size_goal;