From 6c3e81c192902ea84bc9d872553e875ef41e32c2 Mon Sep 17 00:00:00 2001 From: Matthew Wilcox Date: Sat, 1 Dec 2018 10:20:35 -0500 Subject: [PATCH] maple_tree: Pass GFP flags from callers The API needs to allow the callers to specify GFP flags as some users will not be able to tolerate sleeping. There's no need for GFP flags for erase, load or destroy as those do not need to allocate memory. Signed-off-by: Matthew Wilcox --- include/linux/maple_tree.h | 9 ++++----- lib/maple_tree.c | 20 ++++++++++---------- lib/test_maple_tree.c | 4 ++-- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/include/linux/maple_tree.h b/include/linux/maple_tree.h index 3eea6082b77f..8898d1f89943 100644 --- a/include/linux/maple_tree.h +++ b/include/linux/maple_tree.h @@ -148,15 +148,14 @@ void mtree_init(struct maple_tree *mt); void *mtree_load(struct maple_tree *mt, unsigned long index); +int mtree_insert(struct maple_tree *mt, unsigned long index, void *entry, + gfp_t gfp); -int mtree_insert(struct maple_tree *mt, unsigned long index, void *entry); - -int mtree_insert_range(struct maple_tree *mt, unsigned long start, - unsigned long end, void *entry); +int mtree_insert_range(struct maple_tree *mt, unsigned long first, + unsigned long last, void *entry, gfp_t gfp); int mtree_erase(struct maple_tree *mt, unsigned long index); int mtree_destroy(struct maple_tree *mt); - #endif diff --git a/lib/maple_tree.c b/lib/maple_tree.c index 5dff567d949f..9ef8bd57d5a4 100644 --- a/lib/maple_tree.c +++ b/lib/maple_tree.c @@ -77,16 +77,15 @@ static inline bool _maple_is_node_4(struct maple_state *ms) static struct maple_node *_maple_new_node(gfp_t gfp) { struct maple_node *mn; - size_t size = sizeof(struct maple_node); - mn = kmalloc(size, gfp); - if (mn == NULL) + + mn = kzalloc(sizeof(*mn), gfp); + if (!mn) goto kmalloc_failed; mn->map64.parent = NULL; kmalloc_failed: return mn; - } static bool __maple_nomem(struct maple_state *ms, gfp_t gfp) @@ -537,10 +536,10 @@ void mtree_init(struct maple_tree *mt) EXPORT_SYMBOL(maple_init); /* Store an entry for a given range. - * Does not overwrite, returns -EEXISTS if the entry exists already + * Does not overwrite, returns -EEXIST if the entry exists already */ int mtree_insert_range(struct maple_tree *mt, unsigned long start, - unsigned long end, void *entry) + unsigned long end, void *entry, gfp_t gfp) { int ret = -EEXIST; void *walked = NULL; @@ -565,7 +564,7 @@ retry: ret = _maple_insert(&ms, entry); if (ret == -ENOMEM) { - if (__maple_nomem(&ms, GFP_KERNEL | __GFP_ZERO)) // Drops lock. + if (__maple_nomem(&ms, gfp)) goto retry; } @@ -576,11 +575,12 @@ already_exists: } /* Store an entry at an index. - * Does not overwrite, returns -EEXISTS if the entry exists already + * Does not overwrite, returns -EEXIST if the entry exists already */ -int mtree_insert(struct maple_tree *mt, unsigned long index, void *entry) +int mtree_insert(struct maple_tree *mt, unsigned long index, void *entry, + gfp_t gfp) { - return mtree_insert_range(mt, index, index, entry); + return mtree_insert_range(mt, index, index, entry, gfp); } EXPORT_SYMBOL(mtree_insert); diff --git a/lib/test_maple_tree.c b/lib/test_maple_tree.c index 178b362dc841..293f7343f5d0 100644 --- a/lib/test_maple_tree.c +++ b/lib/test_maple_tree.c @@ -34,12 +34,12 @@ void mt_dump(const struct maple_tree *mt) { } static int mtree_test_insert(struct maple_tree *mt, unsigned long index, void *ptr) { - return mtree_insert(mt, index, ptr); + return mtree_insert(mt, index, ptr, GFP_KERNEL); } static int mtree_test_insert_range(struct maple_tree *mt, unsigned long start, unsigned long end, void *ptr) { - return mtree_insert_range(mt, start, end, ptr); + return mtree_insert_range(mt, start, end, ptr, GFP_KERNEL); } static void *mtree_test_load(struct maple_tree *mt, unsigned long index) -- 2.50.1