virtio: add atomic call for kicking
Type: fix Signed-off-by: Mohsin Kazmi <sykazmi@cisco.com> Change-Id: I41faa2ca249ff75e564a732af896e6b5d76bf665
This commit is contained in:
Mohsin Kazmi
committed by
Beno�t Ganne
parent
0ebbbfc3c5
commit
d8b7decc1d
@ -926,11 +926,11 @@ virtio_interface_tx_split_gso_inline (vlib_main_t * vm,
|
||||
|
||||
if (n_left != n_vectors || n_buffers != n_buffers_left)
|
||||
{
|
||||
CLIB_MEMORY_STORE_BARRIER ();
|
||||
vring->avail->idx = avail;
|
||||
clib_atomic_store_seq_cst (&vring->avail->idx, avail);
|
||||
vring->desc_next = next;
|
||||
vring->desc_in_use = used;
|
||||
if ((vring->used->flags & VRING_USED_F_NO_NOTIFY) == 0)
|
||||
if ((clib_atomic_load_seq_cst (&vring->used->flags) &
|
||||
VRING_USED_F_NO_NOTIFY) == 0)
|
||||
virtio_kick (vm, vring, vif);
|
||||
}
|
||||
|
||||
@ -997,12 +997,6 @@ VNET_DEVICE_CLASS_TX_FN (virtio_device_class) (vlib_main_t * vm,
|
||||
|
||||
clib_spinlock_lock_if_init (&vring->lockp);
|
||||
|
||||
if (packed && (vring->device_event->flags != VRING_EVENT_F_DISABLE))
|
||||
virtio_kick (vm, vring, vif);
|
||||
else if ((vring->used->flags & VRING_USED_F_NO_NOTIFY) == 0 &&
|
||||
(vring->last_kick_avail_idx != vring->avail->idx))
|
||||
virtio_kick (vm, vring, vif);
|
||||
|
||||
if (vif->packet_coalesce)
|
||||
{
|
||||
n_vectors = n_left =
|
||||
|
@ -135,12 +135,11 @@ more:
|
||||
n_slots--;
|
||||
used++;
|
||||
}
|
||||
CLIB_MEMORY_STORE_BARRIER ();
|
||||
vring->avail->idx = avail;
|
||||
clib_atomic_store_seq_cst (&vring->avail->idx, avail);
|
||||
vring->desc_next = next;
|
||||
vring->desc_in_use = used;
|
||||
|
||||
if ((vring->used->flags & VRING_USED_F_NO_NOTIFY) == 0)
|
||||
if ((clib_atomic_load_seq_cst (&vring->used->flags) &
|
||||
VRING_USED_F_NO_NOTIFY) == 0)
|
||||
{
|
||||
virtio_kick (vm, vring, vif);
|
||||
}
|
||||
@ -588,9 +587,6 @@ virtio_device_input_inline (vlib_main_t * vm, vlib_node_runtime_t * node,
|
||||
|
||||
if (vif->is_packed)
|
||||
{
|
||||
if (vring->device_event->flags != VRING_EVENT_F_DISABLE)
|
||||
virtio_kick (vm, vring, vif);
|
||||
|
||||
if (vif->gso_enabled)
|
||||
rv =
|
||||
virtio_device_input_gso_inline (vm, node, frame, vif, vring, type,
|
||||
@ -609,10 +605,6 @@ virtio_device_input_inline (vlib_main_t * vm, vlib_node_runtime_t * node,
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((vring->used->flags & VRING_USED_F_NO_NOTIFY) == 0 &&
|
||||
vring->last_kick_avail_idx != vring->avail->idx)
|
||||
virtio_kick (vm, vring, vif);
|
||||
|
||||
if (vif->gso_enabled)
|
||||
rv =
|
||||
virtio_device_input_gso_inline (vm, node, frame, vif, vring, type,
|
||||
|
@ -50,6 +50,9 @@
|
||||
#define clib_atomic_load_relax_n(a) __atomic_load_n((a), __ATOMIC_RELAXED)
|
||||
#define clib_atomic_load_acq_n(a) __atomic_load_n((a), __ATOMIC_ACQUIRE)
|
||||
#define clib_atomic_store_rel_n(a, b) __atomic_store_n ((a), (b), __ATOMIC_RELEASE)
|
||||
#define clib_atomic_store_seq_cst(a, b) \
|
||||
__atomic_store_n ((a), (b), __ATOMIC_SEQ_CST)
|
||||
#define clib_atomic_load_seq_cst(a) __atomic_load_n ((a), __ATOMIC_SEQ_CST)
|
||||
|
||||
#define clib_atomic_swap_acq_n(a, b) __atomic_exchange_n ((a), (b), __ATOMIC_ACQUIRE)
|
||||
#define clib_atomic_swap_rel_n(a, b) __atomic_exchange_n ((a), (b), __ATOMIC_RELEASE)
|
||||
|
Reference in New Issue
Block a user