Don't use __ATOMIC_ACQ_REL on older compilers

Older compilers don't always support __ATOMIC_ACQ_REL, use a lock where
they don't

Reviewed-by: Tomas Mraz <tomas@openssl.org>
Reviewed-by: Bernd Edlinger <bernd.edlinger@hotmail.de>
(Merged from https://github.com/openssl/openssl/pull/26747)
This commit is contained in:
Neil Horman 2025-02-13 15:52:16 -05:00
parent afc64c240f
commit 7d284560a0
2 changed files with 17 additions and 13 deletions

View file

@ -90,7 +90,6 @@ __tsan_mutex_post_lock((x), 0, 0)
* fallback function names.
*/
typedef void *pvoid;
typedef struct rcu_cb_item *prcu_cb_item;
# if defined(__GNUC__) && defined(__ATOMIC_ACQUIRE) && !defined(BROKEN_CLANG_ATOMICS) \
&& !defined(USE_ATOMIC_FALLBACKS)
@ -193,7 +192,6 @@ IMPL_fallback_atomic_store(pvoid)
return ret; \
}
IMPL_fallback_atomic_exchange_n(uint64_t)
IMPL_fallback_atomic_exchange_n(prcu_cb_item)
# define ATOMIC_EXCHANGE_N(t, p, v, o) fallback_atomic_exchange_n_##t(p, v)
@ -583,6 +581,10 @@ void ossl_synchronize_rcu(CRYPTO_RCU_LOCK *lock)
}
}
/*
* Note: This call assumes its made under the protection of
* ossl_rcu_write_lock
*/
int ossl_rcu_call(CRYPTO_RCU_LOCK *lock, rcu_cb_fn cb, void *data)
{
struct rcu_cb_item *new =
@ -593,13 +595,9 @@ int ossl_rcu_call(CRYPTO_RCU_LOCK *lock, rcu_cb_fn cb, void *data)
new->data = data;
new->fn = cb;
/*
* Use __ATOMIC_ACQ_REL here to indicate that any prior writes to this
* list are visible to us prior to reading, and publish the new value
* immediately
*/
new->next = ATOMIC_EXCHANGE_N(prcu_cb_item, &lock->cb_items, new,
__ATOMIC_ACQ_REL);
new->next = lock->cb_items;
lock->cb_items = new;
return 1;
}

View file

@ -365,8 +365,10 @@ void ossl_synchronize_rcu(CRYPTO_RCU_LOCK *lock)
struct rcu_cb_item *cb_items, *tmpcb;
/* before we do anything else, lets grab the cb list */
cb_items = InterlockedExchangePointer((void * volatile *)&lock->cb_items,
NULL);
ossl_crypto_mutex_lock(lock->write_lock);
cb_items = lock->cb_items;
lock->cb_items = NULL;
ossl_crypto_mutex_unlock(lock->write_lock);
qp = update_qp(lock, &curr_id);
@ -399,6 +401,9 @@ void ossl_synchronize_rcu(CRYPTO_RCU_LOCK *lock)
}
/*
* Note, must be called under the protection of ossl_rcu_write_lock
*/
int ossl_rcu_call(CRYPTO_RCU_LOCK *lock, rcu_cb_fn cb, void *data)
{
struct rcu_cb_item *new;
@ -409,8 +414,9 @@ int ossl_rcu_call(CRYPTO_RCU_LOCK *lock, rcu_cb_fn cb, void *data)
new->data = data;
new->fn = cb;
new->next = InterlockedExchangePointer((void * volatile *)&lock->cb_items,
new);
new->next = lock->cb_items;
lock->cb_items = new;
return 1;
}