From patchwork Fri May 15 04:33:41 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nixiaoming X-Patchwork-Id: 11550417 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 1928259D for ; Fri, 15 May 2020 04:34:07 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 04B2A20671 for ; Fri, 15 May 2020 04:34:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726537AbgEOEeE (ORCPT ); Fri, 15 May 2020 00:34:04 -0400 Received: from szxga04-in.huawei.com ([45.249.212.190]:4844 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1725616AbgEOEeC (ORCPT ); Fri, 15 May 2020 00:34:02 -0400 Received: from DGGEMS413-HUB.china.huawei.com (unknown [172.30.72.58]) by Forcepoint Email with ESMTP id 14FA57D24D9A92364ED5; Fri, 15 May 2020 12:33:53 +0800 (CST) Received: from use12-sp2.huawei.com (10.67.189.174) by DGGEMS413-HUB.china.huawei.com (10.3.19.213) with Microsoft SMTP Server id 14.3.487.0; Fri, 15 May 2020 12:33:47 +0800 From: Xiaoming Ni To: , , , , , , , , , , , , , , , , , CC: , , , Subject: [PATCH 1/4] hung_task: Move hung_task sysctl interface to hung_task_sysctl.c Date: Fri, 15 May 2020 12:33:41 +0800 Message-ID: <1589517224-123928-2-git-send-email-nixiaoming@huawei.com> X-Mailer: git-send-email 1.8.5.6 In-Reply-To: <1589517224-123928-1-git-send-email-nixiaoming@huawei.com> References: <1589517224-123928-1-git-send-email-nixiaoming@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.67.189.174] X-CFilter-Loop: Reflected Sender: linux-fsdevel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-fsdevel@vger.kernel.org Move hung_task sysctl interface to hung_task_sysctl.c. Use register_sysctl() to register the sysctl interface to avoid merge conflicts when different features modify sysctl.c at the same time. Signed-off-by: Xiaoming Ni --- include/linux/sched/sysctl.h | 8 +---- kernel/Makefile | 4 ++- kernel/hung_task.c | 6 ++-- kernel/hung_task.h | 21 ++++++++++++ kernel/hung_task_sysctl.c | 80 ++++++++++++++++++++++++++++++++++++++++++++ kernel/sysctl.c | 50 --------------------------- 6 files changed, 108 insertions(+), 61 deletions(-) create mode 100644 kernel/hung_task.h create mode 100644 kernel/hung_task_sysctl.c diff --git a/include/linux/sched/sysctl.h b/include/linux/sched/sysctl.h index d4f6215..c075e09 100644 --- a/include/linux/sched/sysctl.h +++ b/include/linux/sched/sysctl.h @@ -7,14 +7,8 @@ struct ctl_table; #ifdef CONFIG_DETECT_HUNG_TASK -extern int sysctl_hung_task_check_count; -extern unsigned int sysctl_hung_task_panic; +/* used for hung_task and block/ */ extern unsigned long sysctl_hung_task_timeout_secs; -extern unsigned long sysctl_hung_task_check_interval_secs; -extern int sysctl_hung_task_warnings; -extern int proc_dohung_task_timeout_secs(struct ctl_table *table, int write, - void __user *buffer, - size_t *lenp, loff_t *ppos); #else /* Avoid need for ifdefs elsewhere in the code */ enum { sysctl_hung_task_timeout_secs = 0 }; diff --git a/kernel/Makefile b/kernel/Makefile index 4cb4130..c16934bf 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -84,7 +84,9 @@ obj-$(CONFIG_KCOV) += kcov.o obj-$(CONFIG_KPROBES) += kprobes.o obj-$(CONFIG_FAIL_FUNCTION) += fail_function.o obj-$(CONFIG_KGDB) += debug/ -obj-$(CONFIG_DETECT_HUNG_TASK) += hung_task.o +obj-$(CONFIG_DETECT_HUNG_TASK) += hung_tasks.o +hung_tasks-y := hung_task.o +hung_tasks-$(CONFIG_SYSCTL) += hung_task_sysctl.o obj-$(CONFIG_LOCKUP_DETECTOR) += watchdog.o obj-$(CONFIG_HARDLOCKUP_DETECTOR_PERF) += watchdog_hld.o obj-$(CONFIG_SECCOMP) += seccomp.o diff --git a/kernel/hung_task.c b/kernel/hung_task.c index 14a625c..bfe6e25 100644 --- a/kernel/hung_task.c +++ b/kernel/hung_task.c @@ -15,15 +15,13 @@ #include #include #include -#include #include #include #include #include -#include #include - +#include "hung_task.h" /* * The number of tasks checked: */ @@ -298,6 +296,8 @@ static int watchdog(void *dummy) static int __init hung_task_init(void) { + hung_task_sysctl_init(); + atomic_notifier_chain_register(&panic_notifier_list, &panic_block); /* Disable hung task detector on suspend */ diff --git a/kernel/hung_task.h b/kernel/hung_task.h new file mode 100644 index 00000000..2fa6a19 --- /dev/null +++ b/kernel/hung_task.h @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * hung_task sysctl data and function + */ +#ifndef KERNEL_HUNG_TASK_H_ +#define KERNEL_HUNG_TASK_H_ +#include +extern int sysctl_hung_task_check_count; +extern unsigned int sysctl_hung_task_panic; +extern unsigned long sysctl_hung_task_check_interval_secs; +extern int sysctl_hung_task_warnings; +extern int proc_dohung_task_timeout_secs(struct ctl_table *table, int write, + void __user *buffer, + size_t *lenp, loff_t *ppos); +#ifdef CONFIG_SYSCTL +extern void __init hung_task_sysctl_init(void); +#else +#define hung_task_sysctl_init() do { } while (0) +#endif + +#endif diff --git a/kernel/hung_task_sysctl.c b/kernel/hung_task_sysctl.c new file mode 100644 index 00000000..5b10d4e --- /dev/null +++ b/kernel/hung_task_sysctl.c @@ -0,0 +1,80 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * register sysctl for hung_task + * + */ + +#include +#include +#include +#include "hung_task.h" + +/* + * This is needed for proc_doulongvec_minmax of sysctl_hung_task_timeout_secs + * and hung_task_check_interval_secs + */ +static unsigned long hung_task_timeout_max = (LONG_MAX / HZ); +static int neg_one = -1; +static struct ctl_table hung_task_sysctls[] = { + { + .procname = "hung_task_panic", + .data = &sysctl_hung_task_panic, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = proc_dointvec_minmax, + .extra1 = SYSCTL_ZERO, + .extra2 = SYSCTL_ONE, + }, + { + .procname = "hung_task_check_count", + .data = &sysctl_hung_task_check_count, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = proc_dointvec_minmax, + .extra1 = SYSCTL_ZERO, + }, + { + .procname = "hung_task_timeout_secs", + .data = &sysctl_hung_task_timeout_secs, + .maxlen = sizeof(unsigned long), + .mode = 0644, + .proc_handler = proc_dohung_task_timeout_secs, + .extra2 = &hung_task_timeout_max, + }, + { + .procname = "hung_task_check_interval_secs", + .data = &sysctl_hung_task_check_interval_secs, + .maxlen = sizeof(unsigned long), + .mode = 0644, + .proc_handler = proc_dohung_task_timeout_secs, + .extra2 = &hung_task_timeout_max, + }, + { + .procname = "hung_task_warnings", + .data = &sysctl_hung_task_warnings, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = proc_dointvec_minmax, + .extra1 = &neg_one, + }, + {} +}; + +/* + * The hung task sysctl has a default value. + * Even if register_sysctl() fails, it does not affect the main function of + * the hung task. At the same time, during the system initialization phase, + * malloc small memory will almost never fail. + * So the return value is ignored here + */ +void __init hung_task_sysctl_init(void) +{ + struct ctl_table_header *srt = register_sysctl("kernel", hung_task_sysctls); + + if (unlikely(!srt)) { + pr_err("%s fail\n", __func__); + return; + } + kmemleak_not_leak(srt); +} + diff --git a/kernel/sysctl.c b/kernel/sysctl.c index b9ff323..20adae0 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -149,13 +149,6 @@ static int ngroups_max = NGROUPS_MAX; static const int cap_last_cap = CAP_LAST_CAP; -/* - * This is needed for proc_doulongvec_minmax of sysctl_hung_task_timeout_secs - * and hung_task_check_interval_secs - */ -#ifdef CONFIG_DETECT_HUNG_TASK -static unsigned long hung_task_timeout_max = (LONG_MAX/HZ); -#endif #ifdef CONFIG_INOTIFY_USER #include @@ -1087,49 +1080,6 @@ static int sysrq_sysctl_handler(struct ctl_table *table, int write, .proc_handler = proc_dointvec, }, #endif -#ifdef CONFIG_DETECT_HUNG_TASK - { - .procname = "hung_task_panic", - .data = &sysctl_hung_task_panic, - .maxlen = sizeof(int), - .mode = 0644, - .proc_handler = proc_dointvec_minmax, - .extra1 = SYSCTL_ZERO, - .extra2 = SYSCTL_ONE, - }, - { - .procname = "hung_task_check_count", - .data = &sysctl_hung_task_check_count, - .maxlen = sizeof(int), - .mode = 0644, - .proc_handler = proc_dointvec_minmax, - .extra1 = SYSCTL_ZERO, - }, - { - .procname = "hung_task_timeout_secs", - .data = &sysctl_hung_task_timeout_secs, - .maxlen = sizeof(unsigned long), - .mode = 0644, - .proc_handler = proc_dohung_task_timeout_secs, - .extra2 = &hung_task_timeout_max, - }, - { - .procname = "hung_task_check_interval_secs", - .data = &sysctl_hung_task_check_interval_secs, - .maxlen = sizeof(unsigned long), - .mode = 0644, - .proc_handler = proc_dohung_task_timeout_secs, - .extra2 = &hung_task_timeout_max, - }, - { - .procname = "hung_task_warnings", - .data = &sysctl_hung_task_warnings, - .maxlen = sizeof(int), - .mode = 0644, - .proc_handler = proc_dointvec_minmax, - .extra1 = &neg_one, - }, -#endif #ifdef CONFIG_RT_MUTEXES { .procname = "max_lock_depth", From patchwork Fri May 15 04:33:42 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nixiaoming X-Patchwork-Id: 11550415 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id C16CA59D for ; Fri, 15 May 2020 04:34:04 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id B1B4920728 for ; Fri, 15 May 2020 04:34:04 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726257AbgEOEeB (ORCPT ); Fri, 15 May 2020 00:34:01 -0400 Received: from szxga06-in.huawei.com ([45.249.212.32]:46196 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726242AbgEOEeA (ORCPT ); Fri, 15 May 2020 00:34:00 -0400 Received: from DGGEMS413-HUB.china.huawei.com (unknown [172.30.72.60]) by Forcepoint Email with ESMTP id 1FD342BBD8552EB7953C; Fri, 15 May 2020 12:33:58 +0800 (CST) Received: from use12-sp2.huawei.com (10.67.189.174) by DGGEMS413-HUB.china.huawei.com (10.3.19.213) with Microsoft SMTP Server id 14.3.487.0; Fri, 15 May 2020 12:33:47 +0800 From: Xiaoming Ni To: , , , , , , , , , , , , , , , , , CC: , , , Subject: [PATCH 2/4] proc/sysctl: add shared variables -1 Date: Fri, 15 May 2020 12:33:42 +0800 Message-ID: <1589517224-123928-3-git-send-email-nixiaoming@huawei.com> X-Mailer: git-send-email 1.8.5.6 In-Reply-To: <1589517224-123928-1-git-send-email-nixiaoming@huawei.com> References: <1589517224-123928-1-git-send-email-nixiaoming@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.67.189.174] X-CFilter-Loop: Reflected Sender: linux-fsdevel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-fsdevel@vger.kernel.org Add the shared variable SYSCTL_NEG_ONE to replace the variable neg_one used in both sysctl_writes_strict and hung_task_warnings. Signed-off-by: Xiaoming Ni --- fs/proc/proc_sysctl.c | 2 +- include/linux/sysctl.h | 1 + kernel/hung_task_sysctl.c | 3 +-- kernel/sysctl.c | 3 +-- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/fs/proc/proc_sysctl.c b/fs/proc/proc_sysctl.c index b6f5d45..acae1fa 100644 --- a/fs/proc/proc_sysctl.c +++ b/fs/proc/proc_sysctl.c @@ -23,7 +23,7 @@ static const struct inode_operations proc_sys_dir_operations; /* shared constants to be used in various sysctls */ -const int sysctl_vals[] = { 0, 1, INT_MAX }; +const int sysctl_vals[] = { 0, 1, INT_MAX, -1 }; EXPORT_SYMBOL(sysctl_vals); /* Support for permanently empty directories */ diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h index 02fa844..6d741d6 100644 --- a/include/linux/sysctl.h +++ b/include/linux/sysctl.h @@ -41,6 +41,7 @@ #define SYSCTL_ZERO ((void *)&sysctl_vals[0]) #define SYSCTL_ONE ((void *)&sysctl_vals[1]) #define SYSCTL_INT_MAX ((void *)&sysctl_vals[2]) +#define SYSCTL_NEG_ONE ((void *)&sysctl_vals[3]) extern const int sysctl_vals[]; diff --git a/kernel/hung_task_sysctl.c b/kernel/hung_task_sysctl.c index 5b10d4e..62a51f5 100644 --- a/kernel/hung_task_sysctl.c +++ b/kernel/hung_task_sysctl.c @@ -14,7 +14,6 @@ * and hung_task_check_interval_secs */ static unsigned long hung_task_timeout_max = (LONG_MAX / HZ); -static int neg_one = -1; static struct ctl_table hung_task_sysctls[] = { { .procname = "hung_task_panic", @@ -55,7 +54,7 @@ .maxlen = sizeof(int), .mode = 0644, .proc_handler = proc_dointvec_minmax, - .extra1 = &neg_one, + .extra1 = SYSCTL_NEG_ONE, }, {} }; diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 20adae0..01fc559 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -124,7 +124,6 @@ static int sixty = 60; #endif -static int __maybe_unused neg_one = -1; static int __maybe_unused two = 2; static int __maybe_unused four = 4; static unsigned long zero_ul; @@ -540,7 +539,7 @@ static int sysrq_sysctl_handler(struct ctl_table *table, int write, .maxlen = sizeof(int), .mode = 0644, .proc_handler = proc_dointvec_minmax, - .extra1 = &neg_one, + .extra1 = SYSCTL_NEG_ONE, .extra2 = SYSCTL_ONE, }, #endif From patchwork Fri May 15 04:33:43 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nixiaoming X-Patchwork-Id: 11550419 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 48BDD913 for ; Fri, 15 May 2020 04:34:12 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 32C0E20671 for ; Fri, 15 May 2020 04:34:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726594AbgEOEeI (ORCPT ); Fri, 15 May 2020 00:34:08 -0400 Received: from szxga06-in.huawei.com ([45.249.212.32]:46328 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726243AbgEOEeI (ORCPT ); Fri, 15 May 2020 00:34:08 -0400 Received: from DGGEMS413-HUB.china.huawei.com (unknown [172.30.72.60]) by Forcepoint Email with ESMTP id 2B276EA82EB723149A80; Fri, 15 May 2020 12:33:58 +0800 (CST) Received: from use12-sp2.huawei.com (10.67.189.174) by DGGEMS413-HUB.china.huawei.com (10.3.19.213) with Microsoft SMTP Server id 14.3.487.0; Fri, 15 May 2020 12:33:48 +0800 From: Xiaoming Ni To: , , , , , , , , , , , , , , , , , CC: , , , Subject: [PATCH 3/4] watchdog: move watchdog sysctl to watchdog.c Date: Fri, 15 May 2020 12:33:43 +0800 Message-ID: <1589517224-123928-4-git-send-email-nixiaoming@huawei.com> X-Mailer: git-send-email 1.8.5.6 In-Reply-To: <1589517224-123928-1-git-send-email-nixiaoming@huawei.com> References: <1589517224-123928-1-git-send-email-nixiaoming@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.67.189.174] X-CFilter-Loop: Reflected Sender: linux-fsdevel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-fsdevel@vger.kernel.org Move watchdog sysctl interface to watchdog.c. Use register_sysctl() to register the sysctl interface to avoid merge conflicts when different features modify sysctl.c at the same time. Signed-off-by: Xiaoming Ni --- kernel/sysctl.c | 96 -------------------------------------------- kernel/watchdog.c | 117 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 117 insertions(+), 96 deletions(-) diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 01fc559..e394990 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -97,9 +97,6 @@ #ifdef CONFIG_STACKLEAK_RUNTIME_DISABLE #include #endif -#ifdef CONFIG_LOCKUP_DETECTOR -#include -#endif #if defined(CONFIG_SYSCTL) @@ -120,9 +117,6 @@ #endif /* Constants used for minimum and maximum */ -#ifdef CONFIG_LOCKUP_DETECTOR -static int sixty = 60; -#endif static int __maybe_unused two = 2; static int __maybe_unused four = 4; @@ -887,96 +881,6 @@ static int sysrq_sysctl_handler(struct ctl_table *table, int write, .mode = 0444, .proc_handler = proc_dointvec, }, -#if defined(CONFIG_LOCKUP_DETECTOR) - { - .procname = "watchdog", - .data = &watchdog_user_enabled, - .maxlen = sizeof(int), - .mode = 0644, - .proc_handler = proc_watchdog, - .extra1 = SYSCTL_ZERO, - .extra2 = SYSCTL_ONE, - }, - { - .procname = "watchdog_thresh", - .data = &watchdog_thresh, - .maxlen = sizeof(int), - .mode = 0644, - .proc_handler = proc_watchdog_thresh, - .extra1 = SYSCTL_ZERO, - .extra2 = &sixty, - }, - { - .procname = "nmi_watchdog", - .data = &nmi_watchdog_user_enabled, - .maxlen = sizeof(int), - .mode = NMI_WATCHDOG_SYSCTL_PERM, - .proc_handler = proc_nmi_watchdog, - .extra1 = SYSCTL_ZERO, - .extra2 = SYSCTL_ONE, - }, - { - .procname = "watchdog_cpumask", - .data = &watchdog_cpumask_bits, - .maxlen = NR_CPUS, - .mode = 0644, - .proc_handler = proc_watchdog_cpumask, - }, -#ifdef CONFIG_SOFTLOCKUP_DETECTOR - { - .procname = "soft_watchdog", - .data = &soft_watchdog_user_enabled, - .maxlen = sizeof(int), - .mode = 0644, - .proc_handler = proc_soft_watchdog, - .extra1 = SYSCTL_ZERO, - .extra2 = SYSCTL_ONE, - }, - { - .procname = "softlockup_panic", - .data = &softlockup_panic, - .maxlen = sizeof(int), - .mode = 0644, - .proc_handler = proc_dointvec_minmax, - .extra1 = SYSCTL_ZERO, - .extra2 = SYSCTL_ONE, - }, -#ifdef CONFIG_SMP - { - .procname = "softlockup_all_cpu_backtrace", - .data = &sysctl_softlockup_all_cpu_backtrace, - .maxlen = sizeof(int), - .mode = 0644, - .proc_handler = proc_dointvec_minmax, - .extra1 = SYSCTL_ZERO, - .extra2 = SYSCTL_ONE, - }, -#endif /* CONFIG_SMP */ -#endif -#ifdef CONFIG_HARDLOCKUP_DETECTOR - { - .procname = "hardlockup_panic", - .data = &hardlockup_panic, - .maxlen = sizeof(int), - .mode = 0644, - .proc_handler = proc_dointvec_minmax, - .extra1 = SYSCTL_ZERO, - .extra2 = SYSCTL_ONE, - }, -#ifdef CONFIG_SMP - { - .procname = "hardlockup_all_cpu_backtrace", - .data = &sysctl_hardlockup_all_cpu_backtrace, - .maxlen = sizeof(int), - .mode = 0644, - .proc_handler = proc_dointvec_minmax, - .extra1 = SYSCTL_ZERO, - .extra2 = SYSCTL_ONE, - }, -#endif /* CONFIG_SMP */ -#endif -#endif - #if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_X86) { .procname = "unknown_nmi_panic", diff --git a/kernel/watchdog.c b/kernel/watchdog.c index b6b1f54..05e1d58 100644 --- a/kernel/watchdog.c +++ b/kernel/watchdog.c @@ -23,6 +23,9 @@ #include #include #include +#ifdef CONFIG_SYSCTL +#include +#endif #include #include @@ -756,10 +759,124 @@ int proc_watchdog_cpumask(struct ctl_table *table, int write, mutex_unlock(&watchdog_mutex); return err; } + +static int sixty = 60; + +static struct ctl_table watchdog_sysctls[] = { + { + .procname = "watchdog", + .data = &watchdog_user_enabled, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = proc_watchdog, + .extra1 = SYSCTL_ZERO, + .extra2 = SYSCTL_ONE, + }, + { + .procname = "watchdog_thresh", + .data = &watchdog_thresh, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = proc_watchdog_thresh, + .extra1 = SYSCTL_ZERO, + .extra2 = &sixty, + }, + { + .procname = "nmi_watchdog", + .data = &nmi_watchdog_user_enabled, + .maxlen = sizeof(int), + .mode = NMI_WATCHDOG_SYSCTL_PERM, + .proc_handler = proc_nmi_watchdog, + .extra1 = SYSCTL_ZERO, + .extra2 = SYSCTL_ONE, + }, + { + .procname = "watchdog_cpumask", + .data = &watchdog_cpumask_bits, + .maxlen = NR_CPUS, + .mode = 0644, + .proc_handler = proc_watchdog_cpumask, + }, +#ifdef CONFIG_SOFTLOCKUP_DETECTOR + { + .procname = "soft_watchdog", + .data = &soft_watchdog_user_enabled, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = proc_soft_watchdog, + .extra1 = SYSCTL_ZERO, + .extra2 = SYSCTL_ONE, + }, + { + .procname = "softlockup_panic", + .data = &softlockup_panic, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = proc_dointvec_minmax, + .extra1 = SYSCTL_ZERO, + .extra2 = SYSCTL_ONE, + }, +#ifdef CONFIG_SMP + { + .procname = "softlockup_all_cpu_backtrace", + .data = &sysctl_softlockup_all_cpu_backtrace, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = proc_dointvec_minmax, + .extra1 = SYSCTL_ZERO, + .extra2 = SYSCTL_ONE, + }, +#endif /* CONFIG_SMP */ +#endif +#ifdef CONFIG_HARDLOCKUP_DETECTOR + { + .procname = "hardlockup_panic", + .data = &hardlockup_panic, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = proc_dointvec_minmax, + .extra1 = SYSCTL_ZERO, + .extra2 = SYSCTL_ONE, + }, +#ifdef CONFIG_SMP + { + .procname = "hardlockup_all_cpu_backtrace", + .data = &sysctl_hardlockup_all_cpu_backtrace, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = proc_dointvec_minmax, + .extra1 = SYSCTL_ZERO, + .extra2 = SYSCTL_ONE, + }, +#endif /* CONFIG_SMP */ +#endif + {} +}; + +/* + * The watchdog sysctl has a default value. + * Even if register_sysctl() fails, it does not affect the main function of + * the watchdog. At the same time, during the system initialization phase, + * malloc small memory will almost never fail. + * So the return value is ignored here + */ +static void __init watchdog_sysctl_init(void) +{ + struct ctl_table_header *p = register_sysctl("kernel", watchdog_sysctls); + + if (unlikely(!p)) { + pr_err("%s fail\n", __func__); + return; + } + kmemleak_not_leak(p); +} +#else +#define watchdog_sysctl_init() do { } while (0) #endif /* CONFIG_SYSCTL */ void __init lockup_detector_init(void) { + watchdog_sysctl_init(); if (tick_nohz_full_enabled()) pr_info("Disabling watchdog on nohz_full cores by default\n"); From patchwork Fri May 15 04:33:44 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nixiaoming X-Patchwork-Id: 11550421 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id E0994913 for ; Fri, 15 May 2020 04:34:13 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id CE006206F4 for ; Fri, 15 May 2020 04:34:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726624AbgEOEeM (ORCPT ); Fri, 15 May 2020 00:34:12 -0400 Received: from szxga06-in.huawei.com ([45.249.212.32]:46384 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1725616AbgEOEeI (ORCPT ); Fri, 15 May 2020 00:34:08 -0400 Received: from DGGEMS413-HUB.china.huawei.com (unknown [172.30.72.60]) by Forcepoint Email with ESMTP id 3650B3FC3A5A4A9C49D3; Fri, 15 May 2020 12:33:58 +0800 (CST) Received: from use12-sp2.huawei.com (10.67.189.174) by DGGEMS413-HUB.china.huawei.com (10.3.19.213) with Microsoft SMTP Server id 14.3.487.0; Fri, 15 May 2020 12:33:48 +0800 From: Xiaoming Ni To: , , , , , , , , , , , , , , , , , CC: , , , Subject: [PATCH 4/4] sysctl: Add register_sysctl_init() interface Date: Fri, 15 May 2020 12:33:44 +0800 Message-ID: <1589517224-123928-5-git-send-email-nixiaoming@huawei.com> X-Mailer: git-send-email 1.8.5.6 In-Reply-To: <1589517224-123928-1-git-send-email-nixiaoming@huawei.com> References: <1589517224-123928-1-git-send-email-nixiaoming@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.67.189.174] X-CFilter-Loop: Reflected Sender: linux-fsdevel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-fsdevel@vger.kernel.org In order to eliminate the duplicate code for registering the sysctl interface during the initialization of each feature, add the register_sysctl_init() interface Signed-off-by: Xiaoming Ni --- include/linux/sysctl.h | 2 ++ kernel/hung_task_sysctl.c | 15 +-------------- kernel/sysctl.c | 19 +++++++++++++++++++ kernel/watchdog.c | 18 +----------------- 4 files changed, 23 insertions(+), 31 deletions(-) diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h index 6d741d6..3cdbe89 100644 --- a/include/linux/sysctl.h +++ b/include/linux/sysctl.h @@ -207,6 +207,8 @@ struct ctl_table_header *register_sysctl_paths(const struct ctl_path *path, void unregister_sysctl_table(struct ctl_table_header * table); extern int sysctl_init(void); +extern void register_sysctl_init(const char *path, struct ctl_table *table, + const char *table_name); extern struct ctl_table sysctl_mount_point[]; diff --git a/kernel/hung_task_sysctl.c b/kernel/hung_task_sysctl.c index 62a51f5..14d2ed6 100644 --- a/kernel/hung_task_sysctl.c +++ b/kernel/hung_task_sysctl.c @@ -59,21 +59,8 @@ {} }; -/* - * The hung task sysctl has a default value. - * Even if register_sysctl() fails, it does not affect the main function of - * the hung task. At the same time, during the system initialization phase, - * malloc small memory will almost never fail. - * So the return value is ignored here - */ void __init hung_task_sysctl_init(void) { - struct ctl_table_header *srt = register_sysctl("kernel", hung_task_sysctls); - - if (unlikely(!srt)) { - pr_err("%s fail\n", __func__); - return; - } - kmemleak_not_leak(srt); + register_sysctl_init("kernel", hung_task_sysctls, "hung_task_sysctls"); } diff --git a/kernel/sysctl.c b/kernel/sysctl.c index e394990..0a09742 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -1823,6 +1823,25 @@ int __init sysctl_init(void) return 0; } +/* + * The sysctl interface is used to modify the interface value, + * but the feature interface has default values. Even if register_sysctl fails, + * the feature body function can also run. At the same time, malloc small + * fragment of memory during the system initialization phase, almost does + * not fail. Therefore, the function return is designed as void + */ +void __init register_sysctl_init(const char *path, struct ctl_table *table, + const char *table_name) +{ + struct ctl_table_header *hdr = register_sysctl(path, table); + + if (unlikely(!hdr)) { + pr_err("failed when register_sysctl %s to %s\n", table_name, path); + return; + } + kmemleak_not_leak(hdr); +} + #endif /* CONFIG_SYSCTL */ /* diff --git a/kernel/watchdog.c b/kernel/watchdog.c index 05e1d58..c1bebb1 100644 --- a/kernel/watchdog.c +++ b/kernel/watchdog.c @@ -23,9 +23,6 @@ #include #include #include -#ifdef CONFIG_SYSCTL -#include -#endif #include #include @@ -853,22 +850,9 @@ int proc_watchdog_cpumask(struct ctl_table *table, int write, {} }; -/* - * The watchdog sysctl has a default value. - * Even if register_sysctl() fails, it does not affect the main function of - * the watchdog. At the same time, during the system initialization phase, - * malloc small memory will almost never fail. - * So the return value is ignored here - */ static void __init watchdog_sysctl_init(void) { - struct ctl_table_header *p = register_sysctl("kernel", watchdog_sysctls); - - if (unlikely(!p)) { - pr_err("%s fail\n", __func__); - return; - } - kmemleak_not_leak(p); + register_sysctl_init("kernel", watchdog_sysctls, "watchdog_sysctls"); } #else #define watchdog_sysctl_init() do { } while (0)