Received: by 2002:a25:868d:0:0:0:0:0 with SMTP id z13csp211407ybk; Thu, 14 May 2020 21:35:55 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyNVhcI7/lYPyF0BLPe1neLdDUWj3kP9mXLlFCZbvUsOXUN17W86ZegDGiMjUJhzPaC1usH X-Received: by 2002:a17:906:8694:: with SMTP id g20mr1138913ejx.75.1589517355653; Thu, 14 May 2020 21:35:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1589517355; cv=none; d=google.com; s=arc-20160816; b=GPzvvHneTBWqCpgrJZuj3XoVdECrGORvn/wDeterXSdd2iN7Z9MfWJHJEzuedA2vFi 3gCF3qLXH79MXbVi/8KEq1Ir43ZrHlnKkhushD/VZIGD1z07Wl5dnfxoYTmFnGdFKDk+ /nzLmUXA1uP8or/W6lFJRwGLyTO/bx/VhhO+cfFKEz4cJEoCS/N1ougO6ABC/TiSKYr7 xnbtSdTpUV5mrsb3ghwgWFb0WxiNpSsGv4wcrvDSw/pQ0raqBV9XSbNExopRH9KQLmYS Z8Hl+9/DeVFI9nr8iUD/XQmEd842eaj/JzlEC+jChdA1xJwimdo50MPjXrzqIGUTTGX4 IaSQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from; bh=wwhnqayCOiPMsjo+qkrolyW3EQcPDH2U0WB03rNyemo=; b=PT8SBuGfuedpwt1t+f6reBGnlj6jHP3KydNvW6PGMNkZB31IDPnBQas37ocjR5+WS6 KBUnrVmFV6RYlvGCBBZa+IsF/aAI/wJ7G6x2LHBeI56qZYrJBIvAyP/rHfnHvPZXHWFQ DJUPjIrdhPvb/Y2ylrtpBmo7s33cppN9nSjGtDKopri7J50s5JhC+OFa9TiSW+EF07pf +U8wX1r6dX8tVT/lM6kA+mdQjFL7ZIQF2MI9uQ3YX356tK+dQ2esjT/OTwzvZ9Kr+7T1 8jDuDlunn3bSOPFZ++5S+IIzFy+7moGFHAI9yB8ay+XgXs+9PaRgPl23vWK+hfzmlY+A BD/Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id bz27si541029ejc.475.2020.05.14.21.35.32; Thu, 14 May 2020 21:35:55 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726569AbgEOEeE (ORCPT + 99 others); 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 Content-Type: text/plain X-Originating-IP: [10.67.189.174] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@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", -- 1.8.5.6