From: Peter Dinda Date: Fri, 27 Jul 2012 18:05:58 +0000 (-0500) Subject: Corrected vnet locking with irqsave/restore X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=commitdiff_plain;h=f31b4ee024b09ded6a5be33a33cca0e2e756b63d;p=palacios.releases.git Corrected vnet locking with irqsave/restore --- diff --git a/linux_module/palacios-vnet.c b/linux_module/palacios-vnet.c index 25537aa..c1111ef 100644 --- a/linux_module/palacios-vnet.c +++ b/linux_module/palacios-vnet.c @@ -161,6 +161,8 @@ static struct vnet_host_hooks vnet_host_hooks = { .mutex_free = palacios_mutex_free, .mutex_lock = palacios_mutex_lock, .mutex_unlock = palacios_mutex_unlock, + .mutex_lock_irqsave = palacios_mutex_lock_irqsave, + .mutex_unlock_irqrestore = palacios_mutex_unlock_irqrestore, .print = palacios_print, .allocate_pages = palacios_allocate_pages, diff --git a/palacios/include/vnet/vnet_host.h b/palacios/include/vnet/vnet_host.h index 8a9f78a..5ace729 100644 --- a/palacios/include/vnet/vnet_host.h +++ b/palacios/include/vnet/vnet_host.h @@ -32,7 +32,7 @@ struct vnet_timer { }; typedef unsigned long vnet_lock_t; - +typedef void *vnet_intr_flags_t; struct vnet_host_hooks { @@ -74,6 +74,8 @@ struct vnet_host_hooks { void (*mutex_free)(void * mutex); void (*mutex_lock)(void * mutex, int must_spin); void (*mutex_unlock)(void * mutex); + vnet_intr_flags_t (*mutex_lock_irqsave)(void * mutex, int must_spin); + void (*mutex_unlock_irqrestore)(void * mutex, vnet_intr_flags_t flags); }; @@ -252,7 +254,7 @@ static inline void vnet_lock_deinit(vnet_lock_t * lock) { static inline void vnet_lock(vnet_lock_t lock) { if (host_hooks && (host_hooks->mutex_lock)) { - host_hooks->mutex_lock((void *)lock, 0); + host_hooks->mutex_lock((void *)lock,0); } } @@ -262,22 +264,22 @@ static inline void vnet_unlock(vnet_lock_t lock) { } } -static inline unsigned long vnet_lock_irqsave(vnet_lock_t lock) { - if (host_hooks && host_hooks->mutex_lock) { - host_hooks->mutex_lock((void *)lock, 1); - return 0; +static inline vnet_intr_flags_t vnet_lock_irqsave(vnet_lock_t lock) +{ + if (host_hooks && host_hooks->mutex_lock_irqsave) { + return (host_hooks->mutex_lock_irqsave((void *)lock, 1)); } else { - return -1; + return NULL; } } -static inline void vnet_unlock_irqrestore(vnet_lock_t lock, addr_t irq_state) { - if (host_hooks && (host_hooks->mutex_unlock)) { - host_hooks->mutex_unlock((void *)lock); +static inline void vnet_unlock_irqrestore(vnet_lock_t lock, vnet_intr_flags_t irq_state) +{ + if (host_hooks && (host_hooks->mutex_unlock_irqrestore)) { + host_hooks->mutex_unlock_irqrestore((void *)lock,irq_state); } } - #endif diff --git a/palacios/src/vnet/vnet_core.c b/palacios/src/vnet/vnet_core.c index d9fe902..3e4dee3 100644 --- a/palacios/src/vnet/vnet_core.c +++ b/palacios/src/vnet/vnet_core.c @@ -251,7 +251,7 @@ int v3_vnet_find_dev(uint8_t * mac) { int v3_vnet_add_route(struct v3_vnet_route route) { struct vnet_route_info * new_route = NULL; - unsigned long flags; + vnet_intr_flags_t flags; new_route = (struct vnet_route_info *)Vnet_Malloc(sizeof(struct vnet_route_info)); @@ -305,7 +305,7 @@ int v3_vnet_add_route(struct v3_vnet_route route) { void v3_vnet_del_route(uint32_t route_idx){ struct vnet_route_info * route = NULL; - unsigned long flags; + vnet_intr_flags_t flags; flags = vnet_lock_irqsave(vnet_state.lock); @@ -330,7 +330,7 @@ void v3_vnet_del_route(uint32_t route_idx){ /* delete all route entries with specfied src or dst device id */ static void inline del_routes_by_dev(int dev_id){ struct vnet_route_info * route, *tmp_route; - unsigned long flags; + vnet_intr_flags_t flags; flags = vnet_lock_irqsave(vnet_state.lock); @@ -579,7 +579,7 @@ int v3_vnet_query_header(uint8_t src_mac[6], int v3_vnet_send_pkt(struct v3_vnet_pkt * pkt, void * private_data) { struct route_list * matched_routes = NULL; - unsigned long flags; + vnet_intr_flags_t flags; int i; int cpu = V3_Get_CPU(); @@ -661,7 +661,7 @@ int v3_vnet_add_dev(struct v3_vm_info * vm, uint8_t * mac, struct v3_vnet_dev_ops * ops, int quote, int poll_state, void * priv_data){ struct vnet_dev * new_dev = NULL; - unsigned long flags; + vnet_intr_flags_t flags; new_dev = (struct vnet_dev *)Vnet_Malloc(sizeof(struct vnet_dev)); @@ -709,7 +709,7 @@ int v3_vnet_add_dev(struct v3_vm_info * vm, uint8_t * mac, int v3_vnet_del_dev(int dev_id){ struct vnet_dev * dev = NULL; - unsigned long flags; + vnet_intr_flags_t flags; flags = vnet_lock_irqsave(vnet_state.lock); @@ -762,7 +762,7 @@ int v3_vnet_add_bridge(struct v3_vm_info * vm, struct v3_vnet_bridge_ops * ops, uint8_t type, void * priv_data) { - unsigned long flags; + vnet_intr_flags_t flags; int bridge_free = 0; struct vnet_brg_dev * tmp_bridge = NULL; @@ -802,7 +802,7 @@ int v3_vnet_add_bridge(struct v3_vm_info * vm, void v3_vnet_del_bridge(uint8_t type) { - unsigned long flags; + vnet_intr_flags_t flags; struct vnet_brg_dev * tmp_bridge = NULL; flags = vnet_lock_irqsave(vnet_state.lock);