X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fdevices%2Flnx_virtio_nic.c;h=88d3a59eb9fff132b0aa0740a007ab75ab8cfdfc;hb=966e433fd935e1ad837960e1b245d8506b2cf515;hp=84e8f0def7cc23a2b92ef5eeb8c3810e7b92f903;hpb=331eb3b042d3456e1eaf33eb9e32606774b715fb;p=palacios.git diff --git a/palacios/src/devices/lnx_virtio_nic.c b/palacios/src/devices/lnx_virtio_nic.c index 84e8f0d..88d3a59 100644 --- a/palacios/src/devices/lnx_virtio_nic.c +++ b/palacios/src/devices/lnx_virtio_nic.c @@ -37,10 +37,6 @@ #define PrintDebug(fmt, args...) #endif -#ifdef CONFIG_VNET_PROFILE -#define VIRTIO_NIC_PROFILE -#endif - #define VIRTIO_NET_S_LINK_UP 1 /* Link is up */ #define VIRTIO_NET_MAX_BUFSIZE (sizeof(struct virtio_net_hdr) + (64 << 10)) @@ -208,14 +204,9 @@ static int handle_pkt_tx(struct guest_info *core, struct virtio_net_state * virt struct virtio_queue * q = &(virtio_state->tx_vq); struct virtio_net_hdr * hdr = NULL; - if (q->avail->index < q->last_avail_idx) { - q->idx_overflow = true; - } + PrintDebug("Virtio NIC: TX: running on cpu: %d\n", V3_Get_CPU()); - q->last_avail_idx = q->avail->index; - - while (q->cur_avail_idx < q->avail->index || - (q->idx_overflow && q->cur_avail_idx < (q->avail->index + 65536))) { + while (q->cur_avail_idx != q->avail->index) { struct vring_desc * hdr_desc = NULL; addr_t hdr_addr = 0; uint16_t desc_idx = q->avail->ring[q->cur_avail_idx % q->queue_size]; @@ -231,7 +222,7 @@ static int handle_pkt_tx(struct guest_info *core, struct virtio_net_state * virt hdr = (struct virtio_net_hdr*)hdr_addr; desc_idx = hdr_desc->next; - + for (i = 0; i < desc_cnt - 1; i++) { struct vring_desc * buf_desc = &(q->desc[desc_idx]); if (pkt_tx(core, virtio_state, buf_desc) == -1) { @@ -248,13 +239,7 @@ static int handle_pkt_tx(struct guest_info *core, struct virtio_net_state * virt q->used->ring[q->used->index % q->queue_size].length = req_len; // What do we set this to???? q->used->index++; - int last_idx = q->cur_avail_idx; - q->cur_avail_idx ++; - - if (q->cur_avail_idx < last_idx) { - q->idx_overflow = false; - } } if (!(q->avail->flags & VIRTIO_NO_IRQ_FLAG)) { @@ -262,16 +247,13 @@ static int handle_pkt_tx(struct guest_info *core, struct virtio_net_state * virt virtio_state->virtio_cfg.pci_isr = 0x1; } -#ifdef VIRTIO_NIC_PROFILE - if(virtio_state->pkt_sent % 10000 == 0) - PrintError("Virtio NIC: %p, pkt_sent: %ld\n", virtio_state, virtio_state->pkt_sent); -#endif - #ifdef CONFIG_VNET_PROFILE - uint64_t time; - rdtscll(time); - core->vnet_times.total_handle_time = time - core->vnet_times.virtio_handle_start; - core->vnet_times.print = true; + if (virtio_state->pkt_sent % 10000 == 0){ + PrintError("Virtio NIC: sent: %ld, rxed: %ld, dropped: %ld\n", + virtio_state->pkt_sent, + virtio_state->pkt_recv, + virtio_state->pkt_drop); + } #endif return 0; @@ -324,11 +306,6 @@ static int virtio_io_write(struct guest_info *core, uint16_t port, void * src, u struct virtio_net_state * virtio = (struct virtio_net_state *)private_data; int port_idx = port % virtio->io_range_size; -#ifdef CONFIG_VNET_PROFILE - uint64_t time; - rdtscll(time); - core->vnet_times.virtio_handle_start = time; -#endif PrintDebug("VIRTIO NIC %p Write for port %d (index=%d) len=%d, value=%x\n", private_data, port, port_idx, length, *(uint32_t *)src); @@ -511,12 +488,12 @@ static int virtio_rx(uint8_t * buf, uint32_t size, void * private_data) { uint32_t data_len = size; uint32_t offset = 0; unsigned long flags; - int ret_val; + int ret_val = -1; int raw = 1; flags = v3_lock_irqsave(virtio->lock); - - PrintDebug("VIRTIO NIC: receiving packet to virtio nic %p, size:%d\n", virtio, size); + + PrintDebug("VIRTIO NIC: RX on cpu %d to virtio nic %p, size:%d\n", V3_Get_CPU(), virtio, size); virtio->pkt_recv ++; @@ -528,15 +505,10 @@ static int virtio_rx(uint8_t * buf, uint32_t size, void * private_data) { if (q->ring_avail_addr == 0) { PrintError("Queue is not set\n"); - ret_val = -1; goto exit; } - if (q->last_avail_idx > q->avail->index) - q->idx_overflow = true; - q->last_avail_idx = q->avail->index; - - if (q->cur_avail_idx < q->avail->index || (q->idx_overflow && q->cur_avail_idx < q->avail->index+65536)){ + if (q->cur_avail_idx != q->avail->index){ addr_t hdr_addr = 0; uint16_t hdr_idx = q->avail->ring[q->cur_avail_idx % q->queue_size]; uint16_t buf_idx = 0; @@ -570,17 +542,10 @@ static int virtio_rx(uint8_t * buf, uint32_t size, void * private_data) { q->used->ring[q->used->index % q->queue_size].length = data_len + hdr_len; // This should be the total length of data sent to guest (header+pkt_data) q->used->index++; - int last_idx = q->cur_avail_idx; q->cur_avail_idx++; - if (q->cur_avail_idx < last_idx) - q->idx_overflow = false; } else { virtio->pkt_drop++; - -#ifdef VIRTIO_NIC_PROFILE - PrintError("Virtio NIC: %p, one pkt dropped receieved: %ld, dropped: %ld, sent: %ld curidx: %d, avaiIdx: %d\n", - virtio, virtio->pkt_recv, virtio->pkt_drop, virtio->pkt_sent, q->cur_avail_idx, q->avail->index); -#endif + goto exit; } if (!(q->avail->flags & VIRTIO_NO_IRQ_FLAG)) { @@ -589,16 +554,18 @@ static int virtio_rx(uint8_t * buf, uint32_t size, void * private_data) { virtio->virtio_cfg.pci_isr = 0x1; } -#ifdef VIRTIO_NIC_PROFILE - if ((virtio->pkt_recv % 10000) == 0){ - PrintError("Virtio NIC: %p, receieved: %ld, dropped: %ld, sent: %ld\n", - virtio, virtio->pkt_recv, virtio->pkt_drop, virtio->pkt_sent); - } -#endif - ret_val = offset; exit: + +#ifdef CONFIG_VNET_PROFILE + if (virtio->pkt_recv % 100000 == 0){ + PrintError("Virtio NIC: sent: %ld, rxed: %ld, dropped: %ld\n", + virtio->pkt_sent, + virtio->pkt_recv, + virtio->pkt_drop); + } +#endif v3_unlock_irqrestore(virtio->lock, flags);