Date: Tue, 09 Dec 2025 15:59:55 +0000 From: John Baldwin <jhb@FreeBSD.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Subject: git: 305f85a3d6f2 - main - rman: Embed the mutex in struct rman instead of using a separate allocation Message-ID: <6938477b.350ae.527f6dd@gitrepo.freebsd.org>
next in thread | raw e-mail | index | archive | help
The branch main has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=305f85a3d6f2ec32ee8178413a716de7c0a73eaa commit 305f85a3d6f2ec32ee8178413a716de7c0a73eaa Author: John Baldwin <jhb@FreeBSD.org> AuthorDate: 2025-12-09 15:59:30 +0000 Commit: John Baldwin <jhb@FreeBSD.org> CommitDate: 2025-12-09 15:59:30 +0000 rman: Embed the mutex in struct rman instead of using a separate allocation This used a separate allocation when rman was first imported (back when the lock was a pre-SMPng "simplelock" instead of a mutex). Reported by: des Reviewed by: des Differential Revision: https://reviews.freebsd.org/D54143 --- sys/kern/subr_rman.c | 68 +++++++++++++++++++++++++--------------------------- sys/sys/rman.h | 3 ++- 2 files changed, 34 insertions(+), 37 deletions(-) diff --git a/sys/kern/subr_rman.c b/sys/kern/subr_rman.c index b8528104ba28..e09ca10f0a2e 100644 --- a/sys/kern/subr_rman.c +++ b/sys/kern/subr_rman.c @@ -131,10 +131,7 @@ rman_init(struct rman *rm) panic("implement RMAN_GAUGE"); TAILQ_INIT(&rm->rm_list); - rm->rm_mtx = malloc(sizeof *rm->rm_mtx, M_RMAN, M_NOWAIT | M_ZERO); - if (rm->rm_mtx == NULL) - return ENOMEM; - mtx_init(rm->rm_mtx, "rman", NULL, MTX_DEF); + mtx_init(&rm->rm_mtx, "rman", NULL, MTX_DEF); mtx_lock(&rman_mtx); TAILQ_INSERT_TAIL(&rman_head, rm, rm_link); @@ -159,7 +156,7 @@ rman_manage_region(struct rman *rm, rman_res_t start, rman_res_t end) r->r_end = end; r->r_rm = rm; - mtx_lock(rm->rm_mtx); + mtx_lock(&rm->rm_mtx); /* Skip entries before us. */ TAILQ_FOREACH(s, &rm->rm_list, r_link) { @@ -216,7 +213,7 @@ rman_manage_region(struct rman *rm, rman_res_t start, rman_res_t end) } } out: - mtx_unlock(rm->rm_mtx); + mtx_unlock(&rm->rm_mtx); return rv; } @@ -235,10 +232,10 @@ rman_fini(struct rman *rm) { struct resource_i *r; - mtx_lock(rm->rm_mtx); + mtx_lock(&rm->rm_mtx); TAILQ_FOREACH(r, &rm->rm_list, r_link) { if (r->r_flags & RF_ALLOCATED) { - mtx_unlock(rm->rm_mtx); + mtx_unlock(&rm->rm_mtx); return EBUSY; } } @@ -252,12 +249,11 @@ rman_fini(struct rman *rm) TAILQ_REMOVE(&rm->rm_list, r, r_link); free(r, M_RMAN); } - mtx_unlock(rm->rm_mtx); + mtx_unlock(&rm->rm_mtx); mtx_lock(&rman_mtx); TAILQ_REMOVE(&rman_head, rm, rm_link); mtx_unlock(&rman_mtx); - mtx_destroy(rm->rm_mtx); - free(rm->rm_mtx, M_RMAN); + mtx_destroy(&rm->rm_mtx); return 0; } @@ -267,16 +263,16 @@ rman_first_free_region(struct rman *rm, rman_res_t *start, rman_res_t *end) { struct resource_i *r; - mtx_lock(rm->rm_mtx); + mtx_lock(&rm->rm_mtx); TAILQ_FOREACH(r, &rm->rm_list, r_link) { if (!(r->r_flags & RF_ALLOCATED)) { *start = r->r_start; *end = r->r_end; - mtx_unlock(rm->rm_mtx); + mtx_unlock(&rm->rm_mtx); return (0); } } - mtx_unlock(rm->rm_mtx); + mtx_unlock(&rm->rm_mtx); return (ENOENT); } @@ -285,16 +281,16 @@ rman_last_free_region(struct rman *rm, rman_res_t *start, rman_res_t *end) { struct resource_i *r; - mtx_lock(rm->rm_mtx); + mtx_lock(&rm->rm_mtx); TAILQ_FOREACH_REVERSE(r, &rm->rm_list, resource_head, r_link) { if (!(r->r_flags & RF_ALLOCATED)) { *start = r->r_start; *end = r->r_end; - mtx_unlock(rm->rm_mtx); + mtx_unlock(&rm->rm_mtx); return (0); } } - mtx_unlock(rm->rm_mtx); + mtx_unlock(&rm->rm_mtx); return (ENOENT); } @@ -323,7 +319,7 @@ rman_adjust_resource(struct resource *rr, rman_res_t start, rman_res_t end) * allocated resource. */ rm = r->r_rm; - mtx_lock(rm->rm_mtx); + mtx_lock(&rm->rm_mtx); #ifdef INVARIANTS TAILQ_FOREACH(s, &rm->rm_list, r_link) { if (s == r) @@ -345,12 +341,12 @@ rman_adjust_resource(struct resource *rr, rman_res_t start, rman_res_t end) */ if (start < r->r_start && (s == NULL || (s->r_flags & RF_ALLOCATED) || s->r_start > start)) { - mtx_unlock(rm->rm_mtx); + mtx_unlock(&rm->rm_mtx); return (EBUSY); } if (end > r->r_end && (t == NULL || (t->r_flags & RF_ALLOCATED) || t->r_end < end)) { - mtx_unlock(rm->rm_mtx); + mtx_unlock(&rm->rm_mtx); return (EBUSY); } @@ -380,7 +376,7 @@ rman_adjust_resource(struct resource *rr, rman_res_t start, rman_res_t end) } else t->r_start = end + 1; } - mtx_unlock(rm->rm_mtx); + mtx_unlock(&rm->rm_mtx); /* * Handle the shrinking cases that require allocating a new @@ -392,7 +388,7 @@ rman_adjust_resource(struct resource *rr, rman_res_t start, rman_res_t end) new->r_start = r->r_start; new->r_end = start - 1; new->r_rm = rm; - mtx_lock(rm->rm_mtx); + mtx_lock(&rm->rm_mtx); r->r_start = start; s = TAILQ_PREV(r, resource_head, r_link); if (s != NULL && !(s->r_flags & RF_ALLOCATED)) { @@ -400,14 +396,14 @@ rman_adjust_resource(struct resource *rr, rman_res_t start, rman_res_t end) free(new, M_RMAN); } else TAILQ_INSERT_BEFORE(r, new, r_link); - mtx_unlock(rm->rm_mtx); + mtx_unlock(&rm->rm_mtx); } if (end < r->r_end) { new = int_alloc_resource(M_WAITOK); new->r_start = end + 1; new->r_end = r->r_end; new->r_rm = rm; - mtx_lock(rm->rm_mtx); + mtx_lock(&rm->rm_mtx); r->r_end = end; t = TAILQ_NEXT(r, r_link); if (t != NULL && !(t->r_flags & RF_ALLOCATED)) { @@ -415,7 +411,7 @@ rman_adjust_resource(struct resource *rr, rman_res_t start, rman_res_t end) free(new, M_RMAN); } else TAILQ_INSERT_AFTER(&rm->rm_list, r, new, r_link); - mtx_unlock(rm->rm_mtx); + mtx_unlock(&rm->rm_mtx); } return (0); } @@ -441,7 +437,7 @@ rman_reserve_resource(struct rman *rm, rman_res_t start, rman_res_t end, ("invalid flags %#x", flags)); new_rflags = (flags & ~RF_FIRSTSHARE) | RF_ALLOCATED; - mtx_lock(rm->rm_mtx); + mtx_lock(&rm->rm_mtx); r = TAILQ_FIRST(&rm->rm_list); if (r == NULL) @@ -628,7 +624,7 @@ rman_reserve_resource(struct rman *rm, rman_res_t start, rman_res_t end, */ out: - mtx_unlock(rm->rm_mtx); + mtx_unlock(&rm->rm_mtx); return (rv == NULL ? NULL : &rv->r_r); } @@ -640,9 +636,9 @@ rman_activate_resource(struct resource *re) r = re->__r_i; rm = r->r_rm; - mtx_lock(rm->rm_mtx); + mtx_lock(&rm->rm_mtx); r->r_flags |= RF_ACTIVE; - mtx_unlock(rm->rm_mtx); + mtx_unlock(&rm->rm_mtx); return 0; } @@ -652,9 +648,9 @@ rman_deactivate_resource(struct resource *r) struct rman *rm; rm = r->__r_i->r_rm; - mtx_lock(rm->rm_mtx); + mtx_lock(&rm->rm_mtx); r->__r_i->r_flags &= ~RF_ACTIVE; - mtx_unlock(rm->rm_mtx); + mtx_unlock(&rm->rm_mtx); return 0; } @@ -761,9 +757,9 @@ rman_release_resource(struct resource *re) r = re->__r_i; rm = r->r_rm; - mtx_lock(rm->rm_mtx); + mtx_lock(&rm->rm_mtx); rv = int_rman_release_resource(rm, r); - mtx_unlock(rm->rm_mtx); + mtx_unlock(&rm->rm_mtx); return (rv); } @@ -991,7 +987,7 @@ sysctl_rman(SYSCTL_HANDLER_ARGS) /* * Find the indexed resource and return it. */ - mtx_lock(rm->rm_mtx); + mtx_lock(&rm->rm_mtx); TAILQ_FOREACH(res, &rm->rm_list, r_link) { if (res->r_sharehead != NULL) { LIST_FOREACH(sres, res->r_sharehead, r_sharelink) @@ -1003,7 +999,7 @@ sysctl_rman(SYSCTL_HANDLER_ARGS) else if (res_idx-- == 0) goto found; } - mtx_unlock(rm->rm_mtx); + mtx_unlock(&rm->rm_mtx); return (ENOENT); found: @@ -1028,7 +1024,7 @@ found: ures.r_size = res->r_end - res->r_start + 1; ures.r_flags = res->r_flags; - mtx_unlock(rm->rm_mtx); + mtx_unlock(&rm->rm_mtx); error = SYSCTL_OUT(req, &ures, sizeof(ures)); return (error); } diff --git a/sys/sys/rman.h b/sys/sys/rman.h index 323da4a62201..2479942c3217 100644 --- a/sys/sys/rman.h +++ b/sys/sys/rman.h @@ -35,6 +35,7 @@ #ifndef _KERNEL #include <sys/queue.h> #else +#include <sys/_mutex.h> #include <machine/_bus.h> #include <machine/resource.h> #endif @@ -112,7 +113,7 @@ TAILQ_HEAD(resource_head, resource_i); struct rman { struct resource_head rm_list; - struct mtx *rm_mtx; /* mutex used to protect rm_list */ + struct mtx rm_mtx; /* mutex used to protect rm_list */ TAILQ_ENTRY(rman) rm_link; /* link in list of all rmans */ rman_res_t rm_start; /* index of globally first entry */ rman_res_t rm_end; /* index of globally last entry */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?6938477b.350ae.527f6dd>
