All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
To: linux-kernel@vger.kernel.org
Cc: rt@linutronix.de, tglx@linutronix.de,
	Anna-Maria Gleixner <anna-maria@linutronix.de>,
	Minchan Kim <minchan@kernel.org>, Nitin Gupta <ngupta@vflare.org>,
	Sergey Senozhatsky <sergey.senozhatsky.work@gmail.com>,
	Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Subject: [PATCH 18/22] zram: Convert to hotplug state machine
Date: Sun, 27 Nov 2016 00:13:46 +0100	[thread overview]
Message-ID: <20161126231350.10321-19-bigeasy@linutronix.de> (raw)
In-Reply-To: <20161126231350.10321-1-bigeasy@linutronix.de>

From: Anna-Maria Gleixner <anna-maria@linutronix.de>

Install the callbacks via the state machine with multi instance support and let
the core invoke the callbacks on the already online CPUs.

Cc: Minchan Kim <minchan@kernel.org>
Cc: Nitin Gupta <ngupta@vflare.org>
Cc: Sergey Senozhatsky <sergey.senozhatsky.work@gmail.com>
[bigeasy: wire up the multi instance stuff]
Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
 drivers/block/zram/zcomp.c    | 76 ++++++++++++++-----------------------------
 drivers/block/zram/zcomp.h    |  5 +--
 drivers/block/zram/zram_drv.c |  9 +++++
 include/linux/cpuhotplug.h    |  1 +
 4 files changed, 38 insertions(+), 53 deletions(-)

diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c
index 4b5cd3a7b2b6..12046f4f00e4 100644
--- a/drivers/block/zram/zcomp.c
+++ b/drivers/block/zram/zcomp.c
@@ -160,82 +160,56 @@ int zcomp_decompress(struct zcomp_strm *zstrm,
 			dst, &dst_len);
 }
 
