unit_alloc(), unit_free() and unit_free_rcu() are notrace so that BPF
programs cannot attach to them and corrupt the per-CPU free lists, as
the comment above unit_alloc() says. To take and release c->active and
to update the free lists, they call local_inc_return()
(local_add_return() on x86), local_dec(), __llist_add() and
llist_add(). These are plain inline functions, as are
__llist_add_batch() and llist_add_batch(), which the llist helpers call.
An out-of-line copy of any of them is untraced only because inline
implies notrace.

Mark them notrace explicitly. No functional change.

Assisted-by: Claude:claude-opus-5
Signed-off-by: Song Liu <[email protected]>
---
 arch/x86/include/asm/local.h |  4 ++--
 include/linux/llist.h        | 16 ++++++++--------
 2 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/arch/x86/include/asm/local.h b/arch/x86/include/asm/local.h
index 1749c4481000..66f2cd57160c 100644
--- a/arch/x86/include/asm/local.h
+++ b/arch/x86/include/asm/local.h
@@ -22,7 +22,7 @@ static inline void notrace local_inc(local_t *l)
                     : "+m" (l->a.counter));
 }
 
-static inline void local_dec(local_t *l)
+static inline void notrace local_dec(local_t *l)
 {
        asm volatile(_ASM_DEC "%0"
                     : "+m" (l->a.counter));
@@ -103,7 +103,7 @@ static inline bool local_add_negative(long i, local_t *l)
  *
  * Atomically adds @i to @l and returns @i + @l
  */
-static inline long local_add_return(long i, local_t *l)
+static inline long notrace local_add_return(long i, local_t *l)
 {
        long __i = i;
        asm volatile(_ASM_XADD "%0, %1"
diff --git a/include/linux/llist.h b/include/linux/llist.h
index 8846b7709669..53bc48f6b956 100644
--- a/include/linux/llist.h
+++ b/include/linux/llist.h
@@ -231,9 +231,9 @@ static inline struct llist_node *llist_next(struct 
llist_node *node)
  *
  * Return whether list is empty before adding.
  */
-static inline bool llist_add_batch(struct llist_node *new_first,
-                                  struct llist_node *new_last,
-                                  struct llist_head *head)
+static inline bool notrace llist_add_batch(struct llist_node *new_first,
+                                          struct llist_node *new_last,
+                                          struct llist_head *head)
 {
        struct llist_node *first = READ_ONCE(head->first);
 
@@ -244,9 +244,9 @@ static inline bool llist_add_batch(struct llist_node 
*new_first,
        return !first;
 }
 
-static inline bool __llist_add_batch(struct llist_node *new_first,
-                                    struct llist_node *new_last,
-                                    struct llist_head *head)
+static inline bool notrace __llist_add_batch(struct llist_node *new_first,
+                                            struct llist_node *new_last,
+                                            struct llist_head *head)
 {
        new_last->next = head->first;
        head->first = new_first;
@@ -260,12 +260,12 @@ static inline bool __llist_add_batch(struct llist_node 
*new_first,
  *
  * Returns true if the list was empty prior to adding this entry.
  */
-static inline bool llist_add(struct llist_node *new, struct llist_head *head)
+static inline bool notrace llist_add(struct llist_node *new, struct llist_head 
*head)
 {
        return llist_add_batch(new, new, head);
 }
 
-static inline bool __llist_add(struct llist_node *new, struct llist_head *head)
+static inline bool notrace __llist_add(struct llist_node *new, struct 
llist_head *head)
 {
        return __llist_add_batch(new, new, head);
 }
-- 
2.53.0-Meta


Reply via email to