mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-23 01:10:04 +00:00
[NET]: Make ->poll() breakout consistent in Intel ethernet drivers.
This makes the ->poll() routines of the E100, E1000, E1000E, IXGB, and IXGBE drivers complete ->poll() consistently. Now they will all break out when the amount of RX work done is less than 'budget'. At a later time, we may want put back code to include the TX work as well (as at least one other NAPI driver does, but by in large NAPI drivers do not do this). But if so, it should be done consistently across the board to all of these drivers. Signed-off-by: David S. Miller <davem@davemloft.net> Acked-by: Auke Kok <auke-jan.h.kok@intel.com>
This commit is contained in:
parent
fed17f3094
commit
53e52c729c
5 changed files with 19 additions and 21 deletions
|
@ -1991,13 +1991,12 @@ static int e100_poll(struct napi_struct *napi, int budget)
|
||||||
struct nic *nic = container_of(napi, struct nic, napi);
|
struct nic *nic = container_of(napi, struct nic, napi);
|
||||||
struct net_device *netdev = nic->netdev;
|
struct net_device *netdev = nic->netdev;
|
||||||
unsigned int work_done = 0;
|
unsigned int work_done = 0;
|
||||||
int tx_cleaned;
|
|
||||||
|
|
||||||
e100_rx_clean(nic, &work_done, budget);
|
e100_rx_clean(nic, &work_done, budget);
|
||||||
tx_cleaned = e100_tx_clean(nic);
|
e100_tx_clean(nic);
|
||||||
|
|
||||||
/* If no Rx and Tx cleanup work was done, exit polling mode. */
|
/* If budget not fully consumed, exit the polling mode */
|
||||||
if((!tx_cleaned && (work_done == 0))) {
|
if (work_done < budget) {
|
||||||
netif_rx_complete(netdev, napi);
|
netif_rx_complete(netdev, napi);
|
||||||
e100_enable_irq(nic);
|
e100_enable_irq(nic);
|
||||||
}
|
}
|
||||||
|
|
|
@ -3919,7 +3919,7 @@ e1000_clean(struct napi_struct *napi, int budget)
|
||||||
{
|
{
|
||||||
struct e1000_adapter *adapter = container_of(napi, struct e1000_adapter, napi);
|
struct e1000_adapter *adapter = container_of(napi, struct e1000_adapter, napi);
|
||||||
struct net_device *poll_dev = adapter->netdev;
|
struct net_device *poll_dev = adapter->netdev;
|
||||||
int tx_cleaned = 0, work_done = 0;
|
int work_done = 0;
|
||||||
|
|
||||||
/* Must NOT use netdev_priv macro here. */
|
/* Must NOT use netdev_priv macro here. */
|
||||||
adapter = poll_dev->priv;
|
adapter = poll_dev->priv;
|
||||||
|
@ -3929,7 +3929,7 @@ e1000_clean(struct napi_struct *napi, int budget)
|
||||||
* simultaneously. A failure obtaining the lock means
|
* simultaneously. A failure obtaining the lock means
|
||||||
* tx_ring[0] is currently being cleaned anyway. */
|
* tx_ring[0] is currently being cleaned anyway. */
|
||||||
if (spin_trylock(&adapter->tx_queue_lock)) {
|
if (spin_trylock(&adapter->tx_queue_lock)) {
|
||||||
tx_cleaned = e1000_clean_tx_irq(adapter,
|
e1000_clean_tx_irq(adapter,
|
||||||
&adapter->tx_ring[0]);
|
&adapter->tx_ring[0]);
|
||||||
spin_unlock(&adapter->tx_queue_lock);
|
spin_unlock(&adapter->tx_queue_lock);
|
||||||
}
|
}
|
||||||
|
@ -3937,8 +3937,8 @@ e1000_clean(struct napi_struct *napi, int budget)
|
||||||
adapter->clean_rx(adapter, &adapter->rx_ring[0],
|
adapter->clean_rx(adapter, &adapter->rx_ring[0],
|
||||||
&work_done, budget);
|
&work_done, budget);
|
||||||
|
|
||||||
/* If no Tx and not enough Rx work done, exit the polling mode */
|
/* If budget not fully consumed, exit the polling mode */
|
||||||
if ((!tx_cleaned && (work_done == 0))) {
|
if (work_done < budget) {
|
||||||
if (likely(adapter->itr_setting & 3))
|
if (likely(adapter->itr_setting & 3))
|
||||||
e1000_set_itr(adapter);
|
e1000_set_itr(adapter);
|
||||||
netif_rx_complete(poll_dev, napi);
|
netif_rx_complete(poll_dev, napi);
|
||||||
|
|
|
@ -1384,7 +1384,7 @@ static int e1000_clean(struct napi_struct *napi, int budget)
|
||||||
{
|
{
|
||||||
struct e1000_adapter *adapter = container_of(napi, struct e1000_adapter, napi);
|
struct e1000_adapter *adapter = container_of(napi, struct e1000_adapter, napi);
|
||||||
struct net_device *poll_dev = adapter->netdev;
|
struct net_device *poll_dev = adapter->netdev;
|
||||||
int tx_cleaned = 0, work_done = 0;
|
int work_done = 0;
|
||||||
|
|
||||||
/* Must NOT use netdev_priv macro here. */
|
/* Must NOT use netdev_priv macro here. */
|
||||||
adapter = poll_dev->priv;
|
adapter = poll_dev->priv;
|
||||||
|
@ -1394,14 +1394,14 @@ static int e1000_clean(struct napi_struct *napi, int budget)
|
||||||
* simultaneously. A failure obtaining the lock means
|
* simultaneously. A failure obtaining the lock means
|
||||||
* tx_ring is currently being cleaned anyway. */
|
* tx_ring is currently being cleaned anyway. */
|
||||||
if (spin_trylock(&adapter->tx_queue_lock)) {
|
if (spin_trylock(&adapter->tx_queue_lock)) {
|
||||||
tx_cleaned = e1000_clean_tx_irq(adapter);
|
e1000_clean_tx_irq(adapter);
|
||||||
spin_unlock(&adapter->tx_queue_lock);
|
spin_unlock(&adapter->tx_queue_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
adapter->clean_rx(adapter, &work_done, budget);
|
adapter->clean_rx(adapter, &work_done, budget);
|
||||||
|
|
||||||
/* If no Tx and not enough Rx work done, exit the polling mode */
|
/* If budget not fully consumed, exit the polling mode */
|
||||||
if ((!tx_cleaned && (work_done < budget))) {
|
if (work_done < budget) {
|
||||||
if (adapter->itr_setting & 3)
|
if (adapter->itr_setting & 3)
|
||||||
e1000_set_itr(adapter);
|
e1000_set_itr(adapter);
|
||||||
netif_rx_complete(poll_dev, napi);
|
netif_rx_complete(poll_dev, napi);
|
||||||
|
|
|
@ -1787,14 +1787,13 @@ ixgb_clean(struct napi_struct *napi, int budget)
|
||||||
{
|
{
|
||||||
struct ixgb_adapter *adapter = container_of(napi, struct ixgb_adapter, napi);
|
struct ixgb_adapter *adapter = container_of(napi, struct ixgb_adapter, napi);
|
||||||
struct net_device *netdev = adapter->netdev;
|
struct net_device *netdev = adapter->netdev;
|
||||||
int tx_cleaned;
|
|
||||||
int work_done = 0;
|
int work_done = 0;
|
||||||
|
|
||||||
tx_cleaned = ixgb_clean_tx_irq(adapter);
|
ixgb_clean_tx_irq(adapter);
|
||||||
ixgb_clean_rx_irq(adapter, &work_done, budget);
|
ixgb_clean_rx_irq(adapter, &work_done, budget);
|
||||||
|
|
||||||
/* if no Tx and not enough Rx work done, exit the polling mode */
|
/* If budget not fully consumed, exit the polling mode */
|
||||||
if((!tx_cleaned && (work_done == 0))) {
|
if (work_done < budget) {
|
||||||
netif_rx_complete(netdev, napi);
|
netif_rx_complete(netdev, napi);
|
||||||
ixgb_irq_enable(adapter);
|
ixgb_irq_enable(adapter);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1468,15 +1468,15 @@ static int ixgbe_clean(struct napi_struct *napi, int budget)
|
||||||
struct ixgbe_adapter *adapter = container_of(napi,
|
struct ixgbe_adapter *adapter = container_of(napi,
|
||||||
struct ixgbe_adapter, napi);
|
struct ixgbe_adapter, napi);
|
||||||
struct net_device *netdev = adapter->netdev;
|
struct net_device *netdev = adapter->netdev;
|
||||||
int tx_cleaned = 0, work_done = 0;
|
int work_done = 0;
|
||||||
|
|
||||||
/* In non-MSIX case, there is no multi-Tx/Rx queue */
|
/* In non-MSIX case, there is no multi-Tx/Rx queue */
|
||||||
tx_cleaned = ixgbe_clean_tx_irq(adapter, adapter->tx_ring);
|
ixgbe_clean_tx_irq(adapter, adapter->tx_ring);
|
||||||
ixgbe_clean_rx_irq(adapter, &adapter->rx_ring[0], &work_done,
|
ixgbe_clean_rx_irq(adapter, &adapter->rx_ring[0], &work_done,
|
||||||
budget);
|
budget);
|
||||||
|
|
||||||
/* If no Tx and not enough Rx work done, exit the polling mode */
|
/* If budget not fully consumed, exit the polling mode */
|
||||||
if ((!tx_cleaned && (work_done < budget))) {
|
if (work_done < budget) {
|
||||||
netif_rx_complete(netdev, napi);
|
netif_rx_complete(netdev, napi);
|
||||||
ixgbe_irq_enable(adapter);
|
ixgbe_irq_enable(adapter);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue