X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fdevices%2Fdevices.h;h=d561563c295ee9a1a76c4fde124148132b2a3057;hb=33af8c1ed89f15cf0601ee891e9603bef16f2c93;hp=c303cb67b4093de48bb917cefef7ac537c3924f0;hpb=bd846cdc5d99260274a02e9bb474211ef32d031c;p=vpp.git diff --git a/src/vnet/devices/devices.h b/src/vnet/devices/devices.h index c303cb67b40..d561563c295 100644 --- a/src/vnet/devices/devices.h +++ b/src/vnet/devices/devices.h @@ -16,7 +16,7 @@ #ifndef included_vnet_vnet_device_h #define included_vnet_vnet_device_h -#include +#include #include typedef enum @@ -148,15 +148,20 @@ vnet_device_input_set_interrupt_pending (vnet_main_t * vnm, u32 hw_if_index, rt = vlib_node_get_runtime_data (vm, hw->input_node_index); idx = hw->dq_runtime_index_by_queue[queue_id]; dq = vec_elt_at_index (rt->devices_and_queues, idx); - dq->interrupt_pending = 1; + + clib_atomic_store_rel_n (&(dq->interrupt_pending), 1); vlib_node_set_interrupt_pending (vm, hw->input_node_index); } -#define foreach_device_and_queue(var,vec) \ - for (var = (vec); var < vec_end (vec); var++) \ - if (clib_smp_swap (&((var)->interrupt_pending), 0) || \ - var->mode == VNET_HW_INTERFACE_RX_MODE_POLLING) +/* + * Acquire RMW Access + * Paired with Release Store in vnet_device_input_set_interrupt_pending + */ +#define foreach_device_and_queue(var,vec) \ + for (var = (vec); var < vec_end (vec); var++) \ + if ((var->mode == VNET_HW_INTERFACE_RX_MODE_POLLING) \ + || clib_atomic_swap_acq_n (&((var)->interrupt_pending), 0)) #endif /* included_vnet_vnet_device_h */