Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1535825

Re: [PATCH] hotplug: make register and unregister notifier API symmetric

From Michal Hocko <mhocko@kernel.org>
Newsgroups linux.kernel
Subject Re: [PATCH] hotplug: make register and unregister notifier API symmetric
Date 2016-12-05 07:10 +0100
Message-ID <sKUDo-JO-15@gated-at.bofh.it> (permalink)
References <sJXN0-5xy-21@gated-at.bofh.it> <sKaTT-5jM-1@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


On Sat 03-12-16 13:15:42, kbuild test robot wrote:
> Hi Michal,
> 
> [auto build test ERROR on linus/master]
> [also build test ERROR on v4.9-rc7 next-20161202]
> [if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
> 
> url:    https://github.com/0day-ci/linux/commits/Michal-Hocko/hotplug-make-register-and-unregister-notifier-API-symmetric/20161203-114815
> config: i386-randconfig-r0-201648 (attached as .config)
> compiler: gcc-5 (Debian 5.4.1-2) 5.4.1 20160904
> reproduce:
>         # save the attached .config to linux build tree
>         make ARCH=i386 
> 
> All errors (new ones prefixed by >>):
> 
>    arch/x86/oprofile/built-in.o: In function `nmi_timer_shutdown':
> >> nmi_timer_int.c:(.text+0x238b): undefined reference to `__unregister_cpu_notifier'
>    arch/x86/oprofile/built-in.o: In function `nmi_shutdown':
>    nmi_int.c:(.text+0x2793): undefined reference to `__unregister_cpu_notifier'

Ohh, right. I have missed that unregister functions definitions are
guarded as well. This patch should hopefully be correct finally.
Please note it also exports register/unregister callbacks when
CONFIG_HOTPLUG_CPU is not defined which is not really needed strictly
speaking because those are only used when !MODULE but I would rather
not make the code more complicated. If maintainers prefer I can guard
exports separately of course.
---
From 29a6f62ac4407b6e22ce86ac81d3856e5d01fea3 Mon Sep 17 00:00:00 2001
From: Michal Hocko <mhocko@suse.com>
Date: Fri, 2 Dec 2016 16:06:56 +0100
Subject: [PATCH] hotplug: make register and unregister notifier API symmetric

Yu Zhao has noticed that __unregister_cpu_notifier only unregisters its
notifiers when HOTPLUG_CPU=y while the registration might succeed even
when HOTPLUG_CPU=n if MODULE is enabled. This means that e.g. zswap
might keep a stale notifier on the list on the manual clean up during
the pool tear down and thus corrupt the list. Fix this issue by making
unregister APIs symmetric to the register so there are no surprises.

Fixes: 47e627bc8c9a ("[PATCH] hotplug: Allow modules to use the cpu hotplug notifiers even if !CONFIG_HOTPLUG_CPU")
Cc: stable # zswap requires for 4.3+
Reported-by: Yu Zhao <yuzhao@google.com>
Signed-off-by: Michal Hocko <mhocko@suse.com>
---
 include/linux/cpu.h | 15 ++++-----------
 kernel/cpu.c        |  2 +-
 2 files changed, 5 insertions(+), 12 deletions(-)

diff --git a/include/linux/cpu.h b/include/linux/cpu.h
index 797d9c8e9a1b..c8938eb21e34 100644
--- a/include/linux/cpu.h
+++ b/include/linux/cpu.h
@@ -105,22 +105,16 @@ extern bool cpuhp_tasks_frozen;
 		{ .notifier_call = fn, .priority = pri };	\
 	__register_cpu_notifier(&fn##_nb);			\
 }
-#else /* #if defined(CONFIG_HOTPLUG_CPU) || !defined(MODULE) */
-#define cpu_notifier(fn, pri)	do { (void)(fn); } while (0)
-#define __cpu_notifier(fn, pri)	do { (void)(fn); } while (0)
-#endif /* #else #if defined(CONFIG_HOTPLUG_CPU) || !defined(MODULE) */
 
-#ifdef CONFIG_HOTPLUG_CPU
 extern int register_cpu_notifier(struct notifier_block *nb);
 extern int __register_cpu_notifier(struct notifier_block *nb);
 extern void unregister_cpu_notifier(struct notifier_block *nb);
 extern void __unregister_cpu_notifier(struct notifier_block *nb);
-#else
 
-#ifndef MODULE
-extern int register_cpu_notifier(struct notifier_block *nb);
-extern int __register_cpu_notifier(struct notifier_block *nb);
-#else
+#else /* #if defined(CONFIG_HOTPLUG_CPU) || !defined(MODULE) */
+#define cpu_notifier(fn, pri)	do { (void)(fn); } while (0)
+#define __cpu_notifier(fn, pri)	do { (void)(fn); } while (0)
+
 static inline int register_cpu_notifier(struct notifier_block *nb)
 {
 	return 0;
@@ -130,7 +124,6 @@ static inline int __register_cpu_notifier(struct notifier_block *nb)
 {
 	return 0;
 }
-#endif
 
 static inline void unregister_cpu_notifier(struct notifier_block *nb)
 {
diff --git a/kernel/cpu.c b/kernel/cpu.c
index 341bf80f80bd..73fb59fda809 100644
--- a/kernel/cpu.c
+++ b/kernel/cpu.c
@@ -578,7 +578,6 @@ void __init cpuhp_threads_init(void)
 	kthread_unpark(this_cpu_read(cpuhp_state.thread));
 }
 
-#ifdef CONFIG_HOTPLUG_CPU
 EXPORT_SYMBOL(register_cpu_notifier);
 EXPORT_SYMBOL(__register_cpu_notifier);
 void unregister_cpu_notifier(struct notifier_block *nb)
@@ -595,6 +594,7 @@ void __unregister_cpu_notifier(struct notifier_block *nb)
 }
 EXPORT_SYMBOL(__unregister_cpu_notifier);
 
+#ifdef CONFIG_HOTPLUG_CPU
 /**
  * clear_tasks_mm_cpumask - Safely clear tasks' mm_cpumask for a CPU
  * @cpu: a CPU id
-- 
2.10.2

-- 
Michal Hocko
SUSE Labs

Back to linux.kernel | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

[PATCH v2] zswap: only use CPU notifier when HOTPLUG_CPU=y Yu Zhao <yuzhao@google.com> - 2016-11-30 22:20 +0100
  Re: [PATCH v2] zswap: only use CPU notifier when HOTPLUG_CPU=y Michal Hocko <mhocko@kernel.org> - 2016-12-02 14:50 +0100
    Re: [PATCH v2] zswap: only use CPU notifier when HOTPLUG_CPU=y Michal Hocko <mhocko@kernel.org> - 2016-12-02 15:50 +0100
      Re: [PATCH v2] zswap: only use CPU notifier when HOTPLUG_CPU=y Michal Hocko <mhocko@kernel.org> - 2016-12-02 15:50 +0100
        Re: [PATCH v2] zswap: only use CPU notifier when HOTPLUG_CPU=y Dan Streetman <ddstreet@ieee.org> - 2016-12-02 16:00 +0100
          [PATCH] hotplug: make register and unregister notifier API symmetric Michal Hocko <mhocko@kernel.org> - 2016-12-02 16:20 +0100
            Re: [PATCH] hotplug: make register and unregister notifier API  symmetric kbuild test robot <lkp@intel.com> - 2016-12-03 06:20 +0100
              Re: [PATCH] hotplug: make register and unregister notifier API  symmetric Michal Hocko <mhocko@kernel.org> - 2016-12-05 07:10 +0100
            Re: [PATCH] hotplug: make register and unregister notifier API  symmetric kbuild test robot <lkp@intel.com> - 2016-12-03 08:20 +0100
            Re: [PATCH] hotplug: make register and unregister notifier API  symmetric Yu Zhao <yuzhao@google.com> - 2016-12-05 22:00 +0100
              Re: [PATCH] hotplug: make register and unregister notifier API  symmetric Michal Hocko <mhocko@kernel.org> - 2016-12-06 10:40 +0100
    Re: [PATCH v2] zswap: only use CPU notifier when HOTPLUG_CPU=y Dan Streetman <ddstreet@ieee.org> - 2016-12-02 15:50 +0100
    Re: [PATCH v2] zswap: only use CPU notifier when HOTPLUG_CPU=y Yu Zhao <yuzhao@google.com> - 2016-12-05 22:20 +0100

csiph-web