X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fdevices%2Fdevices.h;h=d561563c295ee9a1a76c4fde124148132b2a3057;hb=2af0e3a;hp=b74e3713dfc0315b76ea19d4f992c068ea844702;hpb=26054ea1d1bad8d0d383bac59bfbe50912aee146;p=vpp.git diff --git a/src/vnet/devices/devices.h b/src/vnet/devices/devices.h index b74e3713dfc..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 @@ -73,6 +73,7 @@ typedef struct extern vnet_device_main_t vnet_device_main; extern vlib_node_registration_t device_input_node; extern const u32 device_input_next_node_advance[]; +extern const u32 device_input_next_node_flags[]; static inline void vnet_hw_interface_set_input_node (vnet_main_t * vnm, u32 hw_if_index, @@ -147,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 */