Module Name: src
Committed By: riastradh
Date: Fri Apr 1 00:16:40 UTC 2022
Modified Files:
src/sys/kern: subr_thmap.c
Log Message:
thmap(9): Handle memory allocation failure in root_try_put.
Reported-by: [email protected]
To generate a diff of this commit:
cvs rdiff -u -r1.10 -r1.11 src/sys/kern/subr_thmap.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/kern/subr_thmap.c
diff -u src/sys/kern/subr_thmap.c:1.10 src/sys/kern/subr_thmap.c:1.11
--- src/sys/kern/subr_thmap.c:1.10 Sun Feb 13 19:20:33 2022
+++ src/sys/kern/subr_thmap.c Fri Apr 1 00:16:40 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: subr_thmap.c,v 1.10 2022/02/13 19:20:33 riastradh Exp $ */
+/* $NetBSD: subr_thmap.c,v 1.11 2022/04/01 00:16:40 riastradh Exp $ */
/*-
* Copyright (c) 2018 Mindaugas Rasiukevicius <rmind at noxt eu>
@@ -112,7 +112,7 @@
#include "utils.h"
#endif
-THMAP_RCSID("$NetBSD: subr_thmap.c,v 1.10 2022/02/13 19:20:33 riastradh Exp $");
+THMAP_RCSID("$NetBSD: subr_thmap.c,v 1.11 2022/04/01 00:16:40 riastradh Exp $");
#include <crypto/blake2/blake2s.h>
@@ -515,7 +515,7 @@ get_leaf(const thmap_t *thmap, thmap_ino
* => Implies release operation on success.
* => Implies no ordering on failure.
*/
-static inline bool
+static inline int
root_try_put(thmap_t *thmap, const thmap_query_t *query, thmap_leaf_t *leaf)
{
thmap_ptr_t expected;
@@ -530,7 +530,7 @@ root_try_put(thmap_t *thmap, const thmap
* this changes from null.
*/
if (atomic_load_relaxed(&thmap->root[i])) {
- return false;
+ return EEXIST;
}
/*
@@ -539,13 +539,16 @@ root_try_put(thmap_t *thmap, const thmap
* release it to readers.
*/
node = node_create(thmap, NULL);
+ if (__predict_false(node == NULL)) {
+ return ENOMEM;
+ }
slot = hashval_getl0slot(thmap, query, leaf);
node_insert(node, slot, THMAP_GETOFF(thmap, leaf) | THMAP_LEAF_BIT);
nptr = THMAP_GETOFF(thmap, node);
again:
if (atomic_load_relaxed(&thmap->root[i])) {
thmap->ops->free(nptr, THMAP_INODE_LEN);
- return false;
+ return EEXIST;
}
/* Release to subsequent consume in find_edge_node(). */
expected = THMAP_NULL;
@@ -553,7 +556,7 @@ again:
nptr, memory_order_release, memory_order_relaxed)) {
goto again;
}
- return true;
+ return 0;
}
/*
@@ -703,9 +706,16 @@ retry:
/*
* Try to insert into the root first, if its slot is empty.
*/
- if (root_try_put(thmap, &query, leaf)) {
+ switch (root_try_put(thmap, &query, leaf)) {
+ case 0:
/* Success: the leaf was inserted; no locking involved. */
return val;
+ case EEXIST:
+ break;
+ case ENOMEM:
+ return NULL;
+ default:
+ __unreachable();
}
/*