-static int __zcomp_cpu_notifier(struct zcomp *comp,
-		unsigned long action, unsigned long cpu)
+int zcomp_cpu_up_prepare(unsigned int cpu, struct hlist_node *node)
 {
+	struct zcomp *comp = hlist_entry(node, struct zcomp, node);
 	struct zcomp_strm *zstrm;
 
-	switch (action) {
-	case CPU_UP_PREPARE:
-		if (WARN_ON(*per_cpu_ptr(comp->stream, cpu)))
-			break;
-		zstrm = zcomp_strm_alloc(comp);
-		if (IS_ERR_OR_NULL(zstrm)) {
-			pr_err("Can't allocate a compression stream\n");
-			return NOTIFY_BAD;
-		}
-		*per_cpu_ptr(comp->stream, cpu) = zstrm;
-		break;
-	case CPU_DEAD:
-	case CPU_UP_CANCELED:
-		zstrm = *per_cpu_ptr(comp->stream, cpu);
-		if (!IS_ERR_OR_NULL(zstrm))
-			zcomp_strm_free(zstrm);
-		*per_cpu_ptr(comp->stream, cpu) = NULL;
-		break;
-	default:
-		break;
+	if (WARN_ON(*per_cpu_ptr(comp->stream, cpu)))
+		return 0;
+
+	zstrm = zcomp_strm_alloc(comp);
+	if (IS_ERR_OR_NULL(zstrm)) {
+		pr_err("Can't allocate a compression stream\n");
+		return -ENOMEM;
 	}
-	return NOTIFY_OK;
+	*per_cpu_ptr(comp->stream, cpu) = zstrm;
+	return 0;
 }
 
-static int zcomp_cpu_notifier(struct notifier_block *nb,
-		unsigned long action, void *pcpu)
+int zcomp_cpu_dead(unsigned int cpu, struct hlist_node *node)
 {
-	unsigned long cpu = (unsigned long)pcpu;
-	struct zcomp *comp = container_of(nb, typeof(*comp), notifier);
+	struct zcomp *comp = hlist_entry(node, struct zcomp, node);
+	struct zcomp_strm *zstrm;
 
-	return __zcomp_cpu_notifier(comp, action, cpu);
+	zstrm = *per_cpu_ptr(comp->stream, cpu);
+	if (!IS_ERR_OR_NULL(zstrm))
+		zcomp_strm_free(zstrm);
+	*per_cpu_ptr(comp->stream, cpu) = NULL;
+	return 0;
 }
 
 static int zcomp_init(struct zcomp *comp)
 {
-	unsigned long cpu;
 	int ret;
 
-	comp->notifier.notifier_call = zcomp_cpu_notifier;
-
 	comp->stream = alloc_percpu(struct zcomp_strm *);
 	if (!comp->stream)
 		return -ENOMEM;
 
-	cpu_notifier_register_begin();
-	for_each_online_cpu(cpu) {
-		ret = __zcomp_cpu_notifier(comp, CPU_UP_PREPARE, cpu);
-		if (ret == NOTIFY_BAD)
-			goto cleanup;
-	}
-	__register_cpu_notifier(&comp->notifier);
-	cpu_notifier_register_done();
+	ret = cpuhp_state_add_instance(CPUHP_ZCOMP_PREPARE, &comp->node);
+	if (ret < 0)
+		goto cleanup;
 	return 0;
 
 cleanup:
-	for_each_online_cpu(cpu)
-		__zcomp_cpu_notifier(comp, CPU_UP_CANCELED, cpu);
-	cpu_notifier_register_done();
-	return -ENOMEM;
+	free_percpu(comp->stream);
+	return ret;
 }
 
 void zcomp_destroy(struct zcomp *comp)
 {
-	unsigned long cpu;
-
-	cpu_notifier_register_begin();
-	for_each_online_cpu(cpu)
-		__zcomp_cpu_notifier(comp, CPU_UP_CANCELED, cpu);
-	__unregister_cpu_notifier(&comp->notifier);
-	cpu_notifier_register_done();
-
+	cpuhp_state_remove_instance(CPUHP_ZCOMP_PREPARE, &comp->node);
 	free_percpu(comp->stream);
 	kfree(comp);
 }
diff --git a/drivers/block/zram/zcomp.h b/drivers/block/zram/zcomp.h
index 478cac2ed465..41c1002a7d7d 100644
--- a/drivers/block/zram/zcomp.h
+++ b/drivers/block/zram/zcomp.h
@@ -19,11 +19,12 @@ struct zcomp_strm {
 /* dynamic per-device compression frontend */
 struct zcomp {
 	struct zcomp_strm * __percpu *stream;
-	struct notifier_block notifier;
-
 	const char *name;
+	struct hlist_node node;
 };
 
+int zcomp_cpu_up_prepare(unsigned int cpu, struct hlist_node *node);
+int zcomp_cpu_dead(unsigned int cpu, struct hlist_node *node);
 ssize_t zcomp_available_show(const char *comp, char *buf);
 bool zcomp_available_algorithm(const char *comp);
 
diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c
index 04365b17ee67..511c35fd5c6f 100644
--- a/drivers/block/zram/zram_drv.c
+++ b/drivers/block/zram/zram_drv.c
@@ -30,6 +30,7 @@
 #include <linux/err.h>
 #include <linux/idr.h>
 #include <linux/sysfs.h>
+#include <linux/cpuhotplug.h>
 
 #include "zram_drv.h"
 
@@ -1436,15 +1437,22 @@ static void destroy_devices(void)
 	idr_for_each(&zram_index_idr, &zram_remove_cb, NULL);
 	idr_destroy(&zram_index_idr);
 	unregister_blkdev(zram_major, "zram");
+	cpuhp_remove_multi_state(CPUHP_ZCOMP_PREPARE);
 }
 
 static int __init zram_init(void)
 {
 	int ret;
 
+	ret = cpuhp_setup_state_multi(CPUHP_ZCOMP_PREPARE, "block/zram:prepare",
+				      zcomp_cpu_up_prepare, zcomp_cpu_dead);
+	if (ret < 0)
+		return ret;
+
 	ret = class_register(&zram_control_class);
 	if (ret) {
 		pr_err("Unable to register zram-control class\n");
+		cpuhp_remove_multi_state(CPUHP_ZCOMP_PREPARE);
 		return ret;
 	}
 
@@ -1452,6 +1460,7 @@ static int __init zram_init(void)
 	if (zram_major <= 0) {
 		pr_err("Unable to get major number\n");
 		class_unregister(&zram_control_class);
+		cpuhp_remove_multi_state(CPUHP_ZCOMP_PREPARE);
 		return -EBUSY;
 	}
 
diff --git a/include/linux/cpuhotplug.h b/include/linux/cpuhotplug.h
index 71c6822dd5be..22acee76cf4c 100644
--- a/include/linux/cpuhotplug.h
+++ b/include/linux/cpuhotplug.h
@@ -69,6 +69,7 @@ enum cpuhp_state {
 	CPUHP_MM_ZSWP_MEM_PREPARE,
 	CPUHP_MM_ZSWP_POOL_PREPARE,
 	CPUHP_KVM_PPC_BOOK3S_PREPARE,
+	CPUHP_ZCOMP_PREPARE,
 	CPUHP_TIMERS_DEAD,
 	CPUHP_NOTF_ERR_INJ_PREPARE,
 	CPUHP_MIPS_SOC_PREPARE,
-- 
2.10.2

  parent reply	other threads:[~2016-11-26 23:16 UTC|newest]

Thread overview: 131+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-11-26 23:13 cpu hotplug: convert more drivers (batch #6 and last) Sebastian Andrzej Siewior
2016-11-26 23:13 ` [PATCH 01/22] cpufreq/acpi-cpufreq: Convert to hotplug state machine Sebastian Andrzej Siewior
2016-11-28  5:15   ` Viresh Kumar
2016-11-28  9:49     ` Sebastian Andrzej Siewior
2016-11-28  9:51       ` [PATCH 01/22 v2] " Sebastian Andrzej Siewior
2016-11-28  9:54         ` Viresh Kumar
2016-11-28 12:46         ` Rafael J. Wysocki
2016-11-26 23:13 ` [PATCH 02/22] cpufreq/acpi-cpufreq: drop rdmsr_on_cpus() usage Sebastian Andrzej Siewior
2016-11-28  9:52   ` [PATCH 02/22 v2] " Sebastian Andrzej Siewior
2016-11-28  9:54     ` Viresh Kumar
2016-11-26 23:13 ` [PATCH 03/22] idle/intel: Remove superfluous SMP fuction call Sebastian Andrzej Siewior
2016-11-26 23:13 ` [PATCH 04/22] idle/intel: Convert to hotplug state machine Sebastian Andrzej Siewior
2016-11-28 17:29   ` Thomas Gleixner
2016-11-29  9:40     ` Sebastian Andrzej Siewior
2016-11-29  9:51       ` [PATCH 04/22 v2] " Sebastian Andrzej Siewior
2016-11-26 23:13 ` [PATCH 05/22] oprofile/nmi timer: " Sebastian Andrzej Siewior
2016-12-02  0:09   ` [tip:smp/hotplug] " tip-bot for Sebastian Andrzej Siewior
2016-11-26 23:13 ` [PATCH 06/22] tracing/rb: " Sebastian Andrzej Siewior
2016-12-02  0:10   ` [tip:smp/hotplug] " tip-bot for Sebastian Andrzej Siewior
2016-12-07 11:15     ` [linux-next] tracing/rb: NULL pointer dereference at trace_rb_cpu_prepare() Tetsuo Handa
2016-12-07 13:31       ` [PATCH] tracing/rb: init the CPU mask on allocation Sebastian Andrzej Siewior
2016-12-07 13:43         ` [tip:smp/hotplug] tracing/rb: Init " tip-bot for Sebastian Andrzej Siewior
2016-12-07 14:33         ` [PATCH] tracing/rb: init " Tetsuo Handa
2016-11-26 23:13 ` [PATCH 07/22] mm/vmstat: Drop get_online_cpus() from init_cpu_node_state/vmstat_cpu_dead() Sebastian Andrzej Siewior
2016-11-26 23:13   ` Sebastian Andrzej Siewior
2016-11-28  9:24   ` Michal Hocko
2016-11-28  9:24     ` Michal Hocko
2016-12-02  0:10   ` [tip:smp/hotplug] " tip-bot for Sebastian Andrzej Siewior
2016-11-26 23:13 ` [PATCH 08/22] mm/vmstat: Avoid on each online CPU loops Sebastian Andrzej Siewior
2016-11-26 23:13   ` Sebastian Andrzej Siewior
2016-11-28  9:28   ` Michal Hocko
2016-11-28  9:28     ` Michal Hocko
2016-11-29 14:08     ` Thomas Gleixner
2016-11-29 14:08       ` Thomas Gleixner
2016-11-29 14:44       ` Michal Hocko
2016-11-29 14:44         ` Michal Hocko
2016-11-29 14:51       ` [PATCH 08/22 v2] " Sebastian Andrzej Siewior
2016-11-29 14:51         ` Sebastian Andrzej Siewior
2016-11-29 15:20         ` Michal Hocko
2016-11-29 15:20           ` Michal Hocko
2016-12-02  0:11         ` [tip:smp/hotplug] " tip-bot for Sebastian Andrzej Siewior
2016-11-26 23:13 ` [PATCH 09/22] mm/vmstat: Convert to hotplug state machine Sebastian Andrzej Siewior
2016-11-26 23:13   ` Sebastian Andrzej Siewior
2016-11-29 14:52   ` [PATCH 09/22 v2] " Sebastian Andrzej Siewior
2016-11-29 14:52     ` Sebastian Andrzej Siewior
2016-12-02  0:11     ` [tip:smp/hotplug] " tip-bot for Sebastian Andrzej Siewior
2016-11-26 23:13 ` [PATCH 10/22] mm/zsmalloc: " Sebastian Andrzej Siewior
2016-11-26 23:13   ` Sebastian Andrzej Siewior
2016-12-02  0:12   ` [tip:smp/hotplug] " tip-bot for Sebastian Andrzej Siewior
2016-11-26 23:13 ` [PATCH 11/22] mm/zswap: Convert dst-mem " Sebastian Andrzej Siewior
2016-11-26 23:13   ` Sebastian Andrzej Siewior
2016-12-02  0:12   ` [tip:smp/hotplug] " tip-bot for Sebastian Andrzej Siewior
2016-11-26 23:13 ` [PATCH 12/22] mm/zswap: Convert pool " Sebastian Andrzej Siewior
2016-11-26 23:13   ` Sebastian Andrzej Siewior
2016-12-02  0:13   ` [tip:smp/hotplug] " tip-bot for Sebastian Andrzej Siewior
2016-11-26 23:13 ` [PATCH 13/22] iommu/vt-d: Convert " Sebastian Andrzej Siewior
2016-11-26 23:13   ` Sebastian Andrzej Siewior
2016-12-02  0:13   ` [tip:smp/hotplug] " tip-bot for Anna-Maria Gleixner
2016-11-26 23:13 ` [PATCH 14/22] mm/compaction: " Sebastian Andrzej Siewior
2016-11-26 23:13   ` Sebastian Andrzej Siewior
2016-12-02  0:14   ` [tip:smp/hotplug] " tip-bot for Anna-Maria Gleixner
2016-11-26 23:13 ` [PATCH 15/22] arm64/cpuinfo: Make hotplug notifier symmetric Sebastian Andrzej Siewior
2016-11-26 23:13   ` Sebastian Andrzej Siewior
2016-11-29 17:22   ` Suzuki K Poulose
2016-11-29 17:22     ` Suzuki K Poulose
2016-12-02  0:14   ` [tip:smp/hotplug] " tip-bot for Anna-Maria Gleixner
2016-11-26 23:13 ` [PATCH 16/22] arm64/cpuinfo: Convert to hotplug state machine Sebastian Andrzej Siewior
2016-11-26 23:13   ` Sebastian Andrzej Siewior
2016-11-29 17:26   ` Suzuki K Poulose
2016-11-29 17:26     ` Suzuki K Poulose
2016-12-02  0:15   ` [tip:smp/hotplug] " tip-bot for Anna-Maria Gleixner
2016-11-26 23:13 ` [PATCH 17/22] KVM/PPC/Book3S HV: " Sebastian Andrzej Siewior
2016-11-26 23:13   ` Sebastian Andrzej Siewior
2016-11-26 23:13   ` Sebastian Andrzej Siewior
2016-12-02  0:15   ` [tip:smp/hotplug] " tip-bot for Anna-Maria Gleixner
2016-11-26 23:13 ` Sebastian Andrzej Siewior [this message]
2016-12-02  0:16   ` [tip:smp/hotplug] zram: " tip-bot for Anna-Maria Gleixner
2016-11-26 23:13 ` [PATCH 19/22] soc/fsl/qbman: " Sebastian Andrzej Siewior
2016-12-02  0:16   ` [tip:smp/hotplug] " tip-bot for Sebastian Andrzej Siewior
2016-11-26 23:13 ` [PATCH 20/22] " Sebastian Andrzej Siewior
2016-12-02  0:17   ` [tip:smp/hotplug] " tip-bot for Sebastian Andrzej Siewior
2016-11-26 23:13 ` [PATCH 21/22] staging/lustre/libcfs: " Sebastian Andrzej Siewior
2016-11-26 23:14   ` [lustre-devel] " Sebastian Andrzej Siewior
2016-12-02 10:18   ` [PATCH 21/22 v2] " Sebastian Andrzej Siewior
2016-12-02 10:18     ` [lustre-devel] " Sebastian Andrzej Siewior
2016-12-02 10:42     ` Greg Kroah-Hartman
2016-12-02 10:42       ` [lustre-devel] " Greg Kroah-Hartman
2016-12-02 11:00       ` [PATCH 21/22 v3] " Sebastian Andrzej Siewior
2016-12-02 11:00         ` [lustre-devel] " Sebastian Andrzej Siewior
2016-11-26 23:13 ` [PATCH 22/22] Remove obsolete cpu hotplug register / unregister functions Sebastian Andrzej Siewior
2016-12-21 19:19 [patch 00/10] cpu/hotplug: Final cleanup Thomas Gleixner
2016-12-21 19:19 ` [patch 01/10] ARM: imx: mmcd: Fix broken cpu hotplug handling Thomas Gleixner
2016-12-22 20:18   ` [tip:smp/urgent] ARM/imx/mmcd: " tip-bot for Thomas Gleixner
2016-12-25 10:02   ` tip-bot for Thomas Gleixner
2016-12-21 19:19 ` [patch 02/10] cpu/hotplug: Prevent overwriting of callbacks Thomas Gleixner
2016-12-22 11:07   ` Thomas Gleixner
2016-12-26 23:04     ` ojab
2016-12-26 23:12       ` ojab
2016-12-22 20:21   ` [tip:smp/urgent] " tip-bot for Thomas Gleixner
2016-12-25 10:04   ` tip-bot for Thomas Gleixner
2016-12-21 19:19 ` [patch 03/10] scsi/bnx2fc: Convert to hotplug state machine Thomas Gleixner
2016-12-22 20:21   ` [tip:smp/urgent] " tip-bot for Sebastian Andrzej Siewior
2016-12-25 10:05   ` tip-bot for Sebastian Andrzej Siewior
2016-12-21 19:19 ` [patch 04/10] scsi/bnx2i: " Thomas Gleixner
2016-12-22 20:22   ` [tip:smp/urgent] " tip-bot for Sebastian Andrzej Siewior
2016-12-25 10:05   ` tip-bot for Sebastian Andrzej Siewior
2016-12-21 19:19 ` [patch 05/10] staging/lustre/libcfs: " Thomas Gleixner
2016-12-21 19:29   ` [lustre-devel] " Thomas Gleixner
2016-12-22 20:22   ` [tip:smp/urgent] " tip-bot for Anna-Maria Gleixner
2016-12-25 10:06   ` tip-bot for Anna-Maria Gleixner
2016-12-21 19:19 ` [patch 06/10] cpu/hotplug: Remove obsolete cpu hotplug register/unregister functions Thomas Gleixner
2016-12-22 20:23   ` [tip:smp/urgent] " tip-bot for Thomas Gleixner
2016-12-25 10:06   ` tip-bot for Thomas Gleixner
2016-12-21 19:19 ` [patch 07/10] cpu/hotplug: Cleanup state names Thomas Gleixner
2016-12-22 20:23   ` [tip:smp/urgent] " tip-bot for Thomas Gleixner
2016-12-25 10:07   ` tip-bot for Thomas Gleixner
2016-12-21 19:19 ` [patch 08/10] coresight: etm3/4x: Consolidate hotplug state space Thomas Gleixner
2016-12-22 16:30   ` Mathieu Poirier
2016-12-22 20:24   ` [tip:smp/urgent] coresight/etm3/4x: " tip-bot for Thomas Gleixner
2016-12-25 10:07   ` tip-bot for Thomas Gleixner
2016-12-21 19:19 ` [patch 09/10] irqchip/gic: " Thomas Gleixner
2016-12-22 20:24   ` [tip:smp/urgent] " tip-bot for Thomas Gleixner
2016-12-25 10:08   ` tip-bot for Thomas Gleixner
2016-12-21 19:19 ` [patch 10/10] irqchip/armada-xp: " Thomas Gleixner
2016-12-21 20:22   ` Thomas Petazzoni
2016-12-21 20:27     ` Thomas Gleixner
2016-12-22 20:25   ` [tip:smp/urgent] " tip-bot for Thomas Gleixner
2016-12-25 10:08   ` tip-bot for Thomas Gleixner
2016-12-22 17:59 ` [patch 00/10] cpu/hotplug: Final cleanup Sam Ravnborg
2016-12-27 11:17   ` Thomas Gleixner
2016-12-27 19:41     ` Sam Ravnborg

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20161126231350.10321-19-bigeasy@linutronix.de \
    --to=bigeasy@linutronix.de \
    --cc=anna-maria@linutronix.de \
    --cc=linux-kernel@vger.kernel.org \
    --cc=minchan@kernel.org \
    --cc=ngupta@vflare.org \
    --cc=rt@linutronix.de \
    --cc=sergey.senozhatsky.work@gmail.com \
    --cc=tglx@linutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.