Hou Tao <houtao@xxxxxxxxxxxxxxx> writes: > From: Hou Tao <houtao1@xxxxxxxxxx> > > When a LPM trie is full, in-place updates of existing elements > incorrectly return -ENOSPC. > > Fix this by deferring the check of trie->n_entries. For new insertions, > n_entries must not exceed max_entries. However, in-place updates are > allowed even when the trie is full. > > Signed-off-by: Hou Tao <houtao1@xxxxxxxxxx> > --- > kernel/bpf/lpm_trie.c | 46 +++++++++++++++++++++---------------------- > 1 file changed, 23 insertions(+), 23 deletions(-) > > diff --git a/kernel/bpf/lpm_trie.c b/kernel/bpf/lpm_trie.c > index 4300bd51ec6e..ff57e35357ae 100644 > --- a/kernel/bpf/lpm_trie.c > +++ b/kernel/bpf/lpm_trie.c > @@ -310,6 +310,15 @@ static struct lpm_trie_node *lpm_trie_node_alloc(const struct lpm_trie *trie, > return node; > } > > +static int trie_check_noreplace_update(const struct lpm_trie *trie, u64 flags) I think this function name is hard to parse (took me a few tries). How about trie_check_add_entry() instead? > +{ > + if (flags == BPF_EXIST) > + return -ENOENT; > + if (trie->n_entries == trie->map.max_entries) > + return -ENOSPC; The calls to this function are always paired with a trie->n_entries++; - so how about moving that into the function after the checks? You'll have to then add a decrement if the im_node allocation fails, but I think that is still clearer than having the n_entries++ statements scattered around the function. -Toke