| From jeffrey.t.kirsher@intel.com Tue May 12 13:46:45 2009 |
| From: Jeff Kirsher <jeffrey.t.kirsher@intel.com> |
| Date: Tue, 12 May 2009 10:34:21 -0700 |
| Subject: e1000: fix virtualization bug |
| To: chrisw@sous-sol.org, greg@kroah.com |
| Cc: stable@kernel.org, netdev@vger.kernel.org, Jesse Brandeburg <jesse.brandeburg@intel.com>, Jeff Kirsher <jeffrey.t.kirsher@intel.com>, David S. Miller <davem@davemloft.net> |
| Message-ID: <20090512173420.20407.37168.stgit@localhost.localdomain> |
| |
| |
| From: Jesse Brandeburg <jesse.brandeburg@intel.com> |
| |
| [STABLE] backport upstream commit e151a60ad1faffb6241cf7eb6846353df1f33a32 |
| |
| a recent fix to e1000 (commit 15b2bee2) caused KVM/QEMU/VMware based |
| virtualized e1000 interfaces to begin failing when resetting. |
| |
| This is because the driver in a virtual environment doesn't |
| get to run instructions *AT ALL* when an interrupt is asserted. |
| The interrupt code runs immediately and this recent bug fix |
| allows an interrupt to be possible when the interrupt handler |
| will reject it (due to the new code), when being called from |
| any path in the driver that holds the E1000_RESETTING flag. |
| |
| the driver should use the __E1000_DOWN flag instead of the |
| __E1000_RESETTING flag to prevent interrupt execution |
| while reconfiguring the hardware. |
| |
| Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com> |
| Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/net/e1000/e1000_main.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/drivers/net/e1000/e1000_main.c |
| +++ b/drivers/net/e1000/e1000_main.c |
| @@ -3712,7 +3712,7 @@ static irqreturn_t e1000_intr(int irq, v |
| struct e1000_hw *hw = &adapter->hw; |
| u32 rctl, icr = er32(ICR); |
| |
| - if (unlikely((!icr) || test_bit(__E1000_RESETTING, &adapter->flags))) |
| + if (unlikely((!icr) || test_bit(__E1000_DOWN, &adapter->flags))) |
| return IRQ_NONE; /* Not our interrupt */ |
| |
| /* IMS will not auto-mask if INT_ASSERTED is not set, and if it is |