)]}'
{
  "commit": "38bc2b8c56a2e212bbd19de7cf9976dcc7bf9953",
  "tree": "26071dbb540926c329ece0ab4d4425807021b5c8",
  "parents": [
    "5dac051bc6030963181b69faddd9e0ad04f85fa8"
  ],
  "author": {
    "name": "Rusty Russell",
    "email": "rusty@rustcorp.com.au",
    "time": "Fri Jun 12 22:27:11 2009 -0600"
  },
  "committer": {
    "name": "Rusty Russell",
    "email": "rusty@rustcorp.com.au",
    "time": "Fri Jun 12 22:27:11 2009 +0930"
  },
  "message": "lguest: implement deferred interrupts in example Launcher\n\nRather than sending an interrupt on every buffer, we only send an interrupt\nwhen we\u0027re about to wait for the Guest to send us a new one.  The console\ninput and network input still send interrupts manually, but the block device,\nnetwork and console output queues can simply rely on this logic to send\ninterrupts to the Guest at the right time.\n\nThe patch is cluttered by moving trigger_irq() higher in the code.\n\nIn practice, two factors make this optimization less interesting:\n(1) we often only get one input at a time, even for networking,\n(2) triggering an interrupt rapidly tends to get coalesced anyway.\n\nBefore:\t\t\t\tSecs\tRxIRQS\tTxIRQs\n 1G TCP Guest-\u003eHost:\t\t3.72\t32784\t32771\n 1M normal pings:\t\t99\t1000004\t995541\n 100,000 1k pings (-l 120):\t5\t49510\t49058\n\nAfter:\n 1G TCP Guest-\u003eHost:\t\t3.69\t32809\t32769\n 1M normal pings:\t\t99\t1000004\t996196\n 100,000 1k pings (-l 120):\t5\t52435\t52361\n\n(Note the interrupt count on 100k pings goes *up*: see next patch).\n\nSigned-off-by: Rusty Russell \u003crusty@rustcorp.com.au\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "5470b8ed214938b6e829d63f5e2f3a5ad070f984",
      "old_mode": 33188,
      "old_path": "Documentation/lguest/lguest.c",
      "new_id": "84c471b07c2730686043645bc1c4793f50107802",
      "new_mode": 33188,
      "new_path": "Documentation/lguest/lguest.c"
    }
  ]
}
