These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / include / net / codel.h
index 1e18005..267e702 100644 (file)
@@ -7,7 +7,7 @@
  *  Copyright (C) 2011-2012 Kathleen Nichols <nichols@pollere.com>
  *  Copyright (C) 2011-2012 Van Jacobson <van@pollere.net>
  *  Copyright (C) 2012 Michael D. Taht <dave.taht@bufferbloat.net>
- *  Copyright (C) 2012 Eric Dumazet <edumazet@google.com>
+ *  Copyright (C) 2012,2015 Eric Dumazet <edumazet@google.com>
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -119,12 +119,14 @@ static inline u32 codel_time_to_us(codel_time_t val)
 /**
  * struct codel_params - contains codel parameters
  * @target:    target queue size (in time units)
+ * @ce_threshold:  threshold for marking packets with ECN CE
  * @interval:  width of moving time window
  * @mtu:       device mtu, or minimal queue backlog in bytes.
  * @ecn:       is Explicit Congestion Notification enabled
  */
 struct codel_params {
        codel_time_t    target;
+       codel_time_t    ce_threshold;
        codel_time_t    interval;
        u32             mtu;
        bool            ecn;
@@ -161,19 +163,24 @@ struct codel_vars {
  * @maxpacket: largest packet we've seen so far
  * @drop_count:        temp count of dropped packets in dequeue()
  * ecn_mark:   number of packets we ECN marked instead of dropping
+ * ce_mark:    number of packets CE marked because sojourn time was above ce_threshold
  */
 struct codel_stats {
        u32             maxpacket;
        u32             drop_count;
        u32             ecn_mark;
+       u32             ce_mark;
 };
 
+#define CODEL_DISABLED_THRESHOLD INT_MAX
+
 static void codel_params_init(struct codel_params *params,
                              const struct Qdisc *sch)
 {
        params->interval = MS2TIME(100);
        params->target = MS2TIME(5);
        params->mtu = psched_mtu(qdisc_dev(sch));
+       params->ce_threshold = CODEL_DISABLED_THRESHOLD;
        params->ecn = false;
 }
 
@@ -354,6 +361,9 @@ static struct sk_buff *codel_dequeue(struct Qdisc *sch,
                                                    vars->rec_inv_sqrt);
        }
 end:
+       if (skb && codel_time_after(vars->ldelay, params->ce_threshold) &&
+           INET_ECN_set_ce(skb))
+               stats->ce_mark++;
        return skb;
 }
 #endif