mm: kmem: reimplement get_obj_cgroup_from_current()
authorRoman Gushchin <roman.gushchin@linux.dev>
Thu, 19 Oct 2023 22:53:46 +0000 (15:53 -0700)
committerAndrew Morton <akpm@linux-foundation.org>
Wed, 25 Oct 2023 23:47:11 +0000 (16:47 -0700)
Reimplement get_obj_cgroup_from_current() using current_obj_cgroup().
get_obj_cgroup_from_current() and current_obj_cgroup() share 80% of the
code, so the new implementation is almost trivial.

get_obj_cgroup_from_current() is a convenient function used by the
bpf subsystem, so there is no reason to get rid of it completely.

Link: https://lkml.kernel.org/r/20231019225346.1822282-7-roman.gushchin@linux.dev
Signed-off-by: Roman Gushchin (Cruise) <roman.gushchin@linux.dev>
Reviewed-by: Vlastimil Babka <vbabka@suse.cz>
Acked-by: Shakeel Butt <shakeelb@google.com>
Cc: David Rientjes <rientjes@google.com>
Cc: Dennis Zhou <dennis@kernel.org>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Michal Hocko <mhocko@kernel.org>
Cc: Muchun Song <muchun.song@linux.dev>
Cc: Naresh Kamboju <naresh.kamboju@linaro.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
include/linux/memcontrol.h
mm/memcontrol.c

index 8006bc3bd7bf0adffdfc702ce962e1dbc72a328f..b3d2e3e60eed3e91d4590ae57dd24676ad46892c 100644 (file)
@@ -1805,9 +1805,18 @@ void __memcg_kmem_uncharge_page(struct page *page, int order);
  * needs to be used outside of the local scope.
  */
 struct obj_cgroup *current_obj_cgroup(void);
-struct obj_cgroup *get_obj_cgroup_from_current(void);
 struct obj_cgroup *get_obj_cgroup_from_folio(struct folio *folio);
 
+static inline struct obj_cgroup *get_obj_cgroup_from_current(void)
+{
+       struct obj_cgroup *objcg = current_obj_cgroup();
+
+       if (objcg)
+               obj_cgroup_get(objcg);
+
+       return objcg;
+}
+
 int obj_cgroup_charge(struct obj_cgroup *objcg, gfp_t gfp, size_t size);
 void obj_cgroup_uncharge(struct obj_cgroup *objcg, size_t size);
 
index a6457c8b5e16189cfa65939a54eca412aa1a9d02..8b0859b8cc03df3cb0d71f267fef70173f30cf1a 100644 (file)
@@ -3138,38 +3138,6 @@ static struct obj_cgroup *current_objcg_update(void)
        return objcg;
 }
 
-__always_inline struct obj_cgroup *get_obj_cgroup_from_current(void)
-{
-       struct mem_cgroup *memcg;
-       struct obj_cgroup *objcg;
-
-       if (in_task()) {
-               memcg = current->active_memcg;
-               if (unlikely(memcg))
-                       goto from_memcg;
-
-               objcg = READ_ONCE(current->objcg);
-               if (unlikely((unsigned long)objcg & CURRENT_OBJCG_UPDATE_FLAG))
-                       objcg = current_objcg_update();
-
-               if (objcg) {
-                       obj_cgroup_get(objcg);
-                       return objcg;
-               }
-       } else {
-               memcg = this_cpu_read(int_active_memcg);
-               if (unlikely(memcg))
-                       goto from_memcg;
-       }
-       return NULL;
-
-from_memcg:
-       rcu_read_lock();
-       objcg = __get_obj_cgroup_from_memcg(memcg);
-       rcu_read_unlock();
-       return objcg;
-}
-
 __always_inline struct obj_cgroup *current_obj_cgroup(void)
 {
        struct mem_cgroup *memcg;