lib: sbi_domain: add TSA annotations

Add Thread Safety Analysis (TSA) annotations for the domain handling
code. This includes indicating which fields are protected by a spinlock,
and annotating which functions acquire a spinlock, in order to prevent
nesting. Exclude sbi_domain_register() from analysis, as it initializes
a domain's spinlock.

Signed-off-by: Carlos López <carlos.lopezr4096@gmail.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
Link: https://lore.kernel.org/r/20260909162322.29778-11-carlos.lopezr4096@gmail.com
Signed-off-by: Anup Patel <anup@brainfault.org>
This commit is contained in:
Carlos López
2026-09-16 09:48:30 +05:30
committed by Anup Patel
parent 1ba332872b
commit 8740e0a38c
3 changed files with 11 additions and 4 deletions
+6 -4
View File
@@ -193,10 +193,10 @@ struct sbi_domain {
struct sbi_domain_state_priv state_priv; struct sbi_domain_state_priv state_priv;
/** Logical index of this domain */ /** Logical index of this domain */
u32 index; u32 index;
/** HARTs assigned to this domain */
struct sbi_hartmask assigned_harts;
/** Spinlock for accessing assigned_harts */ /** Spinlock for accessing assigned_harts */
spinlock_t assigned_harts_lock; spinlock_t assigned_harts_lock;
/** HARTs assigned to this domain */
struct sbi_hartmask assigned_harts GUARDED_BY(&assigned_harts_lock);
/** Name of this domain */ /** Name of this domain */
char name[64]; char name[64];
/** Initialization order of this domain */ /** Initialization order of this domain */
@@ -254,7 +254,8 @@ extern struct sbi_dlist domain_list;
* @param hartindex the HART index * @param hartindex the HART index
* @return true if HART is assigned to domain otherwise false * @return true if HART is assigned to domain otherwise false
*/ */
bool sbi_domain_is_assigned_hart(const struct sbi_domain *dom, u32 hartindex); bool sbi_domain_is_assigned_hart(const struct sbi_domain *dom, u32 hartindex)
MUST_NOT_HOLD(&dom->assigned_harts_lock);
/** /**
* Get the assigned HART mask for given domain * Get the assigned HART mask for given domain
@@ -263,7 +264,8 @@ bool sbi_domain_is_assigned_hart(const struct sbi_domain *dom, u32 hartindex);
* @return 0 on success and SBI_Exxx (< 0) on failure * @return 0 on success and SBI_Exxx (< 0) on failure
*/ */
int sbi_domain_get_assigned_hartmask(const struct sbi_domain *dom, int sbi_domain_get_assigned_hartmask(const struct sbi_domain *dom,
struct sbi_hartmask *mask); struct sbi_hartmask *mask)
MUST_NOT_HOLD(&dom->assigned_harts_lock);
/** /**
* Initialize a domain memory region based on it's physical * Initialize a domain memory region based on it's physical
+3
View File
@@ -61,6 +61,7 @@ void sbi_update_hartindex_to_domain(u32 hartindex, struct sbi_domain *dom)
} }
bool sbi_domain_is_assigned_hart(const struct sbi_domain *dom, u32 hartindex) bool sbi_domain_is_assigned_hart(const struct sbi_domain *dom, u32 hartindex)
MUST_NOT_HOLD(&dom->assigned_harts_lock)
{ {
bool ret; bool ret;
struct sbi_domain *tdom = (struct sbi_domain *)dom; struct sbi_domain *tdom = (struct sbi_domain *)dom;
@@ -77,6 +78,7 @@ bool sbi_domain_is_assigned_hart(const struct sbi_domain *dom, u32 hartindex)
int sbi_domain_get_assigned_hartmask(const struct sbi_domain *dom, int sbi_domain_get_assigned_hartmask(const struct sbi_domain *dom,
struct sbi_hartmask *mask) struct sbi_hartmask *mask)
MUST_NOT_HOLD(&dom->assigned_harts_lock)
{ {
ulong ret = 0; ulong ret = 0;
struct sbi_domain *tdom = (struct sbi_domain *)dom; struct sbi_domain *tdom = (struct sbi_domain *)dom;
@@ -630,6 +632,7 @@ void sbi_domain_dump_all(const char *suffix)
} }
int sbi_domain_register(struct sbi_domain *dom) int sbi_domain_register(struct sbi_domain *dom)
NO_THREAD_SAFETY_ANALYSIS
{ {
u32 i, cold_hartid = current_hartid(); u32 i, cold_hartid = current_hartid();
struct sbi_domain *tdom; struct sbi_domain *tdom;
+2
View File
@@ -107,6 +107,8 @@ static void hart_context_set(struct sbi_domain *dom, u32 hartindex,
*/ */
static int switch_to_next_domain_context(struct hart_context *ctx, static int switch_to_next_domain_context(struct hart_context *ctx,
struct hart_context *dom_ctx) struct hart_context *dom_ctx)
MUST_NOT_HOLD(&ctx->dom->assigned_harts_lock)
MUST_NOT_HOLD(&dom_ctx->dom->assigned_harts_lock)
{ {
u32 hartindex = current_hartindex(); u32 hartindex = current_hartindex();
struct sbi_trap_context *trap_ctx; struct sbi_trap_context *trap_ctx;