Hi, On 11/21/2024 6:53 PM, Toke Høiland-Jørgensen wrote: > 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? Better. However, "entry" is not commonly used. The commonly used noun is either "node" or "element". Will use trie_check_add_elem(). > >> +{ >> + 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. Got it. Will update it in v2. One motivation for adding n_entries only necessary is to prevent trie_mem_usage from reading an inaccurate n_entries, but consider it again I don't think it matters much. > > -Toke