#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))
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;
- }
- 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];
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)) {
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;
-#endif
-
return 0;
}
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);
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);
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;
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
}
if (!(q->avail->flags & VIRTIO_NO_IRQ_FLAG)) {
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: