e1000e: incorporate napi_struct changes from net-2.6.24.git
Subsystems (2)
PATCH v3 1/1 e1000e: incorporate napi_struct changes from net-2.6.24.git
This incorporates the new napi_struct changes into e1000e. Included bugfix for ifdown hang from Krishna Kumar for e1000.
Disabling polling is no longer needed at init time, so remove napi_disable() call from _probe().
---
drivers/net/e1000e/e1000.h | 2 ++ drivers/net/e1000e/netdev.c | 39 ++++++++++++++++----------------------- 2 files changed, 18 insertions(+), 23 deletions(-)
drivers/net/e1000e/e1000.h +2 -0
@@ -187,6 +187,8 @@ struct e1000_adapter {struct e1000_ring *tx_ring/* One per active queue */ ____cacheline_aligned_in_smp ; +struct napi_struct napi; +unsigned long tx_queue_len;unsigned int restart_queue;u32 txd_cmd;
drivers/net/e1000e/netdev.c +16 -23
@@ -1149,12 +1149,12 @@ static irqreturn_t e1000_intr_msi(int irq, void *data)mod_timer (&adapter->watchdog_timer, jiffies +1 ); } -if (netif_rx_schedule_prep (netdev)) { +if (netif_rx_schedule_prep (netdev, &adapter->napi)) { adapter->total_tx_bytes =0 ; adapter->total_tx_packets =0 ; adapter->total_rx_bytes =0 ; adapter->total_rx_packets =0 ; -__netif_rx_schedule (netdev); +__netif_rx_schedule (netdev, &adapter->napi); }else {atomic_dec (&adapter->irq_sem); }
@@ -1212,12 +1212,12 @@ static irqreturn_t e1000_intr(int irq, void *data)mod_timer (&adapter->watchdog_timer, jiffies +1 ); } -if (netif_rx_schedule_prep (netdev)) { +if (netif_rx_schedule_prep (netdev, &adapter->napi)) { adapter->total_tx_bytes =0 ; adapter->total_tx_packets =0 ; adapter->total_rx_bytes =0 ; adapter->total_rx_packets =0 ; -__netif_rx_schedule (netdev); +__netif_rx_schedule (netdev, &adapter->napi); }else {atomic_dec (&adapter->irq_sem); }
@@ -1662,10 +1662,10 @@ set_itr_now:* e1000_clean - NAPI Rx polling callback * @adapter: board private structure **/ -static int e1000_clean (struct net_device *poll_dev,int *budget) +static int e1000_clean (struct napi_struct *napi,int budget) { -struct e1000_adapter *adapter; -int work_to_do =min (*budget, poll_dev->quota); + struct e1000_adapter *adapter = container_of(napi, struct e1000_adapter, napi); +struct net_device *poll_dev = adapter->netdev;int tx_cleaned =0 , work_done =0 ;/* Must NOT use netdev_priv macro here. */
@@ -1684,25 +1684,20 @@ static int e1000_clean(struct net_device *poll_dev, int *budget)spin_unlock (&adapter->tx_queue_lock); } - adapter->clean_rx (adapter, &work_done, work_to_do); - *budget -= work_done; - poll_dev->quota -= work_done; + adapter->clean_rx (adapter, &work_done, budget);/* If no Tx and not enough Rx work done, exit the polling mode */ -if ((!tx_cleaned && (work_done ==0 )) || +if ((tx_cleaned && (work_done < budget)) || !netif_running (poll_dev)) { quit_polling:if (adapter->itr_setting &3 )e1000_set_itr (adapter); -netif_rx_complete (poll_dev); -if (test_bit (__E1000_DOWN, &adapter->state)) -atomic_dec (&adapter->irq_sem); -else -e1000_irq_enable (adapter); +netif_rx_complete (poll_dev, napi); +e1000_irq_enable (adapter);return 0 ; } -return 1 ; +return work_done; }static void e1000_vlan_rx_add_vid (struct net_device *netdev,u16 vid)
@@ -2439,7 +2434,7 @@ int e1000e_up(struct e1000_adapter *adapter)clear_bit (__E1000_DOWN, &adapter->state); -netif_poll_enable (adapter->netdev); +napi_enable (&adapter->napi);e1000_irq_enable (adapter);/* fire a link change interrupt to start the watchdog */
@@ -2472,7 +2467,7 @@ void e1000e_down(struct e1000_adapter *adapter)e1e_flush ();msleep (10 ); -netif_poll_disable (netdev); +napi_disable (&adapter->napi);e1000_irq_disable (adapter);del_timer_sync (&adapter->watchdog_timer);
@@ -2605,7 +2600,7 @@ static int e1000_open(struct net_device *netdev)/* From here on the code is the same as e1000e_up() */ clear_bit (__E1000_DOWN, &adapter->state); -netif_poll_enable (netdev); +napi_enable (&adapter->napi);e1000_irq_enable (adapter);
@@ -4090,8 +4085,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev,e1000e_set_ethtool_ops (netdev); netdev->tx_timeout = &e1000_tx_timeout; netdev->watchdog_timeo =5 *HZ ; - netdev->poll = &e1000_clean; - netdev->weight =64 ; +netif_napi_add (netdev, &adapter->napi, e1000_clean,64 ); netdev->vlan_rx_register = e1000_vlan_rx_register; netdev->vlan_rx_add_vid = e1000_vlan_rx_add_vid; netdev->vlan_rx_kill_vid = e1000_vlan_rx_kill_vid;
@@ -4260,7 +4254,6 @@ static int __devinit e1000_probe(struct pci_dev *pdev,/* tell the stack to leave us alone until e1000_open() is called */ netif_carrier_off (netdev);netif_stop_queue (netdev); -netif_poll_disable (netdev);strcpy (netdev->name,"eth%d" ); err =register_netdev (netdev);
Quoted 5 lines · Auke Kok
This incorporates the new
napi_structchanges into e1000e. Included bugfix for ifdown hang from Krishna Kumar for e1000.Disabling polling is no longer needed at init time, so remove
napi_disable()call from_probe().
david,
while testing this patch I noticed that the poll routine is now called 100% of the time, and since I'm not doing much different than before, I suspec that something in the new napi code is staying in polling mode forever? Since e1000e is pretty much the same code as e1000, I doubt the problem is there, but you can probably tell better. ideas?
Auke
Quoted 146 lines
Signed-off-by Auke Kok <[email protected]>---
drivers/net/e1000e/e1000.h | 2 ++ drivers/net/e1000e/netdev.c | 39 ++++++++++++++++----------------------- 2 files changed, 18 insertions(+), 23 deletions(-)drivers/net/e1000e/e1000.h +2
-0@@ -187,6 +187,8 @@ struct e1000_adapter {struct e1000_ring *tx_ring/* One per active queue */ ____cacheline_aligned_in_smp ; +struct napi_struct napi; +unsigned long tx_queue_len;unsigned int restart_queue;u32 txd_cmd;drivers/net/e1000e/netdev.c +16
-23@@ -1149,12 +1149,12 @@ static irqreturn_t e1000_intr_msi(int irq, void *data)mod_timer (&adapter->watchdog_timer, jiffies +1 ); } -if (netif_rx_schedule_prep (netdev)) { +if (netif_rx_schedule_prep (netdev, &adapter->napi)) { adapter->total_tx_bytes =0 ; adapter->total_tx_packets =0 ; adapter->total_rx_bytes =0 ; adapter->total_rx_packets =0 ; -__netif_rx_schedule (netdev); +__netif_rx_schedule (netdev, &adapter->napi); }else {atomic_dec (&adapter->irq_sem); }@@ -1212,12 +1212,12 @@ static irqreturn_t e1000_intr(int irq, void *data)mod_timer (&adapter->watchdog_timer, jiffies +1 ); } -if (netif_rx_schedule_prep (netdev)) { +if (netif_rx_schedule_prep (netdev, &adapter->napi)) { adapter->total_tx_bytes =0 ; adapter->total_tx_packets =0 ; adapter->total_rx_bytes =0 ; adapter->total_rx_packets =0 ; -__netif_rx_schedule (netdev); +__netif_rx_schedule (netdev, &adapter->napi); }else {atomic_dec (&adapter->irq_sem); }@@ -1662,10 +1662,10 @@ set_itr_now:* e1000_clean - NAPI Rx polling callback * @adapter: board private structure **/ -static int e1000_clean (struct net_device *poll_dev,int *budget) +static int e1000_clean (struct napi_struct *napi,int budget) { -struct e1000_adapter *adapter; -int work_to_do =min (*budget, poll_dev->quota); + struct e1000_adapter *adapter = container_of(napi, struct e1000_adapter, napi); +struct net_device *poll_dev = adapter->netdev;int tx_cleaned =0 , work_done =0 ;/* Must NOT use netdev_priv macro here. */ @@ -1684,25 +1684,20 @@ static int e1000_clean(struct net_device *poll_dev, int *budget)spin_unlock (&adapter->tx_queue_lock); } - adapter->clean_rx (adapter, &work_done, work_to_do); - *budget -= work_done; - poll_dev->quota -= work_done; + adapter->clean_rx (adapter, &work_done, budget);/* If no Tx and not enough Rx work done, exit the polling mode */ -if ((!tx_cleaned && (work_done ==0 )) || +if ((tx_cleaned && (work_done < budget)) || !netif_running (poll_dev)) { quit_polling:if (adapter->itr_setting &3 )e1000_set_itr (adapter); -netif_rx_complete (poll_dev); -if (test_bit (__E1000_DOWN, &adapter->state)) -atomic_dec (&adapter->irq_sem); -else -e1000_irq_enable (adapter); +netif_rx_complete (poll_dev, napi); +e1000_irq_enable (adapter);return 0 ; } -return 1 ; +return work_done; }static void e1000_vlan_rx_add_vid (struct net_device *netdev,u16 vid)@@ -2439,7 +2434,7 @@ int e1000e_up(struct e1000_adapter *adapter)clear_bit (__E1000_DOWN, &adapter->state); -netif_poll_enable (adapter->netdev); +napi_enable (&adapter->napi);e1000_irq_enable (adapter);/* fire a link change interrupt to start the watchdog */ @@ -2472,7 +2467,7 @@ void e1000e_down(struct e1000_adapter *adapter)e1e_flush ();msleep (10 ); -netif_poll_disable (netdev); +napi_disable (&adapter->napi);e1000_irq_disable (adapter);del_timer_sync (&adapter->watchdog_timer);@@ -2605,7 +2600,7 @@ static int e1000_open(struct net_device *netdev)/* From here on the code is the same as e1000e_up() */ clear_bit (__E1000_DOWN, &adapter->state); -netif_poll_enable (netdev); +napi_enable (&adapter->napi);e1000_irq_enable (adapter);@@ -4090,8 +4085,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev,e1000e_set_ethtool_ops (netdev); netdev->tx_timeout = &e1000_tx_timeout; netdev->watchdog_timeo =5 *HZ ; - netdev->poll = &e1000_clean; - netdev->weight =64 ; +netif_napi_add (netdev, &adapter->napi, e1000_clean,64 ); netdev->vlan_rx_register = e1000_vlan_rx_register; netdev->vlan_rx_add_vid = e1000_vlan_rx_add_vid; netdev->vlan_rx_kill_vid = e1000_vlan_rx_kill_vid;@@ -4260,7 +4254,6 @@ static int __devinit e1000_probe(struct pci_dev *pdev,/* tell the stack to leave us alone until e1000_open() is called */ netif_carrier_off (netdev);netif_stop_queue (netdev); -netif_poll_disable (netdev);strcpy (netdev->name,"eth%d" ); err =register_netdev (netdev);
Quoted 7 lines · Auke
david,
while testing this patch I noticed that the poll routine is now called 100% of the time, and since I'm not doing much different than before, I suspec that something in the new napi code is staying in polling mode forever? Since e1000e is pretty much the same code as e1000, I doubt the problem is there, but you can probably tell better. ideas?
Hello,
Yes a correct observation. I've spotted this bug too and it caused by the policy change in the NAPI scheduling. Look at tx_cleaned.
I suggest we revert this change for now.
Cheers
--ro
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c
index 7b0bcdb..5cb883a 100644
drivers/net/e1000/e1000_main.c +1 -1
@@ -3944,7 +3944,7 @@ e1000_clean(struct napi_struct *napi, int budget) &work_done, budget);/* If no Tx and not enough Rx work done, exit the polling mode */ -if ((tx_cleaned && (work_done < budget)) || +if ((!tx_cleaned && (work_done ==0 )) || !netif_running (poll_dev)) { quit_polling:if (likely (adapter->itr_setting &3 ))
David Miller
maintainerFrom: Robert Olsson <[email protected]>
Date: Sat, 8 Sep 2007 09:53:49 +0200
Quoted 4 lines
Yes a correct observation. I've spotted this bug too and it caused by the policy change in the NAPI scheduling. Look at
tx_cleaned.I suggest we revert this change for now.
The tx_cleaned logic change was not intentional, and that's the bug that makes e1000 spin endlessly in NAPI.
The other part, the work_done < budget part, was intentional so I'm going to keep it in there for now. I've checked in the patch below to deal with this.
I suspect the check "work_done == 0" is some shamans dance to get slightly better performance, but it's 1) wrong and
2) at best needs to be explained in a comment and fully quantified.
Quoted 1 line
From
e8cbb449155000eecc6e855ea71510fecfc7d5eeMon Sep 17 00:00:00 2001
From: David S. Miller <davem@kimchee.(none)>
Date: Wed, 12 Sep 2007 16:50:32 +0200
Subject: [PATCH] [E1000]: Fix unintended NAPI breakout logic change.
The inversion of the !tx_cleaned test in e1000_clean() was not intentional, we just wanted to change the "work_done == 0" to "work_done < budget"
Noticed by Robert Olsson.
--- drivers/net/e1000/e1000_main.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
drivers/net/e1000/e1000_main.c +1 -1
@@ -3944,7 +3944,7 @@ e1000_clean(struct napi_struct *napi, int budget) &work_done, budget);/* If no Tx and not enough Rx work done, exit the polling mode */ -if ((tx_cleaned && (work_done < budget)) || +if ((!tx_cleaned && (work_done < budget)) || !netif_running (poll_dev)) { quit_polling:if (likely (adapter->itr_setting &3 ))
Signature · 1 line
1.5.2.4
Quoted 11 lines · David Miller
From: Robert Olsson <[email protected]>
Date: Sat, 8 Sep 2007 09:53:49 +0200Quoted 4 lines
Yes a correct observation. I've spotted this bug too and it caused by the policy change in the NAPI scheduling. Look at
tx_cleaned.I suggest we revert this change for now.
The
tx_cleanedlogic change was not intentional, and that's the bug that makes e1000 spin endlessly in NAPI.
Quoted 8 lines
The other part, the
work_done< budget part, was intentional so I'm going to keep it in there for now. I've checked in the patch below to deal with this.I suspect the check "
work_done== 0" is some shamans dance to get slightly better performance, but it's 1) wrong and
2) at best needs to be explained in a comment and fully quantified.
it probably gives us one more poll, so it might help, this isn't crucial and I agree that it might offset the budgetting.
Quoted 21 lines
From
e8cbb449155000eecc6e855ea71510fecfc7d5eeMon Sep 17 00:00:00 2001
From: David S. Miller <davem@kimchee.(none)>
Date: Wed, 12 Sep 2007 16:50:32 +0200
Subject: [PATCH] [E1000]: Fix unintended NAPI breakout logic change.The inversion of the !tx_cleaned test in
e1000_clean()was not intentional, we just wanted to change the "work_done== 0" to "work_done< budget"Noticed by Robert Olsson.
Signed-off-by David S. Miller <[email protected]>--- drivers/net/e1000/e1000_main.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)drivers/net/e1000/e1000_main.c +0
-0
drivers/net/e1000/e1000_main.c e1000_clean(struct napi_struct *napi, int budget) · line 3950
Quoted 8 lines
drivers/net/e1000/e1000_main.c +1
-1@@ -3944,7 +3944,7 @@ e1000_clean(struct napi_struct *napi, int budget) &work_done, budget);/* If no Tx and not enough Rx work done, exit the polling mode */ -if ((tx_cleaned && (work_done < budget)) || +if ((!tx_cleaned && (work_done < budget)) || !netif_running (poll_dev)) { quit_polling:if (likely (adapter->itr_setting &3 ))
Ack, this is exactly what I did to fix e1000e as well.
Auke
David Miller
maintainerFrom: "Kok, Auke" <[email protected]>
Date: Wed, 12 Sep 2007 09:42:29 -0700
Quoted 9 lines
Quoted 8 lines · David Miller
drivers/net/e1000/e1000_main.c +0
-0@@ -3944,7 +3944,7 @@ e1000_clean(struct napi_struct *napi, int budget) &work_done, budget);
Quoted 9 lines
drivers/net/e1000/e1000_main.c e1000_clean(struct napi_struct *napi, int budget) · line 3950
Quoted 6 lines
drivers/net/e1000/e1000_main.c +1
-1/* If no Tx and not enough Rx work done, exit the polling mode */ -if ((tx_cleaned && (work_done < budget)) || +if ((!tx_cleaned && (work_done < budget)) || !netif_running (poll_dev)) { quit_polling:if (likely (adapter->itr_setting &3 ))Ack, this is exactly what I did to fix e1000e as well.
Thanks for reviewing.