bpf: Refactor the core bpf_task_storage_get logic into a new function
authorMartin KaFai Lau <martin.lau@kernel.org>
Tue, 25 Oct 2022 18:45:18 +0000 (11:45 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Wed, 26 Oct 2022 06:11:46 +0000 (23:11 -0700)
This patch creates a new function __bpf_task_storage_get() and
moves the core logic of the existing bpf_task_storage_get()
into this new function.   This new function will be shared
by another new helper proto in the latter patch.

Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>
Link: https://lore.kernel.org/r/20221025184524.3526117-4-martin.lau@linux.dev
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
kernel/bpf/bpf_task_storage.c

index bce50ae..2726435 100644 (file)
@@ -227,37 +227,45 @@ out:
        return err;
 }
 
-/* *gfp_flags* is a hidden argument provided by the verifier */
-BPF_CALL_5(bpf_task_storage_get_recur, struct bpf_map *, map, struct task_struct *,
-          task, void *, value, u64, flags, gfp_t, gfp_flags)
+/* Called by bpf_task_storage_get*() helpers */
+static void *__bpf_task_storage_get(struct bpf_map *map,
+                                   struct task_struct *task, void *value,
+                                   u64 flags, gfp_t gfp_flags)
 {
        struct bpf_local_storage_data *sdata;
 
-       WARN_ON_ONCE(!bpf_rcu_lock_held());
-       if (flags & ~(BPF_LOCAL_STORAGE_GET_F_CREATE))
-               return (unsigned long)NULL;
-
-       if (!task)
-               return (unsigned long)NULL;
-
-       if (!bpf_task_storage_trylock())
-               return (unsigned long)NULL;
-
        sdata = task_storage_lookup(task, map, true);
        if (sdata)
-               goto unlock;
+               return sdata->data;
 
        /* only allocate new storage, when the task is refcounted */
        if (refcount_read(&task->usage) &&
-           (flags & BPF_LOCAL_STORAGE_GET_F_CREATE))
+           (flags & BPF_LOCAL_STORAGE_GET_F_CREATE)) {
                sdata = bpf_local_storage_update(
                        task, (struct bpf_local_storage_map *)map, value,
                        BPF_NOEXIST, gfp_flags);
+               return IS_ERR(sdata) ? NULL : sdata->data;
+       }
 
-unlock:
+       return NULL;
+}
+
+/* *gfp_flags* is a hidden argument provided by the verifier */
+BPF_CALL_5(bpf_task_storage_get_recur, struct bpf_map *, map, struct task_struct *,
+          task, void *, value, u64, flags, gfp_t, gfp_flags)
+{
+       void *data;
+
+       WARN_ON_ONCE(!bpf_rcu_lock_held());
+       if (flags & ~BPF_LOCAL_STORAGE_GET_F_CREATE || !task)
+               return (unsigned long)NULL;
+
+       if (!bpf_task_storage_trylock())
+               return (unsigned long)NULL;
+       data = __bpf_task_storage_get(map, task, value, flags,
+                                     gfp_flags);
        bpf_task_storage_unlock();
-       return IS_ERR_OR_NULL(sdata) ? (unsigned long)NULL :
-               (unsigned long)sdata->data;
+       return (unsigned long)data;
 }
 
 BPF_CALL_2(bpf_task_storage_delete_recur, struct bpf_map *, map, struct task_struct *,