Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Minor fix
[palacios.git] / palacios / src / devices / lnx_virtio_nic.c
index a2abb6e..88d3a59 100644 (file)
@@ -37,8 +37,6 @@
 #define PrintDebug(fmt, args...)
 #endif
 
-#define VIRTIO_NIC_PROFILE
-
 #define VIRTIO_NET_S_LINK_UP   1       /* Link is up */
 #define VIRTIO_NET_MAX_BUFSIZE (sizeof(struct virtio_net_hdr) + (64 << 10))
 
@@ -144,7 +142,7 @@ static int pkt_tx(struct guest_info *core, struct virtio_net_state * virtio, str
        return -1;
     }
 
-    if (virtio->net_ops->send(buf, len, (void *)core, NULL) == -1) {
+    if (virtio->net_ops->send(buf, len, virtio->backend_data, NULL) == -1) {
        return -1;
     }
 
@@ -206,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;
-    }
-
-    q->last_avail_idx = q->avail->index;
+    PrintDebug("Virtio NIC: TX: running on cpu: %d\n", V3_Get_CPU());
 
-    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];
@@ -229,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) {
@@ -246,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)) {
@@ -260,23 +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;
-
-    PrintError("Vnet_profiling: total_handle_time: %ld vnet_time: %ld  copy_from_guest: %ld copy_to_guest: %ld malloc_free: %ld, route_lookup: %ld\n", 
-                        (long)core->vnet_times.total_handle_time,
-                        (long)core->vnet_times.vnet_handle_time,
-                        (long)core->vnet_times.time_copy_from_guest,
-                        (long)core->vnet_times.time_copy_to_guest,
-                        (long)core->vnet_times.time_mallocfree,
-                        (long)core->vnet_times.time_route_lookup);
+    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;
@@ -329,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);
@@ -516,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 ++;
 
@@ -533,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;
@@ -575,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)) {
@@ -594,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);