Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 973365dc authored by David S. Miller's avatar David S. Miller
Browse files

Merge branch 'xen-netback-fixes'



David Vrabel says:

====================
xen-netback: use skb to determine number of required (etc.)

"xen-netback: use skb to determine number of required" plus two other
minor fixes I found down the back of the sofa.
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents fb331185 9c6f3ffe
Loading
Loading
Loading
Loading
+6 −11
Original line number Diff line number Diff line
@@ -615,6 +615,7 @@ int xenvif_connect(struct xenvif_queue *queue, unsigned long tx_ring_ref,
	queue->tx_irq = 0;
err_unmap:
	xenvif_unmap_frontend_rings(queue);
	netif_napi_del(&queue->napi);
err:
	module_put(THIS_MODULE);
	return err;
@@ -684,22 +685,16 @@ void xenvif_deinit_queue(struct xenvif_queue *queue)

void xenvif_free(struct xenvif *vif)
{
	struct xenvif_queue *queue = NULL;
	struct xenvif_queue *queues = vif->queues;
	unsigned int num_queues = vif->num_queues;
	unsigned int queue_index;

	unregister_netdev(vif->dev);

	for (queue_index = 0; queue_index < num_queues; ++queue_index) {
		queue = &vif->queues[queue_index];
		xenvif_deinit_queue(queue);
	}

	vfree(vif->queues);
	vif->queues = NULL;
	vif->num_queues = 0;

	free_netdev(vif->dev);

	for (queue_index = 0; queue_index < num_queues; ++queue_index)
		xenvif_deinit_queue(&queues[queue_index]);
	vfree(queues);

	module_put(THIS_MODULE);
}
+9 −11
Original line number Diff line number Diff line
@@ -149,20 +149,19 @@ static inline pending_ring_idx_t pending_index(unsigned i)
	return i & (MAX_PENDING_REQS-1);
}

static int xenvif_rx_ring_slots_needed(struct xenvif *vif)
{
	if (vif->gso_mask)
		return DIV_ROUND_UP(vif->dev->gso_max_size, XEN_PAGE_SIZE) + 1;
	else
		return DIV_ROUND_UP(vif->dev->mtu, XEN_PAGE_SIZE);
}

static bool xenvif_rx_ring_slots_available(struct xenvif_queue *queue)
{
	RING_IDX prod, cons;
	struct sk_buff *skb;
	int needed;

	needed = xenvif_rx_ring_slots_needed(queue->vif);
	skb = skb_peek(&queue->rx_queue);
	if (!skb)
		return false;

	needed = DIV_ROUND_UP(skb->len, XEN_PAGE_SIZE);
	if (skb_is_gso(skb))
		needed++;

	do {
		prod = queue->rx.sring->req_prod;
@@ -2005,8 +2004,7 @@ static bool xenvif_rx_queue_ready(struct xenvif_queue *queue)

static bool xenvif_have_rx_work(struct xenvif_queue *queue)
{
	return (!skb_queue_empty(&queue->rx_queue)
		&& xenvif_rx_ring_slots_available(queue))
	return xenvif_rx_ring_slots_available(queue)
		|| (queue->vif->stall_timeout &&
		    (xenvif_rx_queue_stalled(queue)
		     || xenvif_rx_queue_ready(queue)))