blob: c6162dcd8e24fe915619d6f346bb0535019b139e [file]
From b3b840ca0f542a303b22f8c9aae05f3dd78c6ab7 Mon Sep 17 00:00:00 2001
From: "qiankun.wang" <qiankun.wang@amlogic.com>
Date: Fri, 12 May 2023 15:09:23 +0800
Subject: [PATCH] debug: misc modifications [1/1]
PD#SWPL-114632
Problem:
gki optimize
Solution:
code optimize
Verify:
s4
Change-Id: I4561d2c235baacaf73fd82e5b850dda74148724e
Signed-off-by: qiankun.wang <qiankun.wang@amlogic.com>
---
drivers/base/dd.c | 14 ++++++++++++++
init/main.c | 37 +++++++++++++++++++++++++++++++++++++
kernel/module/version.c | 11 +++++++++++
kernel/sched/topology.c | 8 +++++++-
kernel/workqueue.c | 8 ++++++++
5 files changed, 77 insertions(+), 1 deletion(-)
diff --git a/drivers/base/dd.c b/drivers/base/dd.c
index 0c3725c3eefa..551d7d2ea9ef 100644
--- a/drivers/base/dd.c
+++ b/drivers/base/dd.c
@@ -57,6 +57,11 @@ static LIST_HEAD(deferred_probe_active_list);
static atomic_t deferred_trigger_count = ATOMIC_INIT(0);
static bool initcalls_done;
+#if IS_ENABLED(CONFIG_AMLOGIC_BGKI_DEBUG_MISC)
+static int deferred_probe_printk;
+core_param(deferred_probe_printk, deferred_probe_printk, int, 0644);
+#endif
+
/* Save the async probe drivers' name from kernel cmdline */
#define ASYNC_DRV_NAMES_MAX_LEN 256
static char async_probe_drv_names[ASYNC_DRV_NAMES_MAX_LEN];
@@ -184,6 +189,15 @@ void driver_deferred_probe_trigger(void)
*/
mutex_lock(&deferred_probe_mutex);
atomic_inc(&deferred_trigger_count);
+#if IS_ENABLED(CONFIG_AMLOGIC_BGKI_DEBUG_MISC)
+ if (deferred_probe_printk && !list_empty(&deferred_probe_pending_list)) {
+ struct device_private *p;
+
+ pr_warn("deferred probe trigger count %d\n", atomic_read(&deferred_trigger_count));
+ list_for_each_entry(p, &deferred_probe_pending_list, deferred_probe)
+ dev_info(p->device, "deferred probe pending\n");
+ }
+#endif
list_splice_tail_init(&deferred_probe_pending_list,
&deferred_probe_active_list);
mutex_unlock(&deferred_probe_mutex);
diff --git a/init/main.c b/init/main.c
index 77183d0cec69..2380307e5274 100644
--- a/init/main.c
+++ b/init/main.c
@@ -568,6 +568,19 @@ static int __init unknown_bootoption(char *param, char *val,
}
argv_init[i] = param;
}
+#ifdef CONFIG_AMLOGIC_ENV_DEBUG
+ if (panic_later) {
+ int k;
+
+ pr_err("Dump init args\n");
+ for (k = 0; argv_init[k] && k < MAX_INIT_ARGS; k++)
+ pr_err("[%2d]: %s\n", k, argv_init[k]);
+
+ pr_err("Dump env args\n");
+ for (k = 0; envp_init[k] && k < MAX_INIT_ENVS; k++)
+ pr_err("[%2d]: %s\n", k, envp_init[k]);
+ }
+#endif
return 0;
}
@@ -1150,10 +1163,34 @@ static bool __init_or_module initcall_blacklisted(initcall_t fn)
strreplace(fn_name, ' ', '\0');
list_for_each_entry(entry, &blacklisted_initcalls, next) {
+#if IS_ENABLED(CONFIG_AMLOGIC_BGKI_DEBUG_MISC)
+ char *str = strstr(fn_name, entry->buf);
+
+ if (!str)
+ continue;
+ /*
+ * The judgment condition before "||" is for gcc compiler
+ * and atfer "||" for clang compiler.
+ * clang compiler will modify kernel symbol,the first character
+ * before the kernel symbol is always '_',and the first two
+ * characters are always numbers. we use this format to check
+ * blacklisted init method.
+ *
+ * for example:
+ * fn_name = __initstub__kmod_amlogic_debug__289_21_debug_main_init4
+ * entry->buf = debug_main_init
+ */
+ if (str == fn_name ||
+ ((str >= fn_name + 2) && *(str - 1) == '_' && isdigit(*(str - 2)))) {
+ pr_info("initcall %s blacklisted, fn_name: %s\n", entry->buf, fn_name);
+ return true;
+ }
+#else
if (!strcmp(fn_name, entry->buf)) {
pr_debug("initcall %s blacklisted\n", fn_name);
return true;
}
+#endif
}
return false;
diff --git a/kernel/module/version.c b/kernel/module/version.c
index 53f43ac5a73e..5f9600c2c795 100644
--- a/kernel/module/version.c
+++ b/kernel/module/version.c
@@ -10,6 +10,11 @@
#include <linux/printk.h>
#include "internal.h"
+#if IS_ENABLED(CONFIG_AMLOGIC_BGKI_DEBUG_MISC)
+static int ignore_check_version = 1;
+core_param(ignore_check_version, ignore_check_version, int, 0644);
+#endif
+
int check_version(const struct load_info *info,
const char *symname,
struct module *mod,
@@ -52,7 +57,13 @@ int check_version(const struct load_info *info,
bad_version:
pr_warn("%s: disagrees about version of symbol %s\n", info->name, symname);
+#if IS_ENABLED(CONFIG_AMLOGIC_BGKI_DEBUG_MISC)
+ pr_warn("!!!MUST FIX!!! %s: ko need recompile.\n", info->name);
+ dump_stack();
+ return ignore_check_version;
+#else
return 0;
+#endif
}
int check_modstruct_version(const struct load_info *info,
diff --git a/kernel/sched/topology.c b/kernel/sched/topology.c
index 96b92ba022a5..6c96e220c7d1 100644
--- a/kernel/sched/topology.c
+++ b/kernel/sched/topology.c
@@ -1419,8 +1419,12 @@ static void asym_cpu_capacity_scan(void)
* Initializers for schedule domains
* Non-inlined to reduce accumulated stack pressure in build_sched_domains()
*/
-
+#if IS_ENABLED(CONFIG_AMLOGIC_BGKI_DEBUG_MISC)
+/* default enable SD_BALANCE_WAKE */
+static int default_relax_domain_level = 1;
+#else
static int default_relax_domain_level = -1;
+#endif
int sched_domain_level_max;
static int __init setup_relax_domain_level(char *str)
@@ -1581,7 +1585,9 @@ sd_init(struct sched_domain_topology_level *tl,
| 1*SD_BALANCE_EXEC
| 1*SD_BALANCE_FORK
| 0*SD_BALANCE_WAKE
+#if !IS_ENABLED(CONFIG_AMLOGIC_BGKI_DEBUG_MISC)
| 1*SD_WAKE_AFFINE
+#endif
| 0*SD_SHARE_CPUCAPACITY
| 0*SD_SHARE_PKG_RESOURCES
| 0*SD_SERIALIZE
diff --git a/kernel/workqueue.c b/kernel/workqueue.c
index 9002282e3a98..586132eff632 100644
--- a/kernel/workqueue.c
+++ b/kernel/workqueue.c
@@ -2555,6 +2555,14 @@ __acquires(&pool->lock)
struct lockdep_map lockdep_map;
lockdep_copy_map(&lockdep_map, &work->lockdep_map);
+#endif
+#if IS_ENABLED(CONFIG_AMLOGIC_BGKI_DEBUG_MISC)
+ if (!pwq) {
+ WARN_ONCE(1, "<%s> pwq_NULL <%lx> <%ps>, <%ps> %s\n",
+ __func__, atomic_long_read(&work->data),
+ work->func, worker->current_func, worker->desc);
+ return;
+ }
#endif
/* ensure we're on the correct CPU */
WARN_ON_ONCE(!(pool->flags & POOL_DISASSOCIATED) &&
--
2.29.0