struct palacios_console * cons = (struct palacios_console *) console;
cons->open = 0;
+
+ remove_guest_ctrl(cons->guest, V3_VM_CONSOLE_CONNECT);
+ deinit_queue(cons->queue);
+
+ kfree(cons);
}
spin_lock_init(&(queue->lock));
}
+void deinit_queue(struct gen_queue * queue) {
+ while (dequeue(queue)) {
+ ERROR("Freeing non-empty queue. PROBABLE MEMORY LEAK DETECTED\n");
+ }
+}
+
struct gen_queue * create_queue(unsigned int max_entries) {
struct gen_queue * tmp_queue = palacios_alloc(sizeof(struct gen_queue));
if (!tmp_queue) {
#define __PALACIOS_QUEUE_H__
+#include "palacios.h"
#include <linux/list.h>
#include <linux/spinlock.h>
+
struct queue_entry {
void * entry;
struct list_head node;
struct gen_queue * create_queue(unsigned int max_entries);
void init_queue(struct gen_queue * queue, unsigned int max_entries);
+void deinit_queue(struct gen_queue * queue);
+
int enqueue(struct gen_queue * queue, void * entry);
void * dequeue(struct gen_queue * queue);
}
+
+
static struct vm_ctrl * get_ctrl(struct v3_guest * guest, unsigned int cmd) {
struct rb_node * n = guest->vm_ctrls.rb_node;
struct vm_ctrl * ctrl = NULL;
return NULL;
}
+int remove_guest_ctrl(struct v3_guest * guest, unsigned int cmd) {
+ struct vm_ctrl * ctrl = get_ctrl(guest, cmd);
+
+ if (ctrl == NULL) {
+ INFO("Could not find control (%d) to remove\n", cmd);
+ return -1;
+ }
+
+ rb_erase(&(ctrl->tree_node), &(guest->vm_ctrls));
+
+ kfree(ctrl);
+
+ return 0;
+}
+
+static void free_guest_ctrls(struct v3_guest * guest) {
+ struct rb_node * node = rb_first(&(guest->vm_ctrls));
+ struct vm_ctrl * ctrl = NULL;
+ struct rb_node * tmp_node = NULL;
+
+ while (node) {
+ ctrl = rb_entry(node, struct vm_ctrl, tree_node);
+ tmp_node = node;
+ node = rb_next(node);
+
+ WARNING("Cleaning up guest ctrl that was not removed explicitly (%d)\n", ctrl->cmd);
+
+ kfree(ctrl);
+ }
+}
cdev_del(&(guest->cdev));
+ free_guest_ctrls(guest);
+
+
vfree(guest->img);
palacios_free(guest);
void * priv_data),
void * priv_data);
+int remove_guest_ctrl(struct v3_guest * guest, unsigned int cmd);
+
#endif
struct v3_queue * v3_create_queue();
void v3_init_queue(struct v3_queue * queue);
+void v3_deinit_queue(struct v3_queue * queue);
void v3_enqueue(struct v3_queue * queue, addr_t entry);
addr_t v3_dequeue(struct v3_queue * queue);
void v3_bitmap_deinit(struct v3_bitmap * bitmap) {
+ v3_lock_deinit(&(bitmap->lock));
V3_Free(bitmap->bits);
}
#include <palacios/vmm_queue.h>
+
+
+
void v3_init_queue(struct v3_queue * queue) {
queue->num_entries = 0;
INIT_LIST_HEAD(&(queue->entries));
return tmp_queue;
}
+void v3_deinit_queue(struct v3_queue * queue) {
+ while (v3_dequeue(queue)) {
+ PrintError("ERROR: Freeing non-empty queue. PROBABLE MEMORY LEAK DETECTED\n");
+ }
+
+ v3_lock_deinit(&(queue->lock));
+}
+
+
+
+
void v3_enqueue(struct v3_queue * queue, addr_t entry) {
struct v3_queue_entry * q_entry = V3_Malloc(sizeof(struct v3_queue_entry));
unsigned int flags = 0;
}
-void v3_deinit_vnet(){
+void v3_deinit_vnet() {
+
+ v3_deinit_queue(vnet_state.poll_devs);
+ Vnet_Free(vnet_state.poll_devs);
PrintDebug("Stopping flush thread\n");
// This will pause until the flush thread is gone