X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fmfib%2Fmfib_signal.c;h=176e8ec9114add15b5927fa6a5bf14324ab56952;hb=775f73c;hp=9f6205de4199fec33e745f1d572d84f8abbd5201;hpb=32e1c010b0c34fd0984f7fc45fae648a182025c5;p=vpp.git diff --git a/src/vnet/mfib/mfib_signal.c b/src/vnet/mfib/mfib_signal.c index 9f6205de419..176e8ec9114 100644 --- a/src/vnet/mfib/mfib_signal.c +++ b/src/vnet/mfib/mfib_signal.c @@ -68,8 +68,30 @@ mfib_signal_module_init (void) mfib_signal_list_init(); } +static inline void +mfib_signal_lock_aquire (void) +{ + while (clib_atomic_test_and_set (&mfib_signal_pending.mip_lock)) + ; +} + +static inline void +mfib_signal_lock_release (void) +{ + clib_atomic_release(&mfib_signal_pending.mip_lock); +} + +#define MFIB_SIGNAL_CRITICAL_SECTION(_body) \ +{ \ + mfib_signal_lock_aquire(); \ + do { \ + _body; \ + } while (0); \ + mfib_signal_lock_release(); \ +} + int -mfib_signal_send_one (struct _unix_shared_memory_queue *q, +mfib_signal_send_one (struct vl_api_registration_ *reg, u32 context) { u32 li, si; @@ -77,13 +99,11 @@ mfib_signal_send_one (struct _unix_shared_memory_queue *q, /* * with the lock held, pop a signal from the q. */ - while (__sync_lock_test_and_set (&mfib_signal_pending.mip_lock, 1)) - ; - { + MFIB_SIGNAL_CRITICAL_SECTION( + ({ li = clib_dlist_remove_head(mfib_signal_dlist_pool, mfib_signal_pending.mip_head); - } - mfib_signal_pending.mip_lock = 0; + })); if (~0 != li) { @@ -97,22 +117,20 @@ mfib_signal_send_one (struct _unix_shared_memory_queue *q, mfs = pool_elt_at_index(mfib_signal_pool, si); mfi = mfib_itf_get(mfs->mfs_itf); mfi->mfi_si = INDEX_INVALID; - __sync_fetch_and_and(&mfi->mfi_flags, - ~MFIB_ITF_FLAG_SIGNAL_PRESENT); + clib_atomic_fetch_and(&mfi->mfi_flags, + ~MFIB_ITF_FLAG_SIGNAL_PRESENT); - vl_mfib_signal_send_one(q, context, mfs); + vl_mfib_signal_send_one(reg, context, mfs); /* * with the lock held, return the resoruces of the signals posted */ - while (__sync_lock_test_and_set(&mfib_signal_pending.mip_lock, 1)) - ; - { + MFIB_SIGNAL_CRITICAL_SECTION( + ({ pool_put_index(mfib_signal_pool, si); pool_put_index(mfib_signal_dlist_pool, li); - } - mfib_signal_pending.mip_lock = 0; + })); return (1); } @@ -128,9 +146,8 @@ mfib_signal_push (const mfib_entry_t *mfe, dlist_elt_t *elt; u32 si, li; - while (__sync_lock_test_and_set (&mfib_signal_pending.mip_lock, 1)) - ; - { + MFIB_SIGNAL_CRITICAL_SECTION( + ({ pool_get(mfib_signal_pool, mfs); pool_get(mfib_signal_dlist_pool, elt); @@ -143,8 +160,7 @@ mfib_signal_push (const mfib_entry_t *mfe, clib_dlist_addhead(mfib_signal_dlist_pool, mfib_signal_pending.mip_head, li); - } - mfib_signal_pending.mip_lock = 0; + })); mfs->mfs_entry = mfib_entry_get_index(mfe); mfs->mfs_itf = mfib_itf_get_index(mfi); @@ -179,9 +195,8 @@ mfib_signal_remove_itf (const mfib_itf_t *mfi) /* * it's in the pending q */ - while (__sync_lock_test_and_set (&mfib_signal_pending.mip_lock, 1)) - ; - { + MFIB_SIGNAL_CRITICAL_SECTION( + ({ dlist_elt_t *elt; /* @@ -194,8 +209,6 @@ mfib_signal_remove_itf (const mfib_itf_t *mfi) elt = pool_elt_at_index(mfib_signal_dlist_pool, li); pool_put_index(mfib_signal_pool, elt->value); pool_put(mfib_signal_dlist_pool, elt); - } - - mfib_signal_pending.mip_lock = 0; + })); } }