*/
 bool bpf_selem_unlink_storage_nolock(struct bpf_local_storage *local_storage,
                                     struct bpf_local_storage_elem *selem,
-                                    bool uncharge_mem)
+                                    bool uncharge_mem, bool use_trace_rcu)
 {
        struct bpf_local_storage_map *smap;
        bool free_local_storage;
            SDATA(selem))
                RCU_INIT_POINTER(local_storage->cache[smap->cache_idx], NULL);
 
-       call_rcu_tasks_trace(&selem->rcu, bpf_selem_free_rcu);
+       if (use_trace_rcu)
+               call_rcu_tasks_trace(&selem->rcu, bpf_selem_free_rcu);
+       else
+               kfree_rcu(selem, rcu);
+
        return free_local_storage;
 }
 
-static void __bpf_selem_unlink_storage(struct bpf_local_storage_elem *selem)
+static void __bpf_selem_unlink_storage(struct bpf_local_storage_elem *selem,
+                                      bool use_trace_rcu)
 {
        struct bpf_local_storage *local_storage;
        bool free_local_storage = false;
        raw_spin_lock_irqsave(&local_storage->lock, flags);
        if (likely(selem_linked_to_storage(selem)))
                free_local_storage = bpf_selem_unlink_storage_nolock(
-                       local_storage, selem, true);
+                       local_storage, selem, true, use_trace_rcu);
        raw_spin_unlock_irqrestore(&local_storage->lock, flags);
 
-       if (free_local_storage)
-               call_rcu_tasks_trace(&local_storage->rcu,
+       if (free_local_storage) {
+               if (use_trace_rcu)
+                       call_rcu_tasks_trace(&local_storage->rcu,
                                     bpf_local_storage_free_rcu);
+               else
+                       kfree_rcu(local_storage, rcu);
+       }
 }
 
 void bpf_selem_link_storage_nolock(struct bpf_local_storage *local_storage,
        raw_spin_unlock_irqrestore(&b->lock, flags);
 }
 
-void bpf_selem_unlink(struct bpf_local_storage_elem *selem)
+void bpf_selem_unlink(struct bpf_local_storage_elem *selem, bool use_trace_rcu)
 {
        /* Always unlink from map before unlinking from local_storage
         * because selem will be freed after successfully unlinked from
         * the local_storage.
         */
        bpf_selem_unlink_map(selem);
-       __bpf_selem_unlink_storage(selem);
+       __bpf_selem_unlink_storage(selem, use_trace_rcu);
 }
 
 struct bpf_local_storage_data *
        if (old_sdata) {
                bpf_selem_unlink_map(SELEM(old_sdata));
                bpf_selem_unlink_storage_nolock(local_storage, SELEM(old_sdata),
-                                               false);
+                                               false, true);
        }
 
 unlock:
                                migrate_disable();
                                __this_cpu_inc(*busy_counter);
                        }
-                       bpf_selem_unlink(selem);
+                       bpf_selem_unlink(selem, false);
                        if (busy_counter) {
                                __this_cpu_dec(*busy_counter);
                                migrate_enable();
 
                 */
                bpf_selem_unlink_map(selem);
                free_task_storage = bpf_selem_unlink_storage_nolock(
-                       local_storage, selem, false);
+                       local_storage, selem, false, false);
        }
        raw_spin_unlock_irqrestore(&local_storage->lock, flags);
        bpf_task_storage_unlock();
        if (!sdata)
                return -ENOENT;
 
-       bpf_selem_unlink(SELEM(sdata));
+       bpf_selem_unlink(SELEM(sdata), true);
 
        return 0;
 }