From 832ede6a8fcb621097b20cb5e096260e7a3a1272 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20L=C3=B3pez?= Date: Wed, 9 Sep 2026 18:23:12 +0200 Subject: [PATCH] lib: sbi_fifo: add TSA annotations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add Thread Safety Analysis (TSA) annotations for the FIFO implementation. This consists of indicating which fields are protected by a spinlock and annotating functionst that must be called under a spinlock. sbi_fifo_init() must be excluded, as acquiring a spinlock before it is initialized does not make sense. Signed-off-by: Carlos López Reviewed-by: Anup Patel Link: https://lore.kernel.org/r/20260909162322.29778-5-carlos.lopezr4096@gmail.com Signed-off-by: Anup Patel --- include/sbi/sbi_fifo.h | 6 +++--- lib/sbi/sbi_fifo.c | 11 ++++++++--- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/include/sbi/sbi_fifo.h b/include/sbi/sbi_fifo.h index 89a2ea26..4ec10e05 100644 --- a/include/sbi/sbi_fifo.h +++ b/include/sbi/sbi_fifo.h @@ -15,12 +15,12 @@ #include struct sbi_fifo { - void *queue; spinlock_t qlock; + void *queue PT_GUARDED_BY(&qlock); u16 entry_size; u16 num_entries; - u16 avail; - u16 tail; + u16 avail GUARDED_BY(&qlock); + u16 tail GUARDED_BY(&qlock); }; #define SBI_FIFO_INITIALIZER(__queue_mem, __entries, __entry_size) \ diff --git a/lib/sbi/sbi_fifo.c b/lib/sbi/sbi_fifo.c index d07ebff4..88b8888d 100644 --- a/lib/sbi/sbi_fifo.c +++ b/lib/sbi/sbi_fifo.c @@ -13,7 +13,7 @@ #include void sbi_fifo_init(struct sbi_fifo *fifo, void *queue_mem, u16 entries, - u16 entry_size) + u16 entry_size) NO_THREAD_SAFETY_ANALYSIS { fifo->queue = queue_mem; fifo->num_entries = entries; @@ -25,6 +25,7 @@ void sbi_fifo_init(struct sbi_fifo *fifo, void *queue_mem, u16 entries, /* Note: must be called with fifo->qlock held */ static inline bool __sbi_fifo_is_full(struct sbi_fifo *fifo) + MUST_HOLD(&fifo->qlock) { return (fifo->avail == fifo->num_entries) ? true : false; } @@ -58,7 +59,8 @@ int sbi_fifo_is_full(struct sbi_fifo *fifo) } /* Note: must be called with fifo->qlock held */ -static inline void __sbi_fifo_enqueue(struct sbi_fifo *fifo, void *data) +static inline void __sbi_fifo_enqueue(struct sbi_fifo *fifo, void *data) + MUST_HOLD(&fifo->qlock) { u32 head; @@ -91,7 +93,8 @@ static inline void __sbi_fifo_enqueue(struct sbi_fifo *fifo, void *data) } /* Note: must be called with fifo->qlock held */ -static inline void __sbi_fifo_dequeue(struct sbi_fifo *fifo, void *data) +static inline void __sbi_fifo_dequeue(struct sbi_fifo *fifo, void *data) + MUST_HOLD(&fifo->qlock) { if (!data) goto skip_data_copy; @@ -126,6 +129,7 @@ skip_data_copy: /* Note: must be called with fifo->qlock held */ static inline bool __sbi_fifo_is_empty(struct sbi_fifo *fifo) + MUST_HOLD(&fifo->qlock) { return (fifo->avail == 0) ? true : false; } @@ -146,6 +150,7 @@ int sbi_fifo_is_empty(struct sbi_fifo *fifo) /* Note: must be called with fifo->qlock held */ static inline void __sbi_fifo_reset(struct sbi_fifo *fifo) + MUST_HOLD(&fifo->qlock) { size_t size = (size_t)fifo->num_entries * fifo->entry_size;