sock_hold(sk);
 }
 
-static void tcp_update_skb_after_send(struct sock *sk, struct sk_buff *skb)
+static void tcp_update_skb_after_send(struct sock *sk, struct sk_buff *skb,
+                                     u64 prior_wstamp)
 {
        struct tcp_sock *tp = tcp_sk(sk);
 
                 * this is a minor annoyance.
                 */
                if (rate != ~0UL && rate && tp->data_segs_out >= 10) {
-                       tp->tcp_wstamp_ns += div64_ul((u64)skb->len * NSEC_PER_SEC, rate);
+                       u64 len_ns = div64_ul((u64)skb->len * NSEC_PER_SEC, rate);
+                       u64 credit = tp->tcp_wstamp_ns - prior_wstamp;
+
+                       /* take into account OS jitter */
+                       len_ns -= min_t(u64, len_ns / 2, credit);
+                       tp->tcp_wstamp_ns += len_ns;
 
                        tcp_internal_pacing(sk);
                }
        struct sk_buff *oskb = NULL;
        struct tcp_md5sig_key *md5;
        struct tcphdr *th;
+       u64 prior_wstamp;
        int err;
 
        BUG_ON(!skb || !tcp_skb_pcount(skb));
                        return -ENOBUFS;
        }
 
-       /* TODO: might take care of jitter here */
+       prior_wstamp = tp->tcp_wstamp_ns;
        tp->tcp_wstamp_ns = max(tp->tcp_wstamp_ns, tp->tcp_clock_cache);
 
        skb->skb_mstamp_ns = tp->tcp_wstamp_ns;
                err = net_xmit_eval(err);
        }
        if (!err && oskb) {
-               tcp_update_skb_after_send(sk, oskb);
+               tcp_update_skb_after_send(sk, oskb, prior_wstamp);
                tcp_rate_skb_sent(sk, oskb);
        }
        return err;
 
                if (unlikely(tp->repair) && tp->repair_queue == TCP_SEND_QUEUE) {
                        /* "skb_mstamp" is used as a start point for the retransmit timer */
-                       tcp_update_skb_after_send(sk, skb);
+                       tcp_update_skb_after_send(sk, skb, tp->tcp_wstamp_ns);
                        goto repair; /* Skip network transmission */
                }
 
                } tcp_skb_tsorted_restore(skb);
 
                if (!err) {
-                       tcp_update_skb_after_send(sk, skb);
+                       tcp_update_skb_after_send(sk, skb, tp->tcp_wstamp_ns);
                        tcp_rate_skb_sent(sk, skb);
                }
        } else {