Thread (5 messages) flat view 5 messages, 2 authors, 2017-09-21

Re: [PATCH net-next] bpf: Optimize lpm trie delete

From: Craig Gallek <hidden>
Date: 2017-09-21 13:13:24

On Wed, Sep 20, 2017 at 6:56 PM, Daniel Mack [off-list ref] wrote:
On 09/20/2017 08:51 PM, Craig Gallek wrote:
quoted
On Wed, Sep 20, 2017 at 12:51 PM, Daniel Mack [off-list ref] wrote:
quoted
Hi Craig,

Thanks, this looks much cleaner already :)

On 09/20/2017 06:22 PM, Craig Gallek wrote:
quoted
diff --git a/kernel/bpf/lpm_trie.c b/kernel/bpf/lpm_trie.c
index 9d58a576b2ae..b5a7d70ec8b5 100644
--- a/kernel/bpf/lpm_trie.c
+++ b/kernel/bpf/lpm_trie.c
@@ -397,7 +397,7 @@ static int trie_delete_elem(struct bpf_map *map, void *_key)
      struct lpm_trie_node __rcu **trim;
      struct lpm_trie_node *node;
      unsigned long irq_flags;
-     unsigned int next_bit;
+     unsigned int next_bit = 0;
This default assignment seems wrong, and I guess you only added it to
squelch a compiler warning?
Yes, this variable is only initialized after the lookup iterations
below (meaning it will never be initialized the the root-removal
case).
Right, and once set, it's only updated in case we don't have an exact
match and try to drill down further.
quoted
quoted
[...]
quoted
+     /* If the node has one child, we may be able to collapse the tree
+      * while removing this node if the node's child is in the same
+      * 'next bit' slot as this node was in its parent or if the node
+      * itself is the root.
+      */
+     if (trim == &trie->root) {
+             next_bit = node->child[0] ? 0 : 1;
+             rcu_assign_pointer(trie->root, node->child[next_bit]);
+             kfree_rcu(node, rcu);
I don't think you should treat this 'root' case special.

Instead, move the 'next_bit' assignment outside of the condition ...
I'm not quite sure I follow.  Are you saying do something like this:

if (trim == &trie->root) {
  next_bit = node->child[0] ? 0 : 1;
}
if (rcu_access_pointer(node->child[next_bit])) {
...

This would save a couple lines of code, but I think the as-is
implementation is slightly easier to understand.  I don't have a
strong opinion either way, though.
Me neither :)

My idea was to set

  next_bit = node->child[0] ? 0 : 1;

unconditionally, because it should result in the same in both cases.

It might be a bit of bike shedding, but I dislike this default
assignment, and I believe that not relying on next_bit to be set as a
side effect of the lookup loop makes the code a bit more readable.

WDYT?
That sounds reasonable.  I'll spin a v2 today if no one else has any comments.

Thanks again,
Craig
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help