)]}'
{
  "log": [
    {
      "commit": "8af2a218de38f51ea4b4fa48cac1273319ae260c",
      "tree": "07a4557322b79878096172355fb02ab2bae3f432",
      "parents": [
        "57459185a19b0246866479522b77cbb9732201d1"
      ],
      "author": {
        "name": "Eric Dumazet",
        "email": "eric.dumazet@gmail.com",
        "time": "Thu Dec 08 06:06:03 2011 +0000"
      },
      "committer": {
        "name": "David S. Miller",
        "email": "davem@davemloft.net",
        "time": "Thu Dec 08 19:52:43 2011 -0500"
      },
      "message": "sch_red: Adaptative RED AQM\n\nAdaptative RED AQM for linux, based on paper from Sally FLoyd,\nRamakrishna Gummadi, and Scott Shenker, August 2001 :\n\nhttp://icir.org/floyd/papers/adaptiveRed.pdf\n\nGoal of Adaptative RED is to make max_p a dynamic value between 1% and\n50% to reach the target average queue : (max_th - min_th) / 2\n\nEvery 500 ms:\n if (avg \u003e target and max_p \u003c\u003d 0.5)\n  increase max_p : max_p +\u003d alpha;\n else if (avg \u003c target and max_p \u003e\u003d 0.01)\n  decrease max_p : max_p *\u003d beta;\n\ntarget :[min_th + 0.4*(min_th - max_th),\n          min_th + 0.6*(min_th - max_th)].\nalpha : min(0.01, max_p / 4)\nbeta : 0.9\nmax_P is a Q0.32 fixed point number (unsigned, with 32 bits mantissa)\n\nChanges against our RED implementation are :\n\nmax_p is no longer a negative power of two (1/(2^Plog)), but a Q0.32\nfixed point number, to allow full range described in Adatative paper.\n\nTo deliver a random number, we now use a reciprocal divide (thats really\na multiply), but this operation is done once per marked/droped packet\nwhen in RED_BETWEEN_TRESH window, so added cost (compared to previous\nAND operation) is near zero.\n\ndump operation gives current max_p value in a new TCA_RED_MAX_P\nattribute.\n\nExample on a 10Mbit link :\n\ntc qdisc add dev $DEV parent 1:1 handle 10: est 1sec 8sec red \\\n   limit 400000 min 30000 max 90000 avpkt 1000 \\\n   burst 55 ecn adaptative bandwidth 10Mbit\n\n# tc -s -d qdisc show dev eth3\n...\nqdisc red 10: parent 1:1 limit 400000b min 30000b max 90000b ecn\nadaptative ewma 5 max_p\u003d0.113335 Scell_log 15\n Sent 50414282 bytes 34504 pkt (dropped 35, overlimits 1392 requeues 0)\n rate 9749Kbit 831pps backlog 72056b 16p requeues 0\n  marked 1357 early 35 pdrop 0 other 0\n\nSigned-off-by: Eric Dumazet \u003ceric.dumazet@gmail.com\u003e\nSigned-off-by: David S. Miller \u003cdavem@davemloft.net\u003e\n"
    },
    {
      "commit": "6a2d7a955d8de6cb19ed9cd194b3c83008a22c32",
      "tree": "dc440341412a45a7c1f363dcaa1505fe711eadec",
      "parents": [
        "02a0e53d8227aff5e62e0433f82c12c1c2805fd6"
      ],
      "author": {
        "name": "Eric Dumazet",
        "email": "dada1@cosmosbay.com",
        "time": "Wed Dec 13 00:34:27 2006 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@woody.osdl.org",
        "time": "Wed Dec 13 09:05:49 2006 -0800"
      },
      "message": "[PATCH] SLAB: use a multiply instead of a divide in obj_to_index()\n\nWhen some objects are allocated by one CPU but freed by another CPU we can\nconsume lot of cycles doing divides in obj_to_index().\n\n(Typical load on a dual processor machine where network interrupts are\nhandled by one particular CPU (allocating skbufs), and the other CPU is\nrunning the application (consuming and freeing skbufs))\n\nHere on one production server (dual-core AMD Opteron 285), I noticed this\ndivide took 1.20 % of CPU_CLK_UNHALTED events in kernel.  But Opteron are\nquite modern cpus and the divide is much more expensive on oldest\narchitectures :\n\nOn a 200 MHz sparcv9 machine, the division takes 64 cycles instead of 1\ncycle for a multiply.\n\nDoing some math, we can use a reciprocal multiplication instead of a divide.\n\nIf we want to compute V \u003d (A / B)  (A and B being u32 quantities)\nwe can instead use :\n\nV \u003d ((u64)A * RECIPROCAL(B)) \u003e\u003e 32 ;\n\nwhere RECIPROCAL(B) is precalculated to ((1LL \u003c\u003c 32) + (B - 1)) / B\n\nNote :\n\nI wrote pure C code for clarity. gcc output for i386 is not optimal but\nacceptable :\n\nmull   0x14(%ebx)\nmov    %edx,%eax // part of the \u003e\u003e 32\nxor     %edx,%edx // useless\nmov    %eax,(%esp) // could be avoided\nmov    %edx,0x4(%esp) // useless\nmov    (%esp),%ebx\n\n[akpm@osdl.org: small cleanups]\nSigned-off-by: Eric Dumazet \u003cdada1@cosmosbay.com\u003e\nCc: Christoph Lameter \u003cclameter@sgi.com\u003e\nCc: David Miller \u003cdavem@davemloft.net\u003e\nSigned-off-by: Andrew Morton \u003cakpm@osdl.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@osdl.org\u003e\n"
    }
  ]
}
