From: Greg Kroah-Hartman Date: Mon, 8 May 2023 08:13:15 +0000 (+0200) Subject: 6.3-stable patches X-Git-Tag: v5.15.111~29 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=19d945f15a25a4da34c27e922b493c68ffc5df2d;p=thirdparty%2Fkernel%2Fstable-queue.git 6.3-stable patches added patches: debugobject-ensure-pool-refill-again.patch --- diff --git a/queue-6.3/debugobject-ensure-pool-refill-again.patch b/queue-6.3/debugobject-ensure-pool-refill-again.patch new file mode 100644 index 00000000000..655c8a1690c --- /dev/null +++ b/queue-6.3/debugobject-ensure-pool-refill-again.patch @@ -0,0 +1,85 @@ +From 0af462f19e635ad522f28981238334620881badc Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Mon, 1 May 2023 17:42:06 +0200 +Subject: debugobject: Ensure pool refill (again) + +From: Thomas Gleixner + +commit 0af462f19e635ad522f28981238334620881badc upstream. + +The recent fix to ensure atomicity of lookup and allocation inadvertently +broke the pool refill mechanism. + +Prior to that change debug_objects_activate() and debug_objecs_assert_init() +invoked debug_objecs_init() to set up the tracking object for statically +initialized objects. That's not longer the case and debug_objecs_init() is +now the only place which does pool refills. + +Depending on the number of statically initialized objects this can be +enough to actually deplete the pool, which was observed by Ido via a +debugobjects OOM warning. + +Restore the old behaviour by adding explicit refill opportunities to +debug_objects_activate() and debug_objecs_assert_init(). + +Fixes: 63a759694eed ("debugobject: Prevent init race with static objects") +Reported-by: Ido Schimmel +Signed-off-by: Thomas Gleixner +Tested-by: Ido Schimmel +Link: https://lore.kernel.org/r/871qk05a9d.ffs@tglx +Signed-off-by: Greg Kroah-Hartman +--- + lib/debugobjects.c | 21 +++++++++++++++------ + 1 file changed, 15 insertions(+), 6 deletions(-) + +--- a/lib/debugobjects.c ++++ b/lib/debugobjects.c +@@ -587,6 +587,16 @@ static struct debug_obj *lookup_object_o + return NULL; + } + ++static void debug_objects_fill_pool(void) ++{ ++ /* ++ * On RT enabled kernels the pool refill must happen in preemptible ++ * context: ++ */ ++ if (!IS_ENABLED(CONFIG_PREEMPT_RT) || preemptible()) ++ fill_pool(); ++} ++ + static void + __debug_object_init(void *addr, const struct debug_obj_descr *descr, int onstack) + { +@@ -595,12 +605,7 @@ __debug_object_init(void *addr, const st + struct debug_obj *obj; + unsigned long flags; + +- /* +- * On RT enabled kernels the pool refill must happen in preemptible +- * context: +- */ +- if (!IS_ENABLED(CONFIG_PREEMPT_RT) || preemptible()) +- fill_pool(); ++ debug_objects_fill_pool(); + + db = get_bucket((unsigned long) addr); + +@@ -685,6 +690,8 @@ int debug_object_activate(void *addr, co + if (!debug_objects_enabled) + return 0; + ++ debug_objects_fill_pool(); ++ + db = get_bucket((unsigned long) addr); + + raw_spin_lock_irqsave(&db->lock, flags); +@@ -894,6 +901,8 @@ void debug_object_assert_init(void *addr + if (!debug_objects_enabled) + return; + ++ debug_objects_fill_pool(); ++ + db = get_bucket((unsigned long) addr); + + raw_spin_lock_irqsave(&db->lock, flags); diff --git a/queue-6.3/series b/queue-6.3/series index 9d0a9e9024c..3cc267fd528 100644 --- a/queue-6.3/series +++ b/queue-6.3/series @@ -691,3 +691,4 @@ cifs-fix-sharing-of-dfs-connections.patch cifs-fix-potential-race-when-tree-connecting-ipc.patch cifs-protect-access-of-tcp_server_info-origin-leaf-_fullpath.patch cifs-avoid-potential-races-when-handling-multiple-dfs-tcons.patch +debugobject-ensure-pool-refill-again.patch