Coding style when using atomic_dec_and_test
I understand that atomic_dec_and_test returns 1 when the result of the operation is 0, and 0 otherwise. I've seen two ways of handling the resulting operation, below are a couple of examples: (1) if (!atomic_dec_and_test(&rd->refcount)) return; call_rcu(&rd->rcu, free_rootdomain); (2) if (atomic64_dec_and_test(&map->refcnt)) { /* bpf_map_free_id() must be called first */ ... } Is it prefered to use one option over the other? Or is it just personal preference? Thanks in advance! Camila Alvarez
On Sat, 30 Mar 2024 21:52:29 -0300, Camila Alvarez Inostroza said:
I've seen two ways of handling the resulting operation, below are a couple of examples: (1) if (!atomic_dec_and_test(&rd->refcount)) return; call_rcu(&rd->rcu, free_rootdomain);
(2) if (atomic64_dec_and_test(&map->refcnt)) { /* bpf_map_free_id() must be called first */ ... }
Is it prefered to use one option over the other? Or is it just personal preference?
Yes. :) Basically, it will depend on what the code logic structure is like. If the logical way to do it is "if it fails, return now", then you do (1). If the logical structure is "if it succeeds, do this before continuing", you do (2). In other cases, you may want to do the "structured goto" the kernel uses to unwind allocations and locks that happened before the failure. The above is not an exhaustive list.
participants (2)
-
Camila Alvarez Inostroza -
Valdis Klētnieks