adapter->total_rx_packets = 0;
__napi_schedule(&adapter->napi);
__napi_schedule(&adapter->napi);
__napi_schedule(&adapter->napi);
__napi_schedule(&adapter->napi);
}
}
3.2.2
3.2.2
3.2.2
3.2.2 E
E
E
E 1000e
1000e
1000e
1000e 的 POLL
POLL
POLL
POLL 函数
static int e1000_clean(struct napi_struct *napi, int budget)
{
struct e1000_adapter *adapter = container_of(napi, struct e1000_adapter, napi);
struct e1000_hw *hw = &adapter->hw;
struct net_device *poll_dev = adapter->netdev;
int tx_cleaned = 1, work_done = 0;
adapter = netdev_priv(poll_dev);
if (adapter->msix_entries &&
!(adapter->rx_ring->ims_val & adapter->tx_ring->ims_val))
goto clean_rx;
tx_cleaned = e1000_clean_tx_irq(adapter);
clean_rx:
adapter->clean_rx(adapter, &work_done, budget);
if (!tx_cleaned)
work_done = budget;
/* If budget not fully consumed, exit the polling mode */
if ( work_done
work_done
work_done
work_done <
<
<
< budget
budget
budget
budget ) { /* 说明接受队列没有报文了,报文数小于期望的值
(默认 64 ) */
if (adapter->itr_setting & 3)
e1000_set_itr(adapter);
e1000_set_itr(adapter);
e1000_set_itr(adapter);
e1000_set_itr(adapter); /*
/*
/*
/* 调整中断频率 */
*/
*/
*/
napi_complete(napi);
napi_complete(napi);
napi_complete(napi);
napi_complete(napi); /*
/*
/*
/* 从中断 CPU
CPU
CPU
CPU 队列去掉, 通过下一次硬中断再次 处
理接受报文 */
*/
*/
*/
if (!test_bit(__E1000_DOWN, &adapter->state)) {
if (adapter->msix_entries)
ew32(IMS, adapter->rx_ring->ims_val);
else
e1000_irq_enable(adapter);
}
}
return work_done;