/* Suppress further interrupts. */
virtqueue_disable_cb(vq);
- /* We were probably waiting for more output buffers. */
- netif_wake_subqueue(vi->dev, vq2txq(vq));
+ if (napi->weight)
+ virtqueue_napi_schedule(napi, vq);
+ else
+ /* We were probably waiting for more output buffers. */
+ netif_wake_subqueue(vi->dev, vq2txq(vq));
}
- static unsigned int mergeable_ctx_to_buf_truesize(unsigned long mrg_ctx)
- {
- unsigned int truesize = mrg_ctx & (MERGEABLE_BUFFER_ALIGN - 1);
- return (truesize + 1) * MERGEABLE_BUFFER_ALIGN;
- }
-
- static void *mergeable_ctx_to_buf_address(unsigned long mrg_ctx)
- {
- return (void *)(mrg_ctx & -MERGEABLE_BUFFER_ALIGN);
-
- }
-
- static unsigned long mergeable_buf_to_ctx(void *buf, unsigned int truesize)
- {
- unsigned int size = truesize / MERGEABLE_BUFFER_ALIGN;
- return (unsigned long)buf | (size - 1);
- }
-
/* Called from bottom half context */
static struct sk_buff *page_to_skb(struct virtnet_info *vi,
struct receive_queue *rq,