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.


clean up on VNET code
Lei Xia [Mon, 8 Nov 2010 20:50:40 +0000 (14:50 -0600)]
palacios/include/palacios/vmm_vnet.h
palacios/src/devices/lnx_virtio_nic.c

index 254fbf5..05a6235 100644 (file)
@@ -128,9 +128,6 @@ int v3_vnet_add_route(struct v3_vnet_route route);
 int v3_init_vnet();
 
 int v3_vnet_add_bridge(struct v3_vm_info * vm,
-               /*int (*input)(struct v3_vm_info * vm, struct v3_vnet_pkt pkt[], uint16_t pkt_num, void * private_data),
-               void (*xcall_input)(void *data),
-               int (*poll_pkt)(struct v3_vm_info * vm, void * private_data),*/
                struct v3_vnet_bridge_ops *ops,
                void * priv_data);
 
@@ -140,10 +137,8 @@ int v3_vnet_add_dev(struct v3_vm_info *info, uint8_t mac[6],
 
 void v3_vnet_poll(struct v3_vm_info *vm);
 
-/* enable a vnet device, tell VNET can send pkts to it */
 int v3_vnet_enable_device(int dev_id);
 
-/* tell VNET stop sending pkts to it */
 int v3_vnet_disable_device(int dev_id);
 
 #endif
index 4f86bbe..ca492fb 100644 (file)
@@ -354,121 +354,6 @@ exit_error:
 }
 
 
-#if 0 //for multicore VNET
-/* used for poll pkt from virtio nic by VNET
- * only when vnet is running on sidecore */
-static int handle_pkt_tx_sidecore(struct guest_info *core, struct virtio_net_state * virtio) 
-{
-    struct virtio_queue * q = &(virtio->tx_vq);
-    struct virtio_net_hdr * hdr = NULL;
-    int recved = 0;
-    unsigned long flags;
-
-    if (!q->ring_avail_addr) {
-       return -ERR_VIRTIO_TXQ_NOSET;
-    }
-
-    flags = v3_lock_irqsave(virtio->tx_lock);
-
-    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];
-       int desc_cnt = get_desc_count(q, desc_idx);
-       uint32_t req_len = 0;
-       int i = 0;
-
-       hdr_desc = &(q->desc[desc_idx]);
-       if (v3_gpa_to_hva(core, hdr_desc->addr_gpa, &(hdr_addr)) == -1) {
-           PrintError("Could not translate block header address\n");
-           goto exit_error;
-       }
-
-       hdr = (struct virtio_net_hdr*)hdr_addr;
-       desc_idx = hdr_desc->next;
-
-       if(desc_cnt > 2){
-           PrintError("VNIC: merged rx buffer not supported\n");
-           goto exit_error;
-       }
-
-       for (i = 0; i < desc_cnt - 1; i++) {    
-           struct vring_desc * buf_desc = &(q->desc[desc_idx]);
-           if (pkt_tx_sidecore(core, virtio, buf_desc) < 0) {
-               PrintError("Error handling nic operation\n");
-               goto exit_error;
-           }
-
-           req_len += buf_desc->length;
-           desc_idx = buf_desc->next;
-       }
-       recved ++;
-       
-       q->cur_avail_idx ++;
-    }
-
-    if(recved) PrintDebug("VNIC: Tx polling %d pkts\n", recved);
-       
-    v3_unlock_irqrestore(virtio->tx_lock, flags);
-
-    return 0;
-
-exit_error:
-       
-    v3_unlock_irqrestore(virtio->tx_lock, flags);
-    return -ERR_VIRTIO_OTHER;
-}
-
-
-/* called by VNET, to notify Virtio to update the tx_queue used index 
- * used only when vnet running on sidecore */
-static int update_tx_queue(struct virtio_net_state * virtio, int handled_pkt){
-    struct virtio_queue * q = &(virtio->tx_vq);
-    unsigned long flags;
-
-    if (!q->ring_avail_addr) {
-       return -ERR_VIRTIO_TXQ_NOSET;
-    }
-
-    flags = v3_lock_irqsave(virtio->tx_lock);
-    while(handled_pkt > 0){
-       q->used->ring[q->used->index % q->queue_size].id = q->avail->ring[virtio->cur_notify_tx_idx % q->queue_size];
-       q->used->ring[q->used->index % q->queue_size].length = req_len; // TODO:
-       q->used->index ++;
-       virtio->cur_notify_tx_idx ++;
-       handled_pkt --;
-    }
-    v3_unlock_irqrestore(virtio->tx_lock, flags);
-
-    if (handled_pkt && (!(q->avail->flags & VIRTIO_NO_IRQ_FLAG))) {
-       v3_pci_raise_irq(virtio->virtio_dev->pci_bus, 0, virtio->pci_dev);
-       virtio->virtio_cfg.pci_isr = 0x1;
-
-       /* do we need to notify here? */
-       notify_guest(virtio);
-    }
-
-    virtio->pkt_sent += handled_pkt;
-       
-#ifdef CONFIG_VNET_PROFILE
-    if (virtio->pkt_sent % 50000 == 0){
-           long cur_time, time;
-           rdtscll(cur_time);
-           time = cur_time - virtio_state->last_sent_time;
-           PrintError("Virtio NIC: last sent 50000 cycles: %ld\n",time);
-           PrintError("Virtio NIC: sent: %ld, rxed: %ld, dropped: %ld\n",
-                       virtio->pkt_sent,
-                       virtio->pkt_recv,
-                       virtio->pkt_drop);
-           rdtscll(virtio->last_sent_time);
-    }
-#endif
-
-
-    return 0;
-}
-#endif
-
 static int virtio_setup_queue(struct guest_info *core, 
                                struct virtio_net_state * virtio_state, 
                                struct virtio_queue * queue, 
@@ -789,118 +674,6 @@ exit:
 }
 
 
-#if 0 /* for encapuslation */
-/* virtio RX with encapulation version */
-static int virtio_rx_encap(uint8_t * data, 
-                                                 uint32_t size, 
-                                                 void * encap_header, 
-                                                 uint16_t encap_len,
-                                                 void * private_data) {
-    struct virtio_net_state * virtio = (struct virtio_net_state *)private_data;
-    struct virtio_queue * q = &(virtio->rx_vq);
-    struct virtio_net_hdr_mrg_rxbuf hdr;
-    uint32_t hdr_len = sizeof(struct virtio_net_hdr_mrg_rxbuf);
-    uint32_t data_len = size + encap_len;
-    unsigned long flags;
-    int ret_val = -ERR_VIRTIO_OTHER;
-
-    if (q->ring_avail_addr == 0) {
-       PrintError("Queue is not set\n");
-       ret_val = -ERR_VIRTIO_RXQ_NOSET;
-       goto exit;
-    }
-       
-    memset(&hdr, 0, sizeof(struct virtio_net_hdr_mrg_rxbuf));
-
-    flags = v3_lock_irqsave(virtio->rx_lock);
-    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;
-       struct vring_desc * hdr_desc = NULL;
-       uint32_t offset = 0;
-
-       hdr_desc = &(q->desc[hdr_idx]);
-       if (guest_pa_to_host_va(&(virtio->virtio_dev->vm->cores[0]), hdr_desc->addr_gpa, &(hdr_addr)) == -1) {
-           PrintError("Could not translate receive buffer address\n");
-           goto exit;
-       }
-       hdr.num_buffers = 1;
-       memcpy((void *)hdr_addr, &hdr, sizeof(struct virtio_net_hdr_mrg_rxbuf));
-       if (offset >= data_len) {
-           hdr_desc->flags &= ~VIRTIO_NEXT_FLAG;
-       }
-
-       struct vring_desc * buf_desc = NULL;
-       uint32_t len = 0;
-       buf_idx = hdr_desc->next;
-       buf_desc = &(q->desc[buf_idx]);
-       
-       if(hdr_len > 0 && !encap_header) {
-           len = copy_data_to_desc(&(virtio->virtio_dev->vm->cores[0]), virtio, buf_desc, encap_header, encap_len, 0);
-           offset += len;
-       }
-       
-       len = copy_data_to_desc(&(virtio->virtio_dev->vm->cores[0]), virtio, buf_desc, data + offset, data_len - offset, offset);           
-       offset += len;
-
-       if(data_len < offset)/* if there is large pkt, need merge more buffer */
-           PrintDebug("Virtio NIC: data pkt larger than RX queue buffer\n");
-
-       buf_desc->length = offset;      
-       buf_desc->flags &= ~VIRTIO_NEXT_FLAG;
-       
-       q->used->ring[q->used->index % q->queue_size].id = q->avail->ring[q->cur_avail_idx % q->queue_size];
-       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++;
-       q->cur_avail_idx++;
-
-       /* notify guest 
-         * when it returns from EXIT, guest gets the virtio rx interrupt */
-       if((++virtio->buffed_rx > q->queue_size/2) &&
-           (q->avail->flags & VIRTIO_NO_IRQ_FLAG)) {
-           if(virtio->virtio_dev->vm->cores[0].cpu_id != V3_Get_CPU()){
-                 notify_guest(virtio);
-           }
-           virtio->buffed_rx = 0;
-       }
-       ret_val = offset;
-    } else {
-       virtio->pkt_drop++;
-       ret_val = -ERR_VIRTIO_RXQ_FULL;
-       goto exit;
-    }
-    virtio->pkt_recv ++;
-
-    if (!(q->avail->flags & VIRTIO_NO_IRQ_FLAG)) {
-       PrintDebug("Raising IRQ %d\n",  virtio->pci_dev->config_header.intr_line);
-       v3_pci_raise_irq(virtio->virtio_dev->pci_bus, 0, virtio->pci_dev);
-       virtio->virtio_cfg.pci_isr = 0x1;
-    }
-
-#ifdef CONFIG_VNET_PROFILE
-    if (virtio->pkt_recv % 50000 == 0){
-           long cur_time, time;
-           rdtscll(cur_time);
-           time = cur_time - virtio->last_recv_time;
-           PrintError("Virtio NIC: sent: %ld, rxed: %ld, dropped: %ld\n",
-               virtio->pkt_sent,
-               virtio->pkt_recv,
-               virtio->pkt_drop);
-           rdtscll(virtio->last_recv_time);
-    }
-#endif
-
-exit:
-
-    v3_unlock_irqrestore(virtio->rx_lock, flags);
-    return ret_val;
-}
-#endif 
-
-
-
 static struct v3_device_ops dev_ops = {
     .free = virtio_free,
     .reset = NULL,
@@ -908,21 +681,6 @@ static struct v3_device_ops dev_ops = {
     .stop = NULL,
 };
 
-#if 0 //temporary hacking LX
-static struct virtio_net_state *vnic_states[2] = {NULL, NULL};
-static int num_vnic = 0;
-
-void vnic_polling(void *data){
-    struct v3_vm_info *info = (struct v3_vm_info *)data;    
-    if(vnic_states[0] != NULL && info == vnic_states[0]->virtio_dev->vm){
-       handle_pkt_tx(&(info->cores[0]), vnic_states[0]);
-    }
-
-    if(vnic_states[1] != NULL && info == vnic_states[1]->virtio_dev->vm){
-       handle_pkt_tx(&(info->cores[0]), vnic_states[1]);
-    }
-}
-#endif
 
 /* TODO: Issue here: which vm info it needs? calling VM or the device's own VM? */
 static void virtio_nic_poll(struct v3_vm_info *vm, void *data){
@@ -943,20 +701,6 @@ static void virtio_nic_poll(struct v3_vm_info *vm, void *data){
 #endif
 }
 
-#if 0 /* NAPI */
-/* tx one pkt from guest */
-static int virtio_tx_pkt(struct guest_info *core, struct virtio_net_state * virtio_state){
-
-}
-
-static void virtio_nic_poll(struct v3_vm_info *vm, void *data, int budget){
-
-
-}
-
-#endif
-
-
 static void virtio_start_tx(void *data){
     struct virtio_net_state * virtio = (struct virtio_net_state *)data;