Change-Id: Iff14ed6ffd822eb2286aac6af467d9c8660e3d81
Signed-off-by: Dave Barach <dave@barachs.net>
/* Next handle interrupts. */
{
/* Next handle interrupts. */
{
+ /* unlocked read, for performance */
uword l = _vec_len (nm->pending_interrupt_node_runtime_indices);
uword i;
uword l = _vec_len (nm->pending_interrupt_node_runtime_indices);
uword i;
+ if (PREDICT_FALSE (l > 0))
{
u32 *tmp;
if (!is_main)
{
u32 *tmp;
if (!is_main)
- clib_spinlock_lock (&nm->pending_interrupt_lock);
+ {
+ clib_spinlock_lock (&nm->pending_interrupt_lock);
+ /* Re-read w/ lock held, in case another thread added an item */
+ l = _vec_len (nm->pending_interrupt_node_runtime_indices);
+ }
+
tmp = nm->pending_interrupt_node_runtime_indices;
nm->pending_interrupt_node_runtime_indices =
last_node_runtime_indices;
tmp = nm->pending_interrupt_node_runtime_indices;
nm->pending_interrupt_node_runtime_indices =
last_node_runtime_indices;