From 7097d2e00ea9f0119a5e42f13a51487fb1e67aa3 Mon Sep 17 00:00:00 2001 From: Andrew Dinh Date: Tue, 4 Mar 2025 22:32:56 +0700 Subject: [PATCH] Fix RCU TODOs - Update allocate_new_qp_group to take unsigned int - Move id_ctr in rcu_lock_st for better stack alignment Reviewed-by: Tomas Mraz Reviewed-by: Bernd Edlinger Reviewed-by: Neil Horman (Merged from https://github.com/openssl/openssl/pull/26972) --- crypto/threads_pthread.c | 11 ++++------- crypto/threads_win.c | 11 ++++------- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/crypto/threads_pthread.c b/crypto/threads_pthread.c index 6b8fc258dc..c0598c5a61 100644 --- a/crypto/threads_pthread.c +++ b/crypto/threads_pthread.c @@ -217,13 +217,12 @@ struct rcu_lock_st { /* The context we are being created against */ OSSL_LIB_CTX *ctx; - /* rcu generation counter for in-order retirement */ - uint32_t id_ctr; - - /* TODO: can be moved before id_ctr for better alignment */ /* Array of quiescent points for synchronization */ struct rcu_qp *qp_group; + /* rcu generation counter for in-order retirement */ + uint32_t id_ctr; + /* Number of elements in qp_group array */ uint32_t group_count; @@ -422,10 +421,8 @@ static void retire_qp(CRYPTO_RCU_LOCK *lock, struct rcu_qp *qp) pthread_mutex_unlock(&lock->alloc_lock); } -/* TODO: count should be unsigned, e.g uint32_t */ -/* a negative value could result in unexpected behaviour */ static struct rcu_qp *allocate_new_qp_group(CRYPTO_RCU_LOCK *lock, - int count) + uint32_t count) { struct rcu_qp *new = OPENSSL_zalloc(sizeof(*new) * count); diff --git a/crypto/threads_win.c b/crypto/threads_win.c index 084125b4aa..72f54f118c 100644 --- a/crypto/threads_win.c +++ b/crypto/threads_win.c @@ -83,13 +83,12 @@ struct rcu_lock_st { /* The context we are being created against */ OSSL_LIB_CTX *ctx; - /* rcu generation counter for in-order retirement */ - uint32_t id_ctr; - - /* TODO: can be moved before id_ctr for better alignment */ /* Array of quiescent points for synchronization */ struct rcu_qp *qp_group; + /* rcu generation counter for in-order retirement */ + uint32_t id_ctr; + /* Number of elements in qp_group array */ uint32_t group_count; @@ -124,10 +123,8 @@ struct rcu_lock_st { CRYPTO_RWLOCK *rw_lock; }; -/* TODO: count should be unsigned, e.g uint32_t */ -/* a negative value could result in unexpected behaviour */ static struct rcu_qp *allocate_new_qp_group(struct rcu_lock_st *lock, - int count) + uint32_t count) { struct rcu_qp *new = OPENSSL_zalloc(sizeof(*new) * count);