Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 9 Aug 2023 07:28:39 GMT
From:      Doug Moore <dougm@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 15047a65099f - main - rangesets: use PCTRIE_DEFINE
Message-ID:  <202308090728.3797SdPd023953@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by dougm:

URL: https://cgit.FreeBSD.org/src/commit/?id=15047a65099f3d26b1d3ced5037dd950e4a6fc46

commit 15047a65099f3d26b1d3ced5037dd950e4a6fc46
Author:     Doug Moore <dougm@FreeBSD.org>
AuthorDate: 2023-08-09 07:26:25 +0000
Commit:     Doug Moore <dougm@FreeBSD.org>
CommitDate: 2023-08-09 07:26:25 +0000

    rangesets: use PCTRIE_DEFINE
    
    subr_rangeset.c is the only source file that calls functions like
    pctrie_insert and pctrie_remove directly; other users of pctries use
    the PCTRIE_DEFINE macro to define interfaces to pctrie that let them
    ignore issues of offsets within structs and uint64_t return values.
    
    Change subr_rangeset.c to use PCTRIE_DEFINE too. And change pctrie.h
    to mark the lookup function as unused, to avoid warnings when
    compiling files, like subr_rangeset.c, that don't invoke lookup().
    
    Reviewed by:    kib
    Differential Revision:  https://reviews.freebsd.org/D41391
---
 sys/kern/subr_rangeset.c | 72 +++++++++++++++++++-----------------------------
 sys/sys/pctrie.h         |  2 +-
 2 files changed, 29 insertions(+), 45 deletions(-)

diff --git a/sys/kern/subr_rangeset.c b/sys/kern/subr_rangeset.c
index c8af58c6f84f..a27126ab127b 100644
--- a/sys/kern/subr_rangeset.c
+++ b/sys/kern/subr_rangeset.c
@@ -72,6 +72,8 @@ rs_node_free(struct pctrie *ptree __unused, void *node)
 	uma_zfree(rs_node_zone, node);
 }
 
+PCTRIE_DEFINE(RANGESET, rs_el, re_start, rs_node_alloc, rs_node_free);
+
 void
 rangeset_init(struct rangeset *rs, rs_dup_data_t dup_data,
     rs_free_data_t free_data, void *data_ctx, u_int alloc_flags)
@@ -96,16 +98,10 @@ bool
 rangeset_check_empty(struct rangeset *rs, uint64_t start, uint64_t end)
 {
 	struct rs_el *r;
-	uint64_t *r1;
 
 	rangeset_check(rs);
-	r1 = pctrie_lookup_le(&rs->rs_trie, end);
-	if (r1 != NULL) {
-		r = __containerof(r1, struct rs_el, re_start);
-		if (r->re_end > start)
-			return (false);
-	}
-	return (true);
+	r = RANGESET_PCTRIE_LOOKUP_LE(&rs->rs_trie, end);
+	return (r == NULL || r->re_end <= start);
 }
 
 int
@@ -122,7 +118,7 @@ rangeset_insert(struct rangeset *rs, uint64_t start, uint64_t end,
 	r = data;
 	r->re_start = start;
 	r->re_end = end;
-	error = pctrie_insert(&rs->rs_trie, &r->re_start, rs_node_alloc);
+	error = RANGESET_PCTRIE_INSERT(&rs->rs_trie, r);
 	rangeset_check(rs);
 	return (error);
 }
@@ -132,16 +128,14 @@ rangeset_remove_pred(struct rangeset *rs, uint64_t start, uint64_t end,
     rs_pred_t pred)
 {
 	struct rs_el *r, *rn;
-	uint64_t *r1;
 	int error;
 
 	rangeset_check(rs);
 	error = 0;
 	for (; end > 0 && start < end;) {
-		r1 = pctrie_lookup_le(&rs->rs_trie, end - 1);
-		if (r1 == NULL)
+		r = RANGESET_PCTRIE_LOOKUP_LE(&rs->rs_trie, end - 1);
+		if (r == NULL)
 			break;
-		r = __containerof(r1, struct rs_el, re_start);
 
 		/*
 		 * ------============================--|-------|----
@@ -167,8 +161,8 @@ rangeset_remove_pred(struct rangeset *rs, uint64_t start, uint64_t end,
 			 */
 			end = r->re_start;
 			if (pred(rs->rs_data_ctx, r)) {
-				pctrie_remove(&rs->rs_trie, r->re_start,
-				    rs_node_free);
+				RANGESET_PCTRIE_REMOVE(&rs->rs_trie,
+				    r->re_start);
 				rs->rs_free_data(rs->rs_data_ctx, r);
 			}
 			continue;
@@ -180,11 +174,10 @@ rangeset_remove_pred(struct rangeset *rs, uint64_t start, uint64_t end,
 		 */
 		if (r->re_start >= start) {
 			if (pred(rs->rs_data_ctx, r)) {
-				pctrie_remove(&rs->rs_trie, r->re_start,
-				    rs_node_free);
+				RANGESET_PCTRIE_REMOVE(&rs->rs_trie,
+				    r->re_start);
 				r->re_start = end;
-				error = pctrie_insert(&rs->rs_trie,
-				    &r->re_start, rs_node_alloc);
+				error = RANGESET_PCTRIE_INSERT(&rs->rs_trie, r);
 				/*
 				 * The insert above must succeed
 				 * because rs_node zone is marked
@@ -215,8 +208,7 @@ rangeset_remove_pred(struct rangeset *rs, uint64_t start, uint64_t end,
 			}
 			rn->re_start = end;
 			rn->re_end = r->re_end;
-			error = pctrie_insert(&rs->rs_trie, &rn->re_start,
-			    rs_node_alloc);
+			error = RANGESET_PCTRIE_INSERT(&rs->rs_trie, rn);
 			if (error != 0) {
 				rs->rs_free_data(rs->rs_data_ctx, rn);
 				break;
@@ -247,14 +239,12 @@ void
 rangeset_remove_all(struct rangeset *rs)
 {
 	struct rs_el *r;
-	uint64_t *r1;
 
 	for (;;) {
-		r1 = pctrie_lookup_ge(&rs->rs_trie, 0);
-		if (r1 == NULL)
+		r = RANGESET_PCTRIE_LOOKUP_GE(&rs->rs_trie, 0);
+		if (r == NULL)
 			break;
-		r = __containerof(r1, struct rs_el, re_start);
-		pctrie_remove(&rs->rs_trie, r->re_start, rs_node_free);
+		RANGESET_PCTRIE_REMOVE(&rs->rs_trie, r->re_start);
 		rs->rs_free_data(rs->rs_data_ctx, r);
 	}
 }
@@ -263,13 +253,11 @@ void *
 rangeset_lookup(struct rangeset *rs, uint64_t place)
 {
 	struct rs_el *r;
-	uint64_t *r1;
 
 	rangeset_check(rs);
-	r1 = pctrie_lookup_le(&rs->rs_trie, place);
-	if (r1 == NULL)
+	r = RANGESET_PCTRIE_LOOKUP_LE(&rs->rs_trie, place);
+	if (r == NULL)
 		return (NULL);
-	r = __containerof(r1, struct rs_el, re_start);
 	if (r->re_end <= place)
 		return (NULL);
 	return (r);
@@ -279,7 +267,7 @@ int
 rangeset_copy(struct rangeset *dst_rs, struct rangeset *src_rs)
 {
 	struct rs_el *src_r, *dst_r;
-	uint64_t cursor, *r1;
+	uint64_t cursor;
 	int error;
 
 	MPASS(pctrie_is_empty(&dst_rs->rs_trie));
@@ -288,17 +276,15 @@ rangeset_copy(struct rangeset *dst_rs, struct rangeset *src_rs)
 
 	error = 0;
 	for (cursor = 0;; cursor = src_r->re_start + 1) {
-		r1 = pctrie_lookup_ge(&src_rs->rs_trie, cursor);
-		if (r1 == NULL)
+		src_r = RANGESET_PCTRIE_LOOKUP_GE(&src_rs->rs_trie, cursor);
+		if (src_r == NULL)
 			break;
-		src_r = __containerof(r1, struct rs_el, re_start);
 		dst_r = dst_rs->rs_dup_data(dst_rs->rs_data_ctx, src_r);
 		if (dst_r == NULL) {
 			error = ENOMEM;
 			break;
 		}
-		error = pctrie_insert(&dst_rs->rs_trie, &dst_r->re_start,
-		    rs_node_alloc);
+		error = RANGESET_PCTRIE_INSERT(&dst_rs->rs_trie, dst_r);
 		if (error != 0)
 			break;
 	}
@@ -312,13 +298,12 @@ static void
 rangeset_check(struct rangeset *rs)
 {
 	struct rs_el *r, *rp;
-	uint64_t cursor, *r1;
+	uint64_t cursor;
 
 	for (cursor = 0, rp = NULL;; cursor = r->re_start + 1, rp = r) {
-		r1 = pctrie_lookup_ge(&rs->rs_trie, cursor);
-		if (r1 == NULL)
+		r = RANGESET_PCTRIE_LOOKUP_GE(&rs->rs_trie, cursor);
+		if (r == NULL)
 			break;
-		r = __containerof(r1, struct rs_el, re_start);
 		KASSERT(r->re_start < r->re_end,
 		    ("invalid interval rs %p elem %p (%#jx, %#jx)",
 		    rs, r, (uintmax_t)r->re_start,  (uintmax_t)r->re_end));
@@ -343,7 +328,7 @@ DB_SHOW_COMMAND(rangeset, rangeset_show_fn)
 {
 	struct rangeset *rs;
 	struct rs_el *r;
-	uint64_t cursor, *r1;
+	uint64_t cursor;
 
 	if (!have_addr) {
 		db_printf("show rangeset addr\n");
@@ -353,10 +338,9 @@ DB_SHOW_COMMAND(rangeset, rangeset_show_fn)
 	rs = (struct rangeset *)addr;
 	db_printf("rangeset %p\n", rs);
 	for (cursor = 0;; cursor = r->re_start + 1) {
-		r1 = pctrie_lookup_ge(&rs->rs_trie, cursor);
-		if (r1 == NULL)
+		r = RANGESET_PCTRIE_LOOKUP_GE(&rs->rs_trie, cursor);
+		if (r == NULL)
 			break;
-		r = __containerof(r1, struct rs_el, re_start);
 		db_printf("  el %p start %#jx end %#jx\n",
 		    r, r->re_start, r->re_end);
 	}
diff --git a/sys/sys/pctrie.h b/sys/sys/pctrie.h
index 687236cdd872..62af29d3f754 100644
--- a/sys/sys/pctrie.h
+++ b/sys/sys/pctrie.h
@@ -83,7 +83,7 @@ name##_PCTRIE_INSERT(struct pctrie *ptree, struct type *ptr)		\
 	    allocfn);							\
 }									\
 									\
-static __inline struct type *						\
+static __inline __unused struct type *						\
 name##_PCTRIE_LOOKUP(struct pctrie *ptree, uint64_t key)		\
 {									\
 									\



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202308090728.3797SdPd023953>