diff options
| -rw-r--r-- | drivers/net/ethernet/amd/amd8111e.c | 3 | ||||
| -rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/cisco/enic/enic_main.c | 14 | ||||
| -rw-r--r-- | drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c | 3 | ||||
| -rw-r--r-- | drivers/net/ethernet/ibm/ibmveth.c | 4 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_txrx.c | 3 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/igb/igb_main.c | 4 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 4 | ||||
| -rw-r--r-- | drivers/net/ethernet/marvell/sky2.c | 3 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/en_rx.c | 3 | ||||
| -rw-r--r-- | drivers/net/ethernet/neterion/s2io.c | 3 | ||||
| -rw-r--r-- | drivers/net/ethernet/neterion/vxge/vxge-main.c | 4 | ||||
| -rw-r--r-- | drivers/net/ethernet/sfc/ef10.c | 3 | ||||
| -rw-r--r-- | drivers/net/ethernet/sfc/farch.c | 3 | ||||
| -rw-r--r-- | drivers/net/ethernet/tile/tilegx.c | 3 | ||||
| -rw-r--r-- | drivers/net/ethernet/tile/tilepro.c | 3 | ||||
| -rw-r--r-- | drivers/net/ethernet/toshiba/tc35815.c | 3 |
17 files changed, 53 insertions, 12 deletions
diff --git a/drivers/net/ethernet/amd/amd8111e.c b/drivers/net/ethernet/amd/amd8111e.c index 2061b471fd16..26efaaa5e73f 100644 --- a/drivers/net/ethernet/amd/amd8111e.c +++ b/drivers/net/ethernet/amd/amd8111e.c | |||
| @@ -720,6 +720,9 @@ static int amd8111e_rx_poll(struct napi_struct *napi, int budget) | |||
| 720 | int rx_pkt_limit = budget; | 720 | int rx_pkt_limit = budget; |
| 721 | unsigned long flags; | 721 | unsigned long flags; |
| 722 | 722 | ||
| 723 | if (rx_pkt_limit <= 0) | ||
| 724 | goto rx_not_empty; | ||
| 725 | |||
| 723 | do{ | 726 | do{ |
| 724 | /* process receive packets until we use the quota*/ | 727 | /* process receive packets until we use the quota*/ |
| 725 | /* If we own the next entry, it's a new packet. Send it up. */ | 728 | /* If we own the next entry, it's a new packet. Send it up. */ |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c index 117b5c7f8ac9..acd494647f25 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | |||
| @@ -872,6 +872,8 @@ static int bnx2x_rx_int(struct bnx2x_fastpath *fp, int budget) | |||
| 872 | if (unlikely(bp->panic)) | 872 | if (unlikely(bp->panic)) |
| 873 | return 0; | 873 | return 0; |
| 874 | #endif | 874 | #endif |
| 875 | if (budget <= 0) | ||
| 876 | return rx_pkt; | ||
| 875 | 877 | ||
| 876 | bd_cons = fp->rx_bd_cons; | 878 | bd_cons = fp->rx_bd_cons; |
| 877 | bd_prod = fp->rx_bd_prod; | 879 | bd_prod = fp->rx_bd_prod; |
diff --git a/drivers/net/ethernet/cisco/enic/enic_main.c b/drivers/net/ethernet/cisco/enic/enic_main.c index dcd58f23834a..4c35fc8fad99 100644 --- a/drivers/net/ethernet/cisco/enic/enic_main.c +++ b/drivers/net/ethernet/cisco/enic/enic_main.c | |||
| @@ -1086,14 +1086,15 @@ static int enic_poll(struct napi_struct *napi, int budget) | |||
| 1086 | unsigned int intr = enic_legacy_io_intr(); | 1086 | unsigned int intr = enic_legacy_io_intr(); |
| 1087 | unsigned int rq_work_to_do = budget; | 1087 | unsigned int rq_work_to_do = budget; |
| 1088 | unsigned int wq_work_to_do = -1; /* no limit */ | 1088 | unsigned int wq_work_to_do = -1; /* no limit */ |
| 1089 | unsigned int work_done, rq_work_done, wq_work_done; | 1089 | unsigned int work_done, rq_work_done = 0, wq_work_done; |
| 1090 | int err; | 1090 | int err; |
| 1091 | 1091 | ||
| 1092 | /* Service RQ (first) and WQ | 1092 | /* Service RQ (first) and WQ |
| 1093 | */ | 1093 | */ |
| 1094 | 1094 | ||
| 1095 | rq_work_done = vnic_cq_service(&enic->cq[cq_rq], | 1095 | if (budget > 0) |
| 1096 | rq_work_to_do, enic_rq_service, NULL); | 1096 | rq_work_done = vnic_cq_service(&enic->cq[cq_rq], |
| 1097 | rq_work_to_do, enic_rq_service, NULL); | ||
| 1097 | 1098 | ||
| 1098 | wq_work_done = vnic_cq_service(&enic->cq[cq_wq], | 1099 | wq_work_done = vnic_cq_service(&enic->cq[cq_wq], |
| 1099 | wq_work_to_do, enic_wq_service, NULL); | 1100 | wq_work_to_do, enic_wq_service, NULL); |
| @@ -1141,14 +1142,15 @@ static int enic_poll_msix(struct napi_struct *napi, int budget) | |||
| 1141 | unsigned int cq = enic_cq_rq(enic, rq); | 1142 | unsigned int cq = enic_cq_rq(enic, rq); |
| 1142 | unsigned int intr = enic_msix_rq_intr(enic, rq); | 1143 | unsigned int intr = enic_msix_rq_intr(enic, rq); |
| 1143 | unsigned int work_to_do = budget; | 1144 | unsigned int work_to_do = budget; |
| 1144 | unsigned int work_done; | 1145 | unsigned int work_done = 0; |
| 1145 | int err; | 1146 | int err; |
| 1146 | 1147 | ||
| 1147 | /* Service RQ | 1148 | /* Service RQ |
| 1148 | */ | 1149 | */ |
| 1149 | 1150 | ||
| 1150 | work_done = vnic_cq_service(&enic->cq[cq], | 1151 | if (budget > 0) |
| 1151 | work_to_do, enic_rq_service, NULL); | 1152 | work_done = vnic_cq_service(&enic->cq[cq], |
| 1153 | work_to_do, enic_rq_service, NULL); | ||
| 1152 | 1154 | ||
| 1153 | /* Return intr event credits for this polling | 1155 | /* Return intr event credits for this polling |
| 1154 | * cycle. An intr event is the completion of a | 1156 | * cycle. An intr event is the completion of a |
diff --git a/drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c b/drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c index 62f042d4aaa9..dc80db41d6b3 100644 --- a/drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c +++ b/drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c | |||
| @@ -91,6 +91,9 @@ static int fs_enet_rx_napi(struct napi_struct *napi, int budget) | |||
| 91 | u16 pkt_len, sc; | 91 | u16 pkt_len, sc; |
| 92 | int curidx; | 92 | int curidx; |
| 93 | 93 | ||
| 94 | if (budget <= 0) | ||
| 95 | return received; | ||
| 96 | |||
| 94 | /* | 97 | /* |
| 95 | * First, grab all of the stats for the incoming packet. | 98 | * First, grab all of the stats for the incoming packet. |
| 96 | * These get messed up if we get called due to a busy condition. | 99 | * These get messed up if we get called due to a busy condition. |
diff --git a/drivers/net/ethernet/ibm/ibmveth.c b/drivers/net/ethernet/ibm/ibmveth.c index 1fc8334fc181..e75bdfcd1374 100644 --- a/drivers/net/ethernet/ibm/ibmveth.c +++ b/drivers/net/ethernet/ibm/ibmveth.c | |||
| @@ -1072,7 +1072,7 @@ static int ibmveth_poll(struct napi_struct *napi, int budget) | |||
| 1072 | unsigned long lpar_rc; | 1072 | unsigned long lpar_rc; |
| 1073 | 1073 | ||
| 1074 | restart_poll: | 1074 | restart_poll: |
| 1075 | do { | 1075 | while (frames_processed < budget) { |
| 1076 | if (!ibmveth_rxq_pending_buffer(adapter)) | 1076 | if (!ibmveth_rxq_pending_buffer(adapter)) |
| 1077 | break; | 1077 | break; |
| 1078 | 1078 | ||
| @@ -1121,7 +1121,7 @@ restart_poll: | |||
| 1121 | netdev->stats.rx_bytes += length; | 1121 | netdev->stats.rx_bytes += length; |
| 1122 | frames_processed++; | 1122 | frames_processed++; |
| 1123 | } | 1123 | } |
| 1124 | } while (frames_processed < budget); | 1124 | } |
| 1125 | 1125 | ||
| 1126 | ibmveth_replenish_task(adapter); | 1126 | ibmveth_replenish_task(adapter); |
| 1127 | 1127 | ||
diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c b/drivers/net/ethernet/intel/i40e/i40e_txrx.c index daa3b295ff3d..88666adb0743 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c +++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c | |||
| @@ -1302,6 +1302,9 @@ static int i40e_clean_rx_irq(struct i40e_ring *rx_ring, int budget) | |||
| 1302 | u8 rx_ptype; | 1302 | u8 rx_ptype; |
| 1303 | u64 qword; | 1303 | u64 qword; |
| 1304 | 1304 | ||
| 1305 | if (budget <= 0) | ||
| 1306 | return 0; | ||
| 1307 | |||
| 1305 | rx_desc = I40E_RX_DESC(rx_ring, i); | 1308 | rx_desc = I40E_RX_DESC(rx_ring, i); |
| 1306 | qword = le64_to_cpu(rx_desc->wb.qword1.status_error_len); | 1309 | qword = le64_to_cpu(rx_desc->wb.qword1.status_error_len); |
| 1307 | rx_status = (qword & I40E_RXD_QW1_STATUS_MASK) >> | 1310 | rx_status = (qword & I40E_RXD_QW1_STATUS_MASK) >> |
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c index f81d87cfcc8d..d6b11522fed7 100644 --- a/drivers/net/ethernet/intel/igb/igb_main.c +++ b/drivers/net/ethernet/intel/igb/igb_main.c | |||
| @@ -6946,7 +6946,7 @@ static bool igb_clean_rx_irq(struct igb_q_vector *q_vector, const int budget) | |||
| 6946 | unsigned int total_bytes = 0, total_packets = 0; | 6946 | unsigned int total_bytes = 0, total_packets = 0; |
| 6947 | u16 cleaned_count = igb_desc_unused(rx_ring); | 6947 | u16 cleaned_count = igb_desc_unused(rx_ring); |
| 6948 | 6948 | ||
| 6949 | do { | 6949 | while (likely(total_packets < budget)) { |
| 6950 | union e1000_adv_rx_desc *rx_desc; | 6950 | union e1000_adv_rx_desc *rx_desc; |
| 6951 | 6951 | ||
| 6952 | /* return some buffers to hardware, one at a time is too slow */ | 6952 | /* return some buffers to hardware, one at a time is too slow */ |
| @@ -6998,7 +6998,7 @@ static bool igb_clean_rx_irq(struct igb_q_vector *q_vector, const int budget) | |||
| 6998 | 6998 | ||
| 6999 | /* update budget accounting */ | 6999 | /* update budget accounting */ |
| 7000 | total_packets++; | 7000 | total_packets++; |
| 7001 | } while (likely(total_packets < budget)); | 7001 | } |
| 7002 | 7002 | ||
| 7003 | /* place incomplete frames back on ring for completion */ | 7003 | /* place incomplete frames back on ring for completion */ |
| 7004 | rx_ring->skb = skb; | 7004 | rx_ring->skb = skb; |
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c index 5d314fe873bb..18cd8ca319ea 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | |||
| @@ -2076,7 +2076,7 @@ static int ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector, | |||
| 2076 | #endif /* IXGBE_FCOE */ | ||
