コード例 #1
0
ファイル: interface.c プロジェクト: ReneNyffenegger/linux
static int xenvif_poll(struct napi_struct *napi, int budget)
{
	struct xenvif_queue *queue =
		container_of(napi, struct xenvif_queue, napi);
	int work_done;

	/* This vif is rogue, we pretend we've there is nothing to do
	 * for this vif to deschedule it from NAPI. But this interface
	 * will be turned off in thread context later.
	 */
	if (unlikely(queue->vif->disabled)) {
		napi_complete(napi);
		return 0;
	}

	work_done = xenvif_tx_action(queue, budget);

	if (work_done < budget) {
		napi_complete_done(napi, work_done);
		/* If the queue is rate-limited, it shall be
		 * rescheduled in the timer callback.
		 */
		if (likely(!queue->rate_limited))
			xenvif_napi_schedule_or_enable_events(queue);
	}

	return work_done;
}
コード例 #2
0
ファイル: interface.c プロジェクト: andyqee/linux
int xenvif_poll(struct napi_struct *napi, int budget)
{
	struct xenvif_queue *queue =
		container_of(napi, struct xenvif_queue, napi);
	int work_done;

	/* This vif is rogue, we pretend we've there is nothing to do
	 * for this vif to deschedule it from NAPI. But this interface
	 * will be turned off in thread context later.
	 * Also, if a guest doesn't post enough slots to receive data on one of
	 * its queues, the carrier goes down and NAPI is descheduled here so
	 * the guest can't send more packets until it's ready to receive.
	 */
	if (unlikely(queue->vif->disabled ||
		     !netif_carrier_ok(queue->vif->dev))) {
		napi_complete(napi);
		return 0;
	}

	work_done = xenvif_tx_action(queue, budget);

	if (work_done < budget) {
		napi_complete(napi);
		xenvif_napi_schedule_or_enable_events(queue);
	}

	return work_done;
}
コード例 #3
0
ファイル: interface.c プロジェクト: Daiki0525/linux
static void xenvif_up(struct xenvif *vif)
{
	napi_enable(&vif->napi);
	enable_irq(vif->tx_irq);
	if (vif->tx_irq != vif->rx_irq)
		enable_irq(vif->rx_irq);
	xenvif_napi_schedule_or_enable_events(vif);
}
コード例 #4
0
ファイル: interface.c プロジェクト: mhei/linux
static void xenvif_up(struct xenvif *vif)
{
    struct xenvif_queue *queue = NULL;
    unsigned int num_queues = vif->num_queues;
    unsigned int queue_index;

    for (queue_index = 0; queue_index < num_queues; ++queue_index) {
        queue = &vif->queues[queue_index];
        napi_enable(&queue->napi);
        enable_irq(queue->tx_irq);
        if (queue->tx_irq != queue->rx_irq)
            enable_irq(queue->rx_irq);
        xenvif_napi_schedule_or_enable_events(queue);
    }
}
コード例 #5
0
ファイル: interface.c プロジェクト: Daiki0525/linux
static int xenvif_poll(struct napi_struct *napi, int budget)
{
	struct xenvif *vif = container_of(napi, struct xenvif, napi);
	int work_done;

	/* This vif is rogue, we pretend we've there is nothing to do
	 * for this vif to deschedule it from NAPI. But this interface
	 * will be turned off in thread context later.
	 */
	if (unlikely(vif->disabled)) {
		napi_complete(napi);
		return 0;
	}

	work_done = xenvif_tx_action(vif, budget);

	if (work_done < budget) {
		napi_complete(napi);
		xenvif_napi_schedule_or_enable_events(vif);
	}

	return work_done;
}