Commit 37a8ab24 authored by Liam R. Howlett's avatar Liam R. Howlett Committed by Andrew Morton

maple_tree: remove unnecessary default labels from switch statements

Patch series "maple_tree: iterator state changes".

These patches have some general cleanup and a change to separate the maple
state status tracking from the maple state node.

The maple state status change allows for walks to continue from previous
places when the status needs to be recorded to make logical sense for the
next call to the maple state.  For instance, it allows for prev/next to
function in a way that better resembles the linked list.  It also allows
switch statements to be used to detect missed states during compile, and
the addition of fast-path "active" state is cleaner as an enum.

While making the status change, perf showed some very small (one line)
functions that were not inlined even with the inline key word.  Making
these small functions __always_inline is less expensive according to perf.
As part of that change, some inlines have been dropped from larger
functions.

Perf also showed that the commonly used mas_for_each() iterator was
spending a lot of time finding the end of the node.  This series
introduces caching of the end of the node in the maple state (and updating
it during writes).  This caching along with the inline changes yielded at
23.25% improvement on the BENCH_MAS_FOR_EACH maple tree test framework
benchmark.

I've also included a change to mtree_range_walk and mtree_lookup_walk to
take advantage of Peng's change [1] to the initial pivot setup.

mmtests did not produce any significant gains.

[1] https://lore.kernel.org/all/20230711035444.526-1-zhangpeng.00@bytedance.com/T/#u


This patch (of 12):

Removing the default types from the switch statements will cause compile
warnings on missing cases.

Link: https://lkml.kernel.org/r/20231101171629.3612299-2-Liam.Howlett@oracle.comSigned-off-by: default avatarLiam R. Howlett <Liam.Howlett@oracle.com>
Suggested-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent 5d4c6ac9
...@@ -771,7 +771,6 @@ static inline void mte_set_pivot(struct maple_enode *mn, unsigned char piv, ...@@ -771,7 +771,6 @@ static inline void mte_set_pivot(struct maple_enode *mn, unsigned char piv,
BUG_ON(piv >= mt_pivots[type]); BUG_ON(piv >= mt_pivots[type]);
switch (type) { switch (type) {
default:
case maple_range_64: case maple_range_64:
case maple_leaf_64: case maple_leaf_64:
node->mr64.pivot[piv] = val; node->mr64.pivot[piv] = val;
...@@ -795,7 +794,6 @@ static inline void mte_set_pivot(struct maple_enode *mn, unsigned char piv, ...@@ -795,7 +794,6 @@ static inline void mte_set_pivot(struct maple_enode *mn, unsigned char piv,
static inline void __rcu **ma_slots(struct maple_node *mn, enum maple_type mt) static inline void __rcu **ma_slots(struct maple_node *mn, enum maple_type mt)
{ {
switch (mt) { switch (mt) {
default:
case maple_arange_64: case maple_arange_64:
return mn->ma64.slot; return mn->ma64.slot;
case maple_range_64: case maple_range_64:
...@@ -804,6 +802,8 @@ static inline void __rcu **ma_slots(struct maple_node *mn, enum maple_type mt) ...@@ -804,6 +802,8 @@ static inline void __rcu **ma_slots(struct maple_node *mn, enum maple_type mt)
case maple_dense: case maple_dense:
return mn->slot; return mn->slot;
} }
return NULL;
} }
static inline bool mt_write_locked(const struct maple_tree *mt) static inline bool mt_write_locked(const struct maple_tree *mt)
...@@ -7002,7 +7002,6 @@ static void mt_dump_range(unsigned long min, unsigned long max, ...@@ -7002,7 +7002,6 @@ static void mt_dump_range(unsigned long min, unsigned long max,
else else
pr_info("%.*s%lx-%lx: ", depth * 2, spaces, min, max); pr_info("%.*s%lx-%lx: ", depth * 2, spaces, min, max);
break; break;
default:
case mt_dump_dec: case mt_dump_dec:
if (min == max) if (min == max)
pr_info("%.*s%lu: ", depth * 2, spaces, min); pr_info("%.*s%lu: ", depth * 2, spaces, min);
...@@ -7042,7 +7041,6 @@ static void mt_dump_range64(const struct maple_tree *mt, void *entry, ...@@ -7042,7 +7041,6 @@ static void mt_dump_range64(const struct maple_tree *mt, void *entry,
case mt_dump_hex: case mt_dump_hex:
pr_cont("%p %lX ", node->slot[i], node->pivot[i]); pr_cont("%p %lX ", node->slot[i], node->pivot[i]);
break; break;
default:
case mt_dump_dec: case mt_dump_dec:
pr_cont("%p %lu ", node->slot[i], node->pivot[i]); pr_cont("%p %lu ", node->slot[i], node->pivot[i]);
} }
...@@ -7072,7 +7070,6 @@ static void mt_dump_range64(const struct maple_tree *mt, void *entry, ...@@ -7072,7 +7070,6 @@ static void mt_dump_range64(const struct maple_tree *mt, void *entry,
pr_err("node %p last (%lx) > max (%lx) at pivot %d!\n", pr_err("node %p last (%lx) > max (%lx) at pivot %d!\n",
node, last, max, i); node, last, max, i);
break; break;
default:
case mt_dump_dec: case mt_dump_dec:
pr_err("node %p last (%lu) > max (%lu) at pivot %d!\n", pr_err("node %p last (%lu) > max (%lu) at pivot %d!\n",
node, last, max, i); node, last, max, i);
...@@ -7097,7 +7094,6 @@ static void mt_dump_arange64(const struct maple_tree *mt, void *entry, ...@@ -7097,7 +7094,6 @@ static void mt_dump_arange64(const struct maple_tree *mt, void *entry,
case mt_dump_hex: case mt_dump_hex:
pr_cont("%lx ", node->gap[i]); pr_cont("%lx ", node->gap[i]);
break; break;
default:
case mt_dump_dec: case mt_dump_dec:
pr_cont("%lu ", node->gap[i]); pr_cont("%lu ", node->gap[i]);
} }
...@@ -7108,7 +7104,6 @@ static void mt_dump_arange64(const struct maple_tree *mt, void *entry, ...@@ -7108,7 +7104,6 @@ static void mt_dump_arange64(const struct maple_tree *mt, void *entry,
case mt_dump_hex: case mt_dump_hex:
pr_cont("%p %lX ", node->slot[i], node->pivot[i]); pr_cont("%p %lX ", node->slot[i], node->pivot[i]);
break; break;
default:
case mt_dump_dec: case mt_dump_dec:
pr_cont("%p %lu ", node->slot[i], node->pivot[i]); pr_cont("%p %lu ", node->slot[i], node->pivot[i]);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment