From: Kaitao Cheng <[email protected]>

Refactor __bpf_list_del to accept (head, struct list_head *n) instead of
(head, bool tail). The caller now passes the specific node to remove:
bpf_list_pop_front passes h->next, bpf_list_pop_back passes h->prev.

Prepares for introducing bpf_list_del(head, node) kfunc to remove an
arbitrary node when the user holds ownership.

Signed-off-by: Kaitao Cheng <[email protected]>
---
 kernel/bpf/helpers.c | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c
index cb6d242bd093..e87b263c5fe6 100644
--- a/kernel/bpf/helpers.c
+++ b/kernel/bpf/helpers.c
@@ -2426,9 +2426,10 @@ __bpf_kfunc int bpf_list_push_back_impl(struct 
bpf_list_head *head,
        return __bpf_list_add(n, head, true, meta ? meta->record : NULL, off);
 }
 
-static struct bpf_list_node *__bpf_list_del(struct bpf_list_head *head, bool 
tail)
+static struct bpf_list_node *__bpf_list_del(struct bpf_list_head *head,
+                                           struct list_head *n)
 {
-       struct list_head *n, *h = (void *)head;
+       struct list_head *h = (void *)head;
        struct bpf_list_node_kern *node;
 
        /* If list_head was 0-initialized by map, bpf_obj_init_field wasn't
@@ -2439,7 +2440,6 @@ static struct bpf_list_node *__bpf_list_del(struct 
bpf_list_head *head, bool tai
        if (list_empty(h))
                return NULL;
 
-       n = tail ? h->prev : h->next;
        node = container_of(n, struct bpf_list_node_kern, list_head);
        if (WARN_ON_ONCE(READ_ONCE(node->owner) != head))
                return NULL;
@@ -2451,12 +2451,16 @@ static struct bpf_list_node *__bpf_list_del(struct 
bpf_list_head *head, bool tai
 
 __bpf_kfunc struct bpf_list_node *bpf_list_pop_front(struct bpf_list_head 
*head)
 {
-       return __bpf_list_del(head, false);
+       struct list_head *h = (void *)head;
+
+       return __bpf_list_del(head, h->next);
 }
 
 __bpf_kfunc struct bpf_list_node *bpf_list_pop_back(struct bpf_list_head *head)
 {
-       return __bpf_list_del(head, true);
+       struct list_head *h = (void *)head;
+
+       return __bpf_list_del(head, h->prev);
 }
 
 __bpf_kfunc struct bpf_list_node *bpf_list_front(struct bpf_list_head *head)
-- 
2.50.1 (Apple Git-155)


Reply via email to