)]}'
{
  "commit": "0fc4969b866671dfe39b1a9119d0fdc7ea0f63e5",
  "tree": "05e644d8c1e0071b07ac5b6aee83d8dc3eaf664e",
  "parents": [
    "fd0cbdd378258fdf44eac5ea091256a4a665315b"
  ],
  "author": {
    "name": "Thomas Gleixner",
    "email": "tglx@linutronix.de",
    "time": "Wed Aug 01 17:13:19 2007 +0200"
  },
  "committer": {
    "name": "Linus Torvalds",
    "email": "torvalds@woody.linux-foundation.org",
    "time": "Wed Aug 01 20:46:22 2007 -0700"
  },
  "message": "genirq: temporary fix for level-triggered IRQ resend\n\nMarcin Slusarz reported a ne2k-pci \"hung network interface\" regression.\n\ndelayed disable relies on the ability to re-trigger the interrupt in the\ncase that a real interrupt happens after the software disable was set.\nIn this case we actually disable the interrupt on the hardware level\n_after_ it occurred.\n\nOn enable_irq, we need to re-trigger the interrupt. On i386 this relies\non a hardware resend mechanism (send_IPI_self()).\n\nActually we only need the resend for edge type interrupts. Level type\ninterrupts come back once enable_irq() re-enables the interrupt line.\n\nI assume that the interrupt in question is level triggered because it is\nshared and above the legacy irqs 0-15:\n\n\t17:         12   IO-APIC-fasteoi   eth1, eth0\n\nLooking into the IO_APIC code, the resend via send_IPI_self() happens\nunconditionally. So the resend is done for level and edge interrupts.\nThis makes the problem more mysterious.\n\nThe code in question lib8390.c does\n\n\tdisable_irq();\n\tfiddle_with_the_network_card_hardware()\n\tenable_irq();\n\nThe fiddle_with_the_network_card_hardware() might cause interrupts,\nwhich are cleared in the same code path again,\n\nMarcin found that when he disables the irq line on the hardware level\n(removing the delayed disable) the card is kept alive.\n\nSo the difference is that we can get a resend on enable_irq, when an\ninterrupt happens during the time, where we are in the disabled region.\n\nSigned-off-by: Ingo Molnar \u003cmingo@elte.hu\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "5bfeaed7e4872850049d40aef740d24b983adebf",
      "old_mode": 33188,
      "old_path": "kernel/irq/resend.c",
      "new_id": "c382727468876dbd84c2ba6b9e89ae5a6464de1e",
      "new_mode": 33188,
      "new_path": "kernel/irq/resend.c"
    }
  ]
}
