|
@@ -1445,14 +1445,15 @@ static bool tx_credit_exceeded(struct xenvif *vif, unsigned size)
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
-static unsigned xenvif_tx_build_gops(struct xenvif *vif)
|
|
|
+static unsigned xenvif_tx_build_gops(struct xenvif *vif, int budget)
|
|
|
{
|
|
|
struct gnttab_copy *gop = vif->tx_copy_ops, *request_gop;
|
|
|
struct sk_buff *skb;
|
|
|
int ret;
|
|
|
|
|
|
while ((nr_pending_reqs(vif) + XEN_NETBK_LEGACY_SLOTS_MAX
|
|
|
- < MAX_PENDING_REQS)) {
|
|
|
+ < MAX_PENDING_REQS) &&
|
|
|
+ (skb_queue_len(&vif->tx_queue) < budget)) {
|
|
|
struct xen_netif_tx_request txreq;
|
|
|
struct xen_netif_tx_request txfrags[XEN_NETBK_LEGACY_SLOTS_MAX];
|
|
|
struct page *page;
|
|
@@ -1614,14 +1615,13 @@ static unsigned xenvif_tx_build_gops(struct xenvif *vif)
|
|
|
}
|
|
|
|
|
|
|
|
|
-static int xenvif_tx_submit(struct xenvif *vif, int budget)
|
|
|
+static int xenvif_tx_submit(struct xenvif *vif)
|
|
|
{
|
|
|
struct gnttab_copy *gop = vif->tx_copy_ops;
|
|
|
struct sk_buff *skb;
|
|
|
int work_done = 0;
|
|
|
|
|
|
- while (work_done < budget &&
|
|
|
- (skb = __skb_dequeue(&vif->tx_queue)) != NULL) {
|
|
|
+ while ((skb = __skb_dequeue(&vif->tx_queue)) != NULL) {
|
|
|
struct xen_netif_tx_request *txp;
|
|
|
u16 pending_idx;
|
|
|
unsigned data_len;
|
|
@@ -1696,14 +1696,14 @@ int xenvif_tx_action(struct xenvif *vif, int budget)
|
|
|
if (unlikely(!tx_work_todo(vif)))
|
|
|
return 0;
|
|
|
|
|
|
- nr_gops = xenvif_tx_build_gops(vif);
|
|
|
+ nr_gops = xenvif_tx_build_gops(vif, budget);
|
|
|
|
|
|
if (nr_gops == 0)
|
|
|
return 0;
|
|
|
|
|
|
gnttab_batch_copy(vif->tx_copy_ops, nr_gops);
|
|
|
|
|
|
- work_done = xenvif_tx_submit(vif, nr_gops);
|
|
|
+ work_done = xenvif_tx_submit(vif);
|
|
|
|
|
|
return work_done;
|
|
|
}
|