linux-arch.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 [resend] 00/18] simplify generic cross CPU function call implementation
@ 2013-12-15 16:36 Jiang Liu
  2013-12-15 16:36 ` [PATCH v3 [resend] 01/18] Revert "kernel/smp.c: free related resources when failure occurs in hotplug_cfd()" Jiang Liu
                   ` (17 more replies)
  0 siblings, 18 replies; 33+ messages in thread
From: Jiang Liu @ 2013-12-15 16:36 UTC (permalink / raw)
  To: Andrew Morton, Shaohua Li
  Cc: Jiang Liu, Ingo Molnar, Peter Zijlstra, Steven Rostedt,
	Jiri Kosina, Wang YanQing, linux-kernel, linux-arch

Resend for collecting more Acks targetting v3.14 merge window.
Patch for ARC, MIPS and PARISC has been merged into v3.13.
Gained Acks for Metag, Hexagon, Tile and S390.

Since commit 9a46ad6d6df3b54 "smp: make smp_call_function_many() use
logic similar to smp_call_function_single()", single and multiple
(mask version) cross CPU function calls are handled in the same way,
and generic_smp_call_function_interrupt() becomes an aliases of
generic_smp_call_function_single_interrupt(), so only one interrupt
is needed for arch code to support generic SMP function call interfaces.
This patch series simplifies arch code by killing the redundant
interrupt for cross CPU function calls.

We choose to keep generic_smp_call_function_interrupt() instead of
generic_smp_call_function_single_interrupt() because the former is
more generic.

Jiang Liu (18):
  Revert "kernel/smp.c: free related resources when failure occurs in
    hotplug_cfd()"
  Revert "smp: Fix SMP function call empty cpu mask race"
  smp, alpha: kill SMP single function call interrupt
  smp, ARM: kill SMP single function call interrupt
  smp, ARM64: kill SMP single function call interrupt
  smp, blackfin: kill SMP single function call interrupt
  smp, IA64: kill SMP single function call interrupt
  smp, m32r: kill SMP single function call interrupt
  smp, mn10300: kill SMP single function call interrupt
  smp, mn10300: enable arch_send_call_function_ipi_mask()
  smp, sh: kill SMP single function call interrupt
  smp, sparc64: kill SMP single function call interrupt
  smp, sparc: kill SMP single function call interrupt
  smp, x86, xen: kill SMP single function call interrupt
  smp, x86: kill SMP single function call interrupt
  smp: cleanup unsued generic_smp_call_function_single_interrupt()
  smp: rename call_single_queue as call_function_queue
  SMP, trivial: remove unused code from smp_boot.h

 arch/alpha/kernel/smp.c                  |  8 +------
 arch/arm/include/asm/hardirq.h           |  2 +-
 arch/arm/kernel/smp.c                    | 10 +-------
 arch/arm64/include/asm/hardirq.h         |  2 +-
 arch/arm64/kernel/smp.c                  | 10 +-------
 arch/blackfin/mach-common/smp.c          |  6 +----
 arch/ia64/kernel/smp.c                   |  8 ++-----
 arch/m32r/include/asm/smp.h              |  1 -
 arch/m32r/kernel/smp.c                   |  9 +-------
 arch/m32r/kernel/traps.c                 |  3 +--
 arch/mn10300/include/asm/smp.h           |  2 +-
 arch/mn10300/kernel/smp.c                | 19 ++++++++--------
 arch/sh/include/asm/smp.h                |  1 -
 arch/sh/kernel/smp.c                     |  5 +---
 arch/sparc/include/asm/pil.h             |  5 ++--
 arch/sparc/include/asm/smp_32.h          |  4 +---
 arch/sparc/kernel/entry.S                | 10 ++------
 arch/sparc/kernel/leon_smp.c             | 31 ++++++-------------------
 arch/sparc/kernel/smp_32.c               | 14 ++----------
 arch/sparc/kernel/smp_64.c               | 11 +--------
 arch/sparc/kernel/sun4d_smp.c            | 31 ++++++-------------------
 arch/sparc/kernel/sun4m_smp.c            | 11 ++-------
 arch/sparc/kernel/ttable_64.S            | 12 ++++------
 arch/sparc/mm/ultra.S                    |  5 ----
 arch/x86/include/asm/entry_arch.h        |  1 -
 arch/x86/include/asm/hw_irq.h            |  3 ---
 arch/x86/include/asm/irq_vectors.h       |  7 +++---
 arch/x86/include/asm/trace/irq_vectors.h |  6 -----
 arch/x86/include/asm/xen/events.h        |  1 -
 arch/x86/kernel/entry_64.S               |  2 --
 arch/x86/kernel/irqinit.c                |  4 ----
 arch/x86/kernel/smp.c                    | 24 +-------------------
 arch/x86/xen/smp.c                       | 37 +-----------------------------
 include/linux/smp.h                      |  7 +++---
 include/linux/smpboot.h                  |  1 -
 kernel/smp.c                             | 39 ++++++++++----------------------
 36 files changed, 70 insertions(+), 282 deletions(-)

-- 
1.8.1.2

^ permalink raw reply	[flat|nested] 33+ messages in thread

* [PATCH v3 [resend] 01/18] Revert "kernel/smp.c: free related resources when failure occurs in hotplug_cfd()"
  2013-12-15 16:36 [PATCH v3 [resend] 00/18] simplify generic cross CPU function call implementation Jiang Liu
@ 2013-12-15 16:36 ` Jiang Liu
  2013-12-15 16:36 ` [PATCH v3 [resend] 02/18] Revert "smp: Fix SMP function call empty cpu mask race" Jiang Liu
                   ` (16 subsequent siblings)
  17 siblings, 0 replies; 33+ messages in thread
From: Jiang Liu @ 2013-12-15 16:36 UTC (permalink / raw)
  To: Andrew Morton, Shaohua Li, Ingo Molnar, Christoph Hellwig,
	Wang YanQing, Jiang Liu, linux-kernel
  Cc: Jiang Liu, Ingo Molnar, Peter Zijlstra, Steven Rostedt,
	Jiri Kosina, linux-arch

This reverts commit 60c323699bb308404dcb60e8808531e02651578a.

Commit 60c323699bb30840 fixes a bug introduced by f44310b98ddb7, and we
are going to revert f44310b98ddb7, so revert 60c323699bb30840 first.

Signed-off-by: Jiang Liu <liuj97@gmail.com>
---
 kernel/smp.c | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)

diff --git a/kernel/smp.c b/kernel/smp.c
index bd9f940..442d514 100644
--- a/kernel/smp.c
+++ b/kernel/smp.c
@@ -48,13 +48,10 @@ hotplug_cfd(struct notifier_block *nfb, unsigned long action, void *hcpu)
 				cpu_to_node(cpu)))
 			return notifier_from_errno(-ENOMEM);
 		if (!zalloc_cpumask_var_node(&cfd->cpumask_ipi, GFP_KERNEL,
-				cpu_to_node(cpu))) {
-			free_cpumask_var(cfd->cpumask);
+				cpu_to_node(cpu)))
 			return notifier_from_errno(-ENOMEM);
-		}
 		cfd->csd = alloc_percpu(struct call_single_data);
 		if (!cfd->csd) {
-			free_cpumask_var(cfd->cpumask_ipi);
 			free_cpumask_var(cfd->cpumask);
 			return notifier_from_errno(-ENOMEM);
 		}
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v3 [resend] 02/18] Revert "smp: Fix SMP function call empty cpu mask race"
  2013-12-15 16:36 [PATCH v3 [resend] 00/18] simplify generic cross CPU function call implementation Jiang Liu
  2013-12-15 16:36 ` [PATCH v3 [resend] 01/18] Revert "kernel/smp.c: free related resources when failure occurs in hotplug_cfd()" Jiang Liu
@ 2013-12-15 16:36 ` Jiang Liu
  2013-12-15 16:36 ` [PATCH v3 [resend] 03/18] smp, alpha: kill SMP single function call interrupt Jiang Liu
                   ` (15 subsequent siblings)
  17 siblings, 0 replies; 33+ messages in thread
From: Jiang Liu @ 2013-12-15 16:36 UTC (permalink / raw)
  To: Andrew Morton, Shaohua Li, Ingo Molnar, Christoph Hellwig,
	Wang YanQing, Jiang Liu, linux-kernel
  Cc: Jiang Liu, Ingo Molnar, Peter Zijlstra, Steven Rostedt,
	Jiri Kosina, linux-arch

This reverts commit f44310b98ddb7f0d06550d73ed67df5865e3eda5.

Commit f44310b98ddb7 "smp: Fix SMP function call empty cpu mask race"
introduced field call_function_data->cpumask_ipi to resolve a race
condition in smp_call_function_many().

Later commit 9a46ad6d6df3 "smp: make smp_call_function_many() use logic
similar to smp_call_function_single()" fixed the same issue in another
way when optimizing smp_call_function_many(), which then obsoletes
changes introduced by commit f44310b98ddb7. So revert it.

Acked-by: Wang YanQing <udknight@gmail.com>
Signed-off-by: Jiang Liu <liuj97@gmail.com>
---
 kernel/smp.c | 16 ++--------------
 1 file changed, 2 insertions(+), 14 deletions(-)

diff --git a/kernel/smp.c b/kernel/smp.c
index 442d514..25c19af 100644
--- a/kernel/smp.c
+++ b/kernel/smp.c
@@ -23,7 +23,6 @@ enum {
 struct call_function_data {
 	struct call_single_data	__percpu *csd;
 	cpumask_var_t		cpumask;
-	cpumask_var_t		cpumask_ipi;
 };
 
 static DEFINE_PER_CPU_SHARED_ALIGNED(struct call_function_data, cfd_data);
@@ -47,9 +46,6 @@ hotplug_cfd(struct notifier_block *nfb, unsigned long action, void *hcpu)
 		if (!zalloc_cpumask_var_node(&cfd->cpumask, GFP_KERNEL,
 				cpu_to_node(cpu)))
 			return notifier_from_errno(-ENOMEM);
-		if (!zalloc_cpumask_var_node(&cfd->cpumask_ipi, GFP_KERNEL,
-				cpu_to_node(cpu)))
-			return notifier_from_errno(-ENOMEM);
 		cfd->csd = alloc_percpu(struct call_single_data);
 		if (!cfd->csd) {
 			free_cpumask_var(cfd->cpumask);
@@ -64,7 +60,6 @@ hotplug_cfd(struct notifier_block *nfb, unsigned long action, void *hcpu)
 	case CPU_DEAD:
 	case CPU_DEAD_FROZEN:
 		free_cpumask_var(cfd->cpumask);
-		free_cpumask_var(cfd->cpumask_ipi);
 		free_percpu(cfd->csd);
 		break;
 #endif
@@ -245,9 +240,9 @@ int smp_call_function_single(int cpu, smp_call_func_t func, void *info,
 				csd = &__get_cpu_var(csd_data);
 
 			csd_lock(csd);
-
 			csd->func = func;
 			csd->info = info;
+
 			generic_exec_single(cpu, csd, wait);
 		} else {
 			err = -ENXIO;	/* CPU not online */
@@ -399,13 +394,6 @@ void smp_call_function_many(const struct cpumask *mask,
 	if (unlikely(!cpumask_weight(cfd->cpumask)))
 		return;
 
-	/*
-	 * After we put an entry into the list, cfd->cpumask may be cleared
-	 * again when another CPU sends another IPI for a SMP function call, so
-	 * cfd->cpumask will be zero.
-	 */
-	cpumask_copy(cfd->cpumask_ipi, cfd->cpumask);
-
 	for_each_cpu(cpu, cfd->cpumask) {
 		struct call_single_data *csd = per_cpu_ptr(cfd->csd, cpu);
 		struct call_single_queue *dst =
@@ -422,7 +410,7 @@ void smp_call_function_many(const struct cpumask *mask,
 	}
 
 	/* Send a message to all CPUs in the map */
-	arch_send_call_function_ipi_mask(cfd->cpumask_ipi);
+	arch_send_call_function_ipi_mask(cfd->cpumask);
 
 	if (wait) {
 		for_each_cpu(cpu, cfd->cpumask) {
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v3 [resend] 03/18] smp, alpha: kill SMP single function call interrupt
  2013-12-15 16:36 [PATCH v3 [resend] 00/18] simplify generic cross CPU function call implementation Jiang Liu
  2013-12-15 16:36 ` [PATCH v3 [resend] 01/18] Revert "kernel/smp.c: free related resources when failure occurs in hotplug_cfd()" Jiang Liu
  2013-12-15 16:36 ` [PATCH v3 [resend] 02/18] Revert "smp: Fix SMP function call empty cpu mask race" Jiang Liu
@ 2013-12-15 16:36 ` Jiang Liu
  2013-12-15 16:36   ` Jiang Liu
  2013-12-15 16:36 ` [PATCH v3 [resend] 04/18] smp, ARM: " Jiang Liu
                   ` (14 subsequent siblings)
  17 siblings, 1 reply; 33+ messages in thread
From: Jiang Liu @ 2013-12-15 16:36 UTC (permalink / raw)
  To: Andrew Morton, Shaohua Li, Richard Henderson, Ivan Kokshaysky,
	Matt Turner, Thomas Gleixner, Chen Gang, Paul Gortmaker,
	linux-alpha, linux-kernel
  Cc: Jiang Liu, Ingo Molnar, Peter Zijlstra, Steven Rostedt,
	Jiri Kosina, Wang YanQing, linux-arch

Commit 9a46ad6d6df3b54 "smp: make smp_call_function_many() use logic
similar to smp_call_function_single()" has unified the way to handle
single and multiple cross-CPU function calls. Now only one interrupt
is needed for architecture specific code to support generic SMP function
call interfaces, so kill the redundant single function call interrupt.

Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Shaohua Li <shli@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Jiri Kosina <trivial@kernel.org>
Cc: Richard Henderson <rth@twiddle.net>
Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
Cc: Matt Turner <mattst88@gmail.com>
Cc: linux-alpha@vger.kernel.org
Signed-off-by: Jiang Liu <liuj97@gmail.com>
---
 arch/alpha/kernel/smp.c | 8 +-------
 1 file changed, 1 insertion(+), 7 deletions(-)

diff --git a/arch/alpha/kernel/smp.c b/arch/alpha/kernel/smp.c
index 99ac36d..2f24447 100644
--- a/arch/alpha/kernel/smp.c
+++ b/arch/alpha/kernel/smp.c
@@ -63,7 +63,6 @@ static struct {
 enum ipi_message_type {
 	IPI_RESCHEDULE,
 	IPI_CALL_FUNC,
-	IPI_CALL_FUNC_SINGLE,
 	IPI_CPU_STOP,
 };
 
@@ -506,7 +505,6 @@ setup_profiling_timer(unsigned int multiplier)
 	return -EINVAL;
 }
 
-\f
 static void
 send_ipi_message(const struct cpumask *to_whom, enum ipi_message_type operation)
 {
@@ -552,10 +550,6 @@ handle_ipi(struct pt_regs *regs)
 			generic_smp_call_function_interrupt();
 			break;
 
-		case IPI_CALL_FUNC_SINGLE:
-			generic_smp_call_function_single_interrupt();
-			break;
-
 		case IPI_CPU_STOP:
 			halt();
 
@@ -606,7 +600,7 @@ void arch_send_call_function_ipi_mask(const struct cpumask *mask)
 
 void arch_send_call_function_single_ipi(int cpu)
 {
-	send_ipi_message(cpumask_of(cpu), IPI_CALL_FUNC_SINGLE);
+	send_ipi_message(cpumask_of(cpu), IPI_CALL_FUNC);
 }
 
 static void
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v3 [resend] 03/18] smp, alpha: kill SMP single function call interrupt
  2013-12-15 16:36 ` [PATCH v3 [resend] 03/18] smp, alpha: kill SMP single function call interrupt Jiang Liu
@ 2013-12-15 16:36   ` Jiang Liu
  0 siblings, 0 replies; 33+ messages in thread
From: Jiang Liu @ 2013-12-15 16:36 UTC (permalink / raw)
  To: Andrew Morton, Shaohua Li, Richard Henderson, Ivan Kokshaysky,
	Matt Turner, Thomas Gleixner, Chen Gang, Paul Gortmaker,
	linux-alpha, linux-kernel
  Cc: Jiang Liu, Ingo Molnar, Peter Zijlstra, Steven Rostedt,
	Jiri Kosina, Wang YanQing, linux-arch

Commit 9a46ad6d6df3b54 "smp: make smp_call_function_many() use logic
similar to smp_call_function_single()" has unified the way to handle
single and multiple cross-CPU function calls. Now only one interrupt
is needed for architecture specific code to support generic SMP function
call interfaces, so kill the redundant single function call interrupt.

Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Shaohua Li <shli@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Jiri Kosina <trivial@kernel.org>
Cc: Richard Henderson <rth@twiddle.net>
Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
Cc: Matt Turner <mattst88@gmail.com>
Cc: linux-alpha@vger.kernel.org
Signed-off-by: Jiang Liu <liuj97@gmail.com>
---
 arch/alpha/kernel/smp.c | 8 +-------
 1 file changed, 1 insertion(+), 7 deletions(-)

diff --git a/arch/alpha/kernel/smp.c b/arch/alpha/kernel/smp.c
index 99ac36d..2f24447 100644
--- a/arch/alpha/kernel/smp.c
+++ b/arch/alpha/kernel/smp.c
@@ -63,7 +63,6 @@ static struct {
 enum ipi_message_type {
 	IPI_RESCHEDULE,
 	IPI_CALL_FUNC,
-	IPI_CALL_FUNC_SINGLE,
 	IPI_CPU_STOP,
 };
 
@@ -506,7 +505,6 @@ setup_profiling_timer(unsigned int multiplier)
 	return -EINVAL;
 }
 
-\f
 static void
 send_ipi_message(const struct cpumask *to_whom, enum ipi_message_type operation)
 {
@@ -552,10 +550,6 @@ handle_ipi(struct pt_regs *regs)
 			generic_smp_call_function_interrupt();
 			break;
 
-		case IPI_CALL_FUNC_SINGLE:
-			generic_smp_call_function_single_interrupt();
-			break;
-
 		case IPI_CPU_STOP:
 			halt();
 
@@ -606,7 +600,7 @@ void arch_send_call_function_ipi_mask(const struct cpumask *mask)
 
 void arch_send_call_function_single_ipi(int cpu)
 {
-	send_ipi_message(cpumask_of(cpu), IPI_CALL_FUNC_SINGLE);
+	send_ipi_message(cpumask_of(cpu), IPI_CALL_FUNC);
 }
 
 static void
-- 
1.8.1.2


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v3 [resend] 04/18] smp, ARM: kill SMP single function call interrupt
  2013-12-15 16:36 [PATCH v3 [resend] 00/18] simplify generic cross CPU function call implementation Jiang Liu
                   ` (2 preceding siblings ...)
  2013-12-15 16:36 ` [PATCH v3 [resend] 03/18] smp, alpha: kill SMP single function call interrupt Jiang Liu
@ 2013-12-15 16:36 ` Jiang Liu
  2013-12-15 16:36 ` [PATCH v3 [resend] 05/18] smp, ARM64: " Jiang Liu
                   ` (13 subsequent siblings)
  17 siblings, 0 replies; 33+ messages in thread
From: Jiang Liu @ 2013-12-15 16:36 UTC (permalink / raw)
  To: Andrew Morton, Shaohua Li, Russell King, Stephen Boyd,
	Nicolas Pitre, Kevin Hilman, Will Deacon, Santosh Shilimkar,
	linux-arm-kernel, linux-kernel
  Cc: Jiang Liu, Ingo Molnar, Peter Zijlstra, Steven Rostedt,
	Jiri Kosina, Wang YanQing, linux-arch, Catalin Marinas,
	Arnd Bergmann

Commit 9a46ad6d6df3b54 "smp: make smp_call_function_many() use logic
similar to smp_call_function_single()" has unified the way to handle
single and multiple cross-CPU function calls. Now only one interrupt
is needed for architecture specific code to support generic SMP function
call interfaces, so kill the redundant single function call interrupt.

Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Shaohua Li <shli@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Jiri Kosina <trivial@kernel.org>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: linux-arm-kernel@lists.infradead.org
Cc: Russell King <linux@arm.linux.org.uk>
Cc: Will Deacon <will.deacon@arm.com>
Cc: Santosh Shilimkar <santosh.shilimkar@ti.com>
Signed-off-by: Jiang Liu <liuj97@gmail.com>
---
 arch/arm/include/asm/hardirq.h |  2 +-
 arch/arm/kernel/smp.c          | 10 +---------
 2 files changed, 2 insertions(+), 10 deletions(-)

diff --git a/arch/arm/include/asm/hardirq.h b/arch/arm/include/asm/hardirq.h
index fe3ea77..3d7351c 100644
--- a/arch/arm/include/asm/hardirq.h
+++ b/arch/arm/include/asm/hardirq.h
@@ -5,7 +5,7 @@
 #include <linux/threads.h>
 #include <asm/irq.h>
 
-#define NR_IPI	8
+#define NR_IPI	7
 
 typedef struct {
 	unsigned int __softirq_pending;
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c
index dc894ab..e24a23d 100644
--- a/arch/arm/kernel/smp.c
+++ b/arch/arm/kernel/smp.c
@@ -65,7 +65,6 @@ enum ipi_msg_type {
 	IPI_TIMER,
 	IPI_RESCHEDULE,
 	IPI_CALL_FUNC,
-	IPI_CALL_FUNC_SINGLE,
 	IPI_CPU_STOP,
 	IPI_IRQ_WORK,
 	IPI_COMPLETION,
@@ -448,7 +447,7 @@ void arch_send_wakeup_ipi_mask(const struct cpumask *mask)
 
 void arch_send_call_function_single_ipi(int cpu)
 {
-	smp_cross_call(cpumask_of(cpu), IPI_CALL_FUNC_SINGLE);
+	smp_cross_call(cpumask_of(cpu), IPI_CALL_FUNC);
 }
 
 #ifdef CONFIG_IRQ_WORK
@@ -465,7 +464,6 @@ static const char *ipi_types[NR_IPI] = {
 	S(IPI_TIMER, "Timer broadcast interrupts"),
 	S(IPI_RESCHEDULE, "Rescheduling interrupts"),
 	S(IPI_CALL_FUNC, "Function call interrupts"),
-	S(IPI_CALL_FUNC_SINGLE, "Single function call interrupts"),
 	S(IPI_CPU_STOP, "CPU stop interrupts"),
 	S(IPI_IRQ_WORK, "IRQ work interrupts"),
 	S(IPI_COMPLETION, "completion interrupts"),
@@ -579,12 +577,6 @@ void handle_IPI(int ipinr, struct pt_regs *regs)
 		irq_exit();
 		break;
 
-	case IPI_CALL_FUNC_SINGLE:
-		irq_enter();
-		generic_smp_call_function_single_interrupt();
-		irq_exit();
-		break;
-
 	case IPI_CPU_STOP:
 		irq_enter();
 		ipi_cpu_stop(cpu);
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v3 [resend] 05/18] smp, ARM64: kill SMP single function call interrupt
  2013-12-15 16:36 [PATCH v3 [resend] 00/18] simplify generic cross CPU function call implementation Jiang Liu
                   ` (3 preceding siblings ...)
  2013-12-15 16:36 ` [PATCH v3 [resend] 04/18] smp, ARM: " Jiang Liu
@ 2013-12-15 16:36 ` Jiang Liu
  2013-12-17 17:16   ` Will Deacon
  2013-12-15 16:36 ` [PATCH v3 [resend] 06/18] smp, blackfin: " Jiang Liu
                   ` (12 subsequent siblings)
  17 siblings, 1 reply; 33+ messages in thread
From: Jiang Liu @ 2013-12-15 16:36 UTC (permalink / raw)
  To: Andrew Morton, Shaohua Li, Catalin Marinas, Will Deacon,
	Mark Rutland, Javi Merino, Marc Zyngier, linux-arm-kernel,
	linux-kernel
  Cc: Jiang Liu, Ingo Molnar, Peter Zijlstra, Steven Rostedt,
	Jiri Kosina, Wang YanQing, linux-arch, Arnd Bergmann

Commit 9a46ad6d6df3b54 "smp: make smp_call_function_many() use logic
similar to smp_call_function_single()" has unified the way to handle
single and multiple cross-CPU function calls. Now only one interrupt
is needed for architecture specific code to support generic SMP function
call interfaces, so kill the redundant single function call interrupt.

Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Shaohua Li <shli@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Jiri Kosina <trivial@kernel.org>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: linux-arm-kernel@lists.infradead.org
Signed-off-by: Jiang Liu <liuj97@gmail.com>
---
 arch/arm64/include/asm/hardirq.h |  2 +-
 arch/arm64/kernel/smp.c          | 10 +---------
 2 files changed, 2 insertions(+), 10 deletions(-)

diff --git a/arch/arm64/include/asm/hardirq.h b/arch/arm64/include/asm/hardirq.h
index 990c051..3be64c8 100644
--- a/arch/arm64/include/asm/hardirq.h
+++ b/arch/arm64/include/asm/hardirq.h
@@ -20,7 +20,7 @@
 #include <linux/threads.h>
 #include <asm/irq.h>
 
-#define NR_IPI	4
+#define NR_IPI	3
 
 typedef struct {
 	unsigned int __softirq_pending;
diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c
index a0c2ca6..ea3e9ab 100644
--- a/arch/arm64/kernel/smp.c
+++ b/arch/arm64/kernel/smp.c
@@ -59,7 +59,6 @@ struct secondary_data secondary_data;
 enum ipi_msg_type {
 	IPI_RESCHEDULE,
 	IPI_CALL_FUNC,
-	IPI_CALL_FUNC_SINGLE,
 	IPI_CPU_STOP,
 };
 
@@ -438,14 +437,13 @@ void arch_send_call_function_ipi_mask(const struct cpumask *mask)
 
 void arch_send_call_function_single_ipi(int cpu)
 {
-	smp_cross_call(cpumask_of(cpu), IPI_CALL_FUNC_SINGLE);
+	smp_cross_call(cpumask_of(cpu), IPI_CALL_FUNC);
 }
 
 static const char *ipi_types[NR_IPI] = {
 #define S(x,s)	[x - IPI_RESCHEDULE] = s
 	S(IPI_RESCHEDULE, "Rescheduling interrupts"),
 	S(IPI_CALL_FUNC, "Function call interrupts"),
-	S(IPI_CALL_FUNC_SINGLE, "Single function call interrupts"),
 	S(IPI_CPU_STOP, "CPU stop interrupts"),
 };
 
@@ -520,12 +518,6 @@ void handle_IPI(int ipinr, struct pt_regs *regs)
 		irq_exit();
 		break;
 
-	case IPI_CALL_FUNC_SINGLE:
-		irq_enter();
-		generic_smp_call_function_single_interrupt();
-		irq_exit();
-		break;
-
 	case IPI_CPU_STOP:
 		irq_enter();
 		ipi_cpu_stop(cpu);
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v3 [resend] 06/18] smp, blackfin: kill SMP single function call interrupt
  2013-12-15 16:36 [PATCH v3 [resend] 00/18] simplify generic cross CPU function call implementation Jiang Liu
                   ` (4 preceding siblings ...)
  2013-12-15 16:36 ` [PATCH v3 [resend] 05/18] smp, ARM64: " Jiang Liu
@ 2013-12-15 16:36 ` Jiang Liu
  2013-12-15 16:36 ` [PATCH v3 [resend] 07/18] smp, IA64: " Jiang Liu
                   ` (11 subsequent siblings)
  17 siblings, 0 replies; 33+ messages in thread
From: Jiang Liu @ 2013-12-15 16:36 UTC (permalink / raw)
  To: Andrew Morton, Shaohua Li, Mike Frysinger, Steven Miao,
	Thomas Gleixner, Paul Gortmaker, Geert Uytterhoeven,
	uclinux-dist-devel, linux-kernel
  Cc: Jiang Liu, Ingo Molnar, Peter Zijlstra, Steven Rostedt,
	Jiri Kosina, Wang YanQing, linux-arch

Commit 9a46ad6d6df3b54 "smp: make smp_call_function_many() use logic
similar to smp_call_function_single()" has unified the way to handle
single and multiple cross-CPU function calls. Now only one interrupt
is needed for architecture specific code to support generic SMP function
call interfaces, so kill the redundant single function call interrupt.

Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Shaohua Li <shli@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Jiri Kosina <trivial@kernel.org>
Cc: Mike Frysinger <vapier@gentoo.org>
Cc: uclinux-dist-devel@blackfin.uclinux.org
Signed-off-by: Jiang Liu <liuj97@gmail.com>
---
 arch/blackfin/mach-common/smp.c | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)

diff --git a/arch/blackfin/mach-common/smp.c b/arch/blackfin/mach-common/smp.c
index 2bbae07..ba6c30d 100644
--- a/arch/blackfin/mach-common/smp.c
+++ b/arch/blackfin/mach-common/smp.c
@@ -53,7 +53,6 @@ enum ipi_message_type {
 	BFIN_IPI_TIMER,
 	BFIN_IPI_RESCHEDULE,
 	BFIN_IPI_CALL_FUNC,
-	BFIN_IPI_CALL_FUNC_SINGLE,
 	BFIN_IPI_CPU_STOP,
 };
 
@@ -162,9 +161,6 @@ static irqreturn_t ipi_handler_int1(int irq, void *dev_instance)
 			case BFIN_IPI_CALL_FUNC:
 				generic_smp_call_function_interrupt();
 				break;
-			case BFIN_IPI_CALL_FUNC_SINGLE:
-				generic_smp_call_function_single_interrupt();
-				break;
 			case BFIN_IPI_CPU_STOP:
 				ipi_cpu_stop(cpu);
 				break;
@@ -210,7 +206,7 @@ void send_ipi(const struct cpumask *cpumask, enum ipi_message_type msg)
 
 void arch_send_call_function_single_ipi(int cpu)
 {
-	send_ipi(cpumask_of(cpu), BFIN_IPI_CALL_FUNC_SINGLE);
+	send_ipi(cpumask_of(cpu), BFIN_IPI_CALL_FUNC);
 }
 
 void arch_send_call_function_ipi_mask(const struct cpumask *mask)
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v3 [resend] 07/18] smp, IA64: kill SMP single function call interrupt
  2013-12-15 16:36 [PATCH v3 [resend] 00/18] simplify generic cross CPU function call implementation Jiang Liu
                   ` (5 preceding siblings ...)
  2013-12-15 16:36 ` [PATCH v3 [resend] 06/18] smp, blackfin: " Jiang Liu
@ 2013-12-15 16:36 ` Jiang Liu
  2013-12-15 16:36   ` Jiang Liu
  2013-12-15 16:36 ` [PATCH v3 [resend] 08/18] smp, m32r: " Jiang Liu
                   ` (10 subsequent siblings)
  17 siblings, 1 reply; 33+ messages in thread
From: Jiang Liu @ 2013-12-15 16:36 UTC (permalink / raw)
  To: Andrew Morton, Shaohua Li, Tony Luck, Fenghua Yu, linux-ia64,
	linux-kernel
  Cc: Jiang Liu, Ingo Molnar, Peter Zijlstra, Steven Rostedt,
	Jiri Kosina, Wang YanQing, linux-arch

Commit 9a46ad6d6df3b54 "smp: make smp_call_function_many() use logic
similar to smp_call_function_single()" has unified the way to handle
single and multiple cross-CPU function calls. Now only one interrupt
is needed for architecture specific code to support generic SMP function
call interfaces, so kill the redundant single function call interrupt.

Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Shaohua Li <shli@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Jiri Kosina <trivial@kernel.org>
Cc: Tony Luck <tony.luck@intel.com>
Cc: Fenghua Yu <fenghua.yu@intel.com>
Cc: linux-ia64@vger.kernel.org
Signed-off-by: Jiang Liu <liuj97@gmail.com>
---
 arch/ia64/kernel/smp.c | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/arch/ia64/kernel/smp.c b/arch/ia64/kernel/smp.c
index 9fcd4e6..0532909 100644
--- a/arch/ia64/kernel/smp.c
+++ b/arch/ia64/kernel/smp.c
@@ -62,8 +62,7 @@ static DEFINE_PER_CPU_SHARED_ALIGNED(unsigned short [NR_CPUS],
 
 #define IPI_CALL_FUNC		0
 #define IPI_CPU_STOP		1
-#define IPI_CALL_FUNC_SINGLE	2
-#define IPI_KDUMP_CPU_STOP	3
+#define IPI_KDUMP_CPU_STOP	2
 
 /* This needs to be cacheline aligned because it is written to by *other* CPUs.  */
 static DEFINE_PER_CPU_SHARED_ALIGNED(unsigned long, ipi_operation);
@@ -116,9 +115,6 @@ handle_IPI (int irq, void *dev_id)
 			case IPI_CALL_FUNC:
 				generic_smp_call_function_interrupt();
 				break;
-			case IPI_CALL_FUNC_SINGLE:
-				generic_smp_call_function_single_interrupt();
-				break;
 #ifdef CONFIG_KEXEC
 			case IPI_KDUMP_CPU_STOP:
 				unw_init_running(kdump_cpu_freeze, NULL);
@@ -318,7 +314,7 @@ smp_flush_tlb_mm (struct mm_struct *mm)
 
 void arch_send_call_function_single_ipi(int cpu)
 {
-	send_IPI_single(cpu, IPI_CALL_FUNC_SINGLE);
+	send_IPI_single(cpu, IPI_CALL_FUNC);
 }
 
 void arch_send_call_function_ipi_mask(const struct cpumask *mask)
-- 
1.8.1.2


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v3 [resend] 07/18] smp, IA64: kill SMP single function call interrupt
  2013-12-15 16:36 ` [PATCH v3 [resend] 07/18] smp, IA64: " Jiang Liu
@ 2013-12-15 16:36   ` Jiang Liu
  0 siblings, 0 replies; 33+ messages in thread
From: Jiang Liu @ 2013-12-15 16:36 UTC (permalink / raw)
  To: Andrew Morton, Shaohua Li, Tony Luck, Fenghua Yu, linux-ia64,
	linux-kernel
  Cc: Jiang Liu, Ingo Molnar, Peter Zijlstra, Steven Rostedt,
	Jiri Kosina, Wang YanQing, linux-arch

Commit 9a46ad6d6df3b54 "smp: make smp_call_function_many() use logic
similar to smp_call_function_single()" has unified the way to handle
single and multiple cross-CPU function calls. Now only one interrupt
is needed for architecture specific code to support generic SMP function
call interfaces, so kill the redundant single function call interrupt.

Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Shaohua Li <shli@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Jiri Kosina <trivial@kernel.org>
Cc: Tony Luck <tony.luck@intel.com>
Cc: Fenghua Yu <fenghua.yu@intel.com>
Cc: linux-ia64@vger.kernel.org
Signed-off-by: Jiang Liu <liuj97@gmail.com>
---
 arch/ia64/kernel/smp.c | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/arch/ia64/kernel/smp.c b/arch/ia64/kernel/smp.c
index 9fcd4e6..0532909 100644
--- a/arch/ia64/kernel/smp.c
+++ b/arch/ia64/kernel/smp.c
@@ -62,8 +62,7 @@ static DEFINE_PER_CPU_SHARED_ALIGNED(unsigned short [NR_CPUS],
 
 #define IPI_CALL_FUNC		0
 #define IPI_CPU_STOP		1
-#define IPI_CALL_FUNC_SINGLE	2
-#define IPI_KDUMP_CPU_STOP	3
+#define IPI_KDUMP_CPU_STOP	2
 
 /* This needs to be cacheline aligned because it is written to by *other* CPUs.  */
 static DEFINE_PER_CPU_SHARED_ALIGNED(unsigned long, ipi_operation);
@@ -116,9 +115,6 @@ handle_IPI (int irq, void *dev_id)
 			case IPI_CALL_FUNC:
 				generic_smp_call_function_interrupt();
 				break;
-			case IPI_CALL_FUNC_SINGLE:
-				generic_smp_call_function_single_interrupt();
-				break;
 #ifdef CONFIG_KEXEC
 			case IPI_KDUMP_CPU_STOP:
 				unw_init_running(kdump_cpu_freeze, NULL);
@@ -318,7 +314,7 @@ smp_flush_tlb_mm (struct mm_struct *mm)
 
 void arch_send_call_function_single_ipi(int cpu)
 {
-	send_IPI_single(cpu, IPI_CALL_FUNC_SINGLE);
+	send_IPI_single(cpu, IPI_CALL_FUNC);
 }
 
 void arch_send_call_function_ipi_mask(const struct cpumask *mask)
-- 
1.8.1.2


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v3 [resend] 08/18] smp, m32r: kill SMP single function call interrupt
  2013-12-15 16:36 [PATCH v3 [resend] 00/18] simplify generic cross CPU function call implementation Jiang Liu
                   ` (6 preceding siblings ...)
  2013-12-15 16:36 ` [PATCH v3 [resend] 07/18] smp, IA64: " Jiang Liu
@ 2013-12-15 16:36 ` Jiang Liu
  2013-12-15 16:36 ` [PATCH v3 [resend] 09/18] smp, mn10300: " Jiang Liu
                   ` (9 subsequent siblings)
  17 siblings, 0 replies; 33+ messages in thread
From: Jiang Liu @ 2013-12-15 16:36 UTC (permalink / raw)
  To: Andrew Morton, Shaohua Li, Hirokazu Takata, Vineet Gupta,
	Jesper Nilsson, Jiri Kosina, Martin Schwidefsky, linux-m32r,
	linux-m32r-ja, linux-kernel
  Cc: Jiang Liu, Ingo Molnar, Peter Zijlstra, Steven Rostedt,
	Jiri Kosina, Wang YanQing, linux-arch

Commit 9a46ad6d6df3b54 "smp: make smp_call_function_many() use logic
similar to smp_call_function_single()" has unified the way to handle
single and multiple cross-CPU function calls. Now only one interrupt
is needed for architecture specific code to support generic SMP function
call interfaces, so kill the redundant single function call interrupt.

Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Shaohua Li <shli@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Jiri Kosina <trivial@kernel.org>
Cc: Hirokazu Takata <takata@linux-m32r.org>
Cc: linux-m32r@ml.linux-m32r.org
Cc: linux-m32r-ja@ml.linux-m32r.org
Signed-off-by: Jiang Liu <liuj97@gmail.com>
---
 arch/m32r/include/asm/smp.h | 1 -
 arch/m32r/kernel/smp.c      | 9 +--------
 arch/m32r/kernel/traps.c    | 3 +--
 3 files changed, 2 insertions(+), 11 deletions(-)

diff --git a/arch/m32r/include/asm/smp.h b/arch/m32r/include/asm/smp.h
index c689b82..3a502d4 100644
--- a/arch/m32r/include/asm/smp.h
+++ b/arch/m32r/include/asm/smp.h
@@ -98,7 +98,6 @@ extern void arch_send_call_function_ipi_mask(const struct cpumask *mask);
 #define LOCAL_TIMER_IPI		(M32R_IRQ_IPI3-M32R_IRQ_IPI0)
 #define INVALIDATE_CACHE_IPI	(M32R_IRQ_IPI4-M32R_IRQ_IPI0)
 #define CPU_BOOT_IPI		(M32R_IRQ_IPI5-M32R_IRQ_IPI0)
-#define CALL_FUNC_SINGLE_IPI	(M32R_IRQ_IPI6-M32R_IRQ_IPI0)
 
 #define IPI_SHIFT	(0)
 #define NR_IPIS		(8)
diff --git a/arch/m32r/kernel/smp.c b/arch/m32r/kernel/smp.c
index ce7aea3..c6d0bb9 100644
--- a/arch/m32r/kernel/smp.c
+++ b/arch/m32r/kernel/smp.c
@@ -542,7 +542,7 @@ void arch_send_call_function_ipi_mask(const struct cpumask *mask)
 
 void arch_send_call_function_single_ipi(int cpu)
 {
-	send_IPI_mask(cpumask_of(cpu), CALL_FUNC_SINGLE_IPI, 0);
+	send_IPI_mask(cpumask_of(cpu), CALL_FUNCTION_IPI, 0);
 }
 
 /*==========================================================================*
@@ -569,13 +569,6 @@ void smp_call_function_interrupt(void)
 	irq_exit();
 }
 
-void smp_call_function_single_interrupt(void)
-{
-	irq_enter();
-	generic_smp_call_function_single_interrupt();
-	irq_exit();
-}
-
 /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/
 /* Timer Routines                                                            */
 /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/
diff --git a/arch/m32r/kernel/traps.c b/arch/m32r/kernel/traps.c
index a7a424f..f5d911d 100644
--- a/arch/m32r/kernel/traps.c
+++ b/arch/m32r/kernel/traps.c
@@ -39,7 +39,6 @@ extern void smp_invalidate_interrupt(void);
 extern void smp_call_function_interrupt(void);
 extern void smp_ipi_timer_interrupt(void);
 extern void smp_flush_cache_all_interrupt(void);
-extern void smp_call_function_single_interrupt(void);
 
 /*
  * for Boot AP function
@@ -104,7 +103,7 @@ static void set_eit_vector_entries(void)
 	eit_vector[187] = (unsigned long)smp_ipi_timer_interrupt;
 	eit_vector[188] = (unsigned long)smp_flush_cache_all_interrupt;
 	eit_vector[189] = 0;	/* CPU_BOOT_IPI */
-	eit_vector[190] = (unsigned long)smp_call_function_single_interrupt;
+	eit_vector[190] = 0;
 	eit_vector[191] = 0;
 #endif
 	_flush_cache_copyback_all();
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v3 [resend] 09/18] smp, mn10300: kill SMP single function call interrupt
  2013-12-15 16:36 [PATCH v3 [resend] 00/18] simplify generic cross CPU function call implementation Jiang Liu
                   ` (7 preceding siblings ...)
  2013-12-15 16:36 ` [PATCH v3 [resend] 08/18] smp, m32r: " Jiang Liu
@ 2013-12-15 16:36 ` Jiang Liu
  2013-12-15 16:36 ` [PATCH v3 [resend] 10/18] smp, mn10300: enable arch_send_call_function_ipi_mask() Jiang Liu
                   ` (8 subsequent siblings)
  17 siblings, 0 replies; 33+ messages in thread
From: Jiang Liu @ 2013-12-15 16:36 UTC (permalink / raw)
  To: Andrew Morton, Shaohua Li, David Howells, Koichi Yasutake,
	Geert Uytterhoeven, David Daney, Thomas Gleixner,
	Srivatsa S. Bhat, Greg Kroah-Hartman, linux-am33-list,
	linux-kernel
  Cc: Jiang Liu, Ingo Molnar, Peter Zijlstra, Steven Rostedt,
	Jiri Kosina, Wang YanQing, linux-arch

Rename CALL_FUNC_SINGLE_IPI as CALL_FUNC_IPI to prepare for
killing generic_smp_call_function_single_interrupt().

Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Shaohua Li <shli@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Jiri Kosina <trivial@kernel.org>
Cc: David Howells <dhowells@redhat.com>
Cc: Koichi Yasutake <yasutake.koichi@jp.panasonic.com>
Cc: linux-am33-list@redhat.com
Signed-off-by: Jiang Liu <liuj97@gmail.com>
---
 arch/mn10300/include/asm/smp.h |  2 +-
 arch/mn10300/kernel/smp.c      | 16 ++++++++--------
 2 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/arch/mn10300/include/asm/smp.h b/arch/mn10300/include/asm/smp.h
index 56c4241..8e689d1 100644
--- a/arch/mn10300/include/asm/smp.h
+++ b/arch/mn10300/include/asm/smp.h
@@ -31,7 +31,7 @@
 #include <proc/smp-regs.h>
 
 #define RESCHEDULE_IPI		63
-#define CALL_FUNC_SINGLE_IPI	192
+#define CALL_FUNC_IPI		192
 #define LOCAL_TIMER_IPI		193
 #define FLUSH_CACHE_IPI		194
 #define CALL_FUNCTION_NMI_IPI	195
diff --git a/arch/mn10300/kernel/smp.c b/arch/mn10300/kernel/smp.c
index a17f9c9..7ae353d 100644
--- a/arch/mn10300/kernel/smp.c
+++ b/arch/mn10300/kernel/smp.c
@@ -164,11 +164,11 @@ static void init_ipi(void)
 	mn10300_ipi_enable(RESCHEDULE_IPI);
 
 	/* set up the call function IPI */
-	irq_set_chip_and_handler(CALL_FUNC_SINGLE_IPI, &mn10300_ipi_type,
+	irq_set_chip_and_handler(CALL_FUNC_IPI, &mn10300_ipi_type,
 				 handle_percpu_irq);
-	setup_irq(CALL_FUNC_SINGLE_IPI, &call_function_ipi);
-	set_intr_level(CALL_FUNC_SINGLE_IPI, CALL_FUNCTION_GxICR_LV);
-	mn10300_ipi_enable(CALL_FUNC_SINGLE_IPI);
+	setup_irq(CALL_FUNC_IPI, &call_function_ipi);
+	set_intr_level(CALL_FUNC_IPI, CALL_FUNCTION_GxICR_LV);
+	mn10300_ipi_enable(CALL_FUNC_IPI);
 
 	/* set up the local timer IPI */
 #if !defined(CONFIG_GENERIC_CLOCKEVENTS) || \
@@ -362,7 +362,7 @@ void arch_send_call_function_ipi_mask(const struct cpumask *mask)
 
 void arch_send_call_function_single_ipi(int cpu)
 {
-	send_IPI_mask(cpumask_of(cpu), CALL_FUNC_SINGLE_IPI);
+	send_IPI_mask(cpumask_of(cpu), CALL_FUNC_IPI);
 }
 
 /**
@@ -519,7 +519,7 @@ static irqreturn_t smp_reschedule_interrupt(int irq, void *dev_id)
 static irqreturn_t smp_call_function_interrupt(int irq, void *dev_id)
 {
 	/* generic_smp_call_function_interrupt(); */
-	generic_smp_call_function_single_interrupt();
+	generic_smp_call_function_interrupt();
 	return IRQ_HANDLED;
 }
 
@@ -598,8 +598,8 @@ static void __init smp_cpu_init(void)
 	/* Force FPU initialization */
 	clear_using_fpu(current);
 
-	GxICR(CALL_FUNC_SINGLE_IPI) = CALL_FUNCTION_GxICR_LV | GxICR_DETECT;
-	mn10300_ipi_enable(CALL_FUNC_SINGLE_IPI);
+	GxICR(CALL_FUNC_IPI) = CALL_FUNCTION_GxICR_LV | GxICR_DETECT;
+	mn10300_ipi_enable(CALL_FUNC_IPI);
 
 	GxICR(LOCAL_TIMER_IPI) = LOCAL_TIMER_GxICR_LV | GxICR_DETECT;
 	mn10300_ipi_enable(LOCAL_TIMER_IPI);
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v3 [resend] 10/18] smp, mn10300: enable arch_send_call_function_ipi_mask()
  2013-12-15 16:36 [PATCH v3 [resend] 00/18] simplify generic cross CPU function call implementation Jiang Liu
                   ` (8 preceding siblings ...)
  2013-12-15 16:36 ` [PATCH v3 [resend] 09/18] smp, mn10300: " Jiang Liu
@ 2013-12-15 16:36 ` Jiang Liu
  2013-12-15 16:36 ` [PATCH v3 [resend] 11/18] smp, sh: kill SMP single function call interrupt Jiang Liu
                   ` (7 subsequent siblings)
  17 siblings, 0 replies; 33+ messages in thread
From: Jiang Liu @ 2013-12-15 16:36 UTC (permalink / raw)
  To: Andrew Morton, Shaohua Li, David Howells, Koichi Yasutake,
	Thomas Gleixner, Srivatsa S. Bhat, Greg Kroah-Hartman,
	linux-am33-list, linux-kernel
  Cc: Jiang Liu, Ingo Molnar, Peter Zijlstra, Steven Rostedt,
	Jiri Kosina, Wang YanQing, linux-arch

Enable arch_send_call_function_ipi_mask() on mn10300 to support
smp_call_function_many().

Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Shaohua Li <shli@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Jiri Kosina <trivial@kernel.org>
Cc: David Howells <dhowells@redhat.com>
Cc: Koichi Yasutake <yasutake.koichi@jp.panasonic.com>
Cc: linux-am33-list@redhat.com
Signed-off-by: Jiang Liu <liuj97@gmail.com>
---
 arch/mn10300/kernel/smp.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/arch/mn10300/kernel/smp.c b/arch/mn10300/kernel/smp.c
index 7ae353d..b827b68 100644
--- a/arch/mn10300/kernel/smp.c
+++ b/arch/mn10300/kernel/smp.c
@@ -356,8 +356,7 @@ void send_IPI_allbutself(int irq)
 
 void arch_send_call_function_ipi_mask(const struct cpumask *mask)
 {
-	BUG();
-	/*send_IPI_mask(mask, CALL_FUNCTION_IPI);*/
+	send_IPI_mask(mask, CALL_FUNC_IPI);
 }
 
 void arch_send_call_function_single_ipi(int cpu)
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v3 [resend] 11/18] smp, sh: kill SMP single function call interrupt
  2013-12-15 16:36 [PATCH v3 [resend] 00/18] simplify generic cross CPU function call implementation Jiang Liu
                   ` (9 preceding siblings ...)
  2013-12-15 16:36 ` [PATCH v3 [resend] 10/18] smp, mn10300: enable arch_send_call_function_ipi_mask() Jiang Liu
@ 2013-12-15 16:36 ` Jiang Liu
  2013-12-15 16:36   ` Jiang Liu
  2013-12-15 16:36 ` [PATCH v3 [resend] 12/18] smp, sparc64: " Jiang Liu
                   ` (6 subsequent siblings)
  17 siblings, 1 reply; 33+ messages in thread
From: Jiang Liu @ 2013-12-15 16:36 UTC (permalink / raw)
  To: Andrew Morton, Shaohua Li, Paul Mundt, Thomas Gleixner,
	Paul Gortmaker, Srivatsa S. Bhat, linux-sh, linux-kernel
  Cc: Jiang Liu, Ingo Molnar, Peter Zijlstra, Steven Rostedt,
	Jiri Kosina, Wang YanQing, linux-arch

Commit 9a46ad6d6df3b54 "smp: make smp_call_function_many() use logic
similar to smp_call_function_single()" has unified the way to handle
single and multiple cross-CPU function calls. Now only one interrupt
is needed for architecture specific code to support generic SMP function
call interfaces, so kill the redundant single function call interrupt.

Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Shaohua Li <shli@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Jiri Kosina <trivial@kernel.org>
Cc: Paul Mundt <lethal@linux-sh.org>
Signed-off-by: Jiang Liu <liuj97@gmail.com>
---
 arch/sh/include/asm/smp.h | 1 -
 arch/sh/kernel/smp.c      | 5 +----
 2 files changed, 1 insertion(+), 5 deletions(-)

diff --git a/arch/sh/include/asm/smp.h b/arch/sh/include/asm/smp.h
index 78b0d0f4..93ce87b 100644
--- a/arch/sh/include/asm/smp.h
+++ b/arch/sh/include/asm/smp.h
@@ -25,7 +25,6 @@ extern int __cpu_logical_map[NR_CPUS];
 enum {
 	SMP_MSG_FUNCTION,
 	SMP_MSG_RESCHEDULE,
-	SMP_MSG_FUNCTION_SINGLE,
 	SMP_MSG_TIMER,
 
 	SMP_MSG_NR,	/* must be last */
diff --git a/arch/sh/kernel/smp.c b/arch/sh/kernel/smp.c
index 86a7936..c944d5d 100644
--- a/arch/sh/kernel/smp.c
+++ b/arch/sh/kernel/smp.c
@@ -282,7 +282,7 @@ void arch_send_call_function_ipi_mask(const struct cpumask *mask)
 
 void arch_send_call_function_single_ipi(int cpu)
 {
-	mp_ops->send_ipi(cpu, SMP_MSG_FUNCTION_SINGLE);
+	mp_ops->send_ipi(cpu, SMP_MSG_FUNCTION);
 }
 
 void smp_timer_broadcast(const struct cpumask *mask)
@@ -309,9 +309,6 @@ void smp_message_recv(unsigned int msg)
 	case SMP_MSG_RESCHEDULE:
 		scheduler_ipi();
 		break;
-	case SMP_MSG_FUNCTION_SINGLE:
-		generic_smp_call_function_single_interrupt();
-		break;
 	case SMP_MSG_TIMER:
 		ipi_timer();
 		break;
-- 
1.8.1.2


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v3 [resend] 11/18] smp, sh: kill SMP single function call interrupt
  2013-12-15 16:36 ` [PATCH v3 [resend] 11/18] smp, sh: kill SMP single function call interrupt Jiang Liu
@ 2013-12-15 16:36   ` Jiang Liu
  0 siblings, 0 replies; 33+ messages in thread
From: Jiang Liu @ 2013-12-15 16:36 UTC (permalink / raw)
  To: Andrew Morton, Shaohua Li, Paul Mundt, Thomas Gleixner,
	Paul Gortmaker, Srivatsa S. Bhat, linux-sh, linux-kernel
  Cc: Jiang Liu, Ingo Molnar, Peter Zijlstra, Steven Rostedt,
	Jiri Kosina, Wang YanQing, linux-arch

Commit 9a46ad6d6df3b54 "smp: make smp_call_function_many() use logic
similar to smp_call_function_single()" has unified the way to handle
single and multiple cross-CPU function calls. Now only one interrupt
is needed for architecture specific code to support generic SMP function
call interfaces, so kill the redundant single function call interrupt.

Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Shaohua Li <shli@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Jiri Kosina <trivial@kernel.org>
Cc: Paul Mundt <lethal@linux-sh.org>
Signed-off-by: Jiang Liu <liuj97@gmail.com>
---
 arch/sh/include/asm/smp.h | 1 -
 arch/sh/kernel/smp.c      | 5 +----
 2 files changed, 1 insertion(+), 5 deletions(-)

diff --git a/arch/sh/include/asm/smp.h b/arch/sh/include/asm/smp.h
index 78b0d0f4..93ce87b 100644
--- a/arch/sh/include/asm/smp.h
+++ b/arch/sh/include/asm/smp.h
@@ -25,7 +25,6 @@ extern int __cpu_logical_map[NR_CPUS];
 enum {
 	SMP_MSG_FUNCTION,
 	SMP_MSG_RESCHEDULE,
-	SMP_MSG_FUNCTION_SINGLE,
 	SMP_MSG_TIMER,
 
 	SMP_MSG_NR,	/* must be last */
diff --git a/arch/sh/kernel/smp.c b/arch/sh/kernel/smp.c
index 86a7936..c944d5d 100644
--- a/arch/sh/kernel/smp.c
+++ b/arch/sh/kernel/smp.c
@@ -282,7 +282,7 @@ void arch_send_call_function_ipi_mask(const struct cpumask *mask)
 
 void arch_send_call_function_single_ipi(int cpu)
 {
-	mp_ops->send_ipi(cpu, SMP_MSG_FUNCTION_SINGLE);
+	mp_ops->send_ipi(cpu, SMP_MSG_FUNCTION);
 }
 
 void smp_timer_broadcast(const struct cpumask *mask)
@@ -309,9 +309,6 @@ void smp_message_recv(unsigned int msg)
 	case SMP_MSG_RESCHEDULE:
 		scheduler_ipi();
 		break;
-	case SMP_MSG_FUNCTION_SINGLE:
-		generic_smp_call_function_single_interrupt();
-		break;
 	case SMP_MSG_TIMER:
 		ipi_timer();
 		break;
-- 
1.8.1.2


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v3 [resend] 12/18] smp, sparc64: kill SMP single function call interrupt
  2013-12-15 16:36 [PATCH v3 [resend] 00/18] simplify generic cross CPU function call implementation Jiang Liu
                   ` (10 preceding siblings ...)
  2013-12-15 16:36 ` [PATCH v3 [resend] 11/18] smp, sh: kill SMP single function call interrupt Jiang Liu
@ 2013-12-15 16:36 ` Jiang Liu
  2013-12-15 16:36   ` Jiang Liu
  2013-12-15 16:36 ` [PATCH v3 [resend] 13/18] smp, sparc: " Jiang Liu
                   ` (5 subsequent siblings)
  17 siblings, 1 reply; 33+ messages in thread
From: Jiang Liu @ 2013-12-15 16:36 UTC (permalink / raw)
  To: Andrew Morton, Shaohua Li, David S. Miller, Sam Ravnborg,
	Paul Gortmaker, Kirill Tkhai, Greg Kroah-Hartman, Bob Picco,
	Dave Kleikamp, sparclinux, linux-kernel
  Cc: Jiang Liu, Ingo Molnar, Peter Zijlstra, Steven Rostedt,
	Jiri Kosina, Wang YanQing, linux-arch, Kefeng Wang

Commit 9a46ad6d6df3b54 "smp: make smp_call_function_many() use logic
similar to smp_call_function_single()" has unified the way to handle
single and multiple cross-CPU function calls. Now only one interrupt
is needed for architecture specific code to support generic SMP function
call interfaces, so kill the redundant single function call interrupt.

Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Shaohua Li <shli@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Jiri Kosina <trivial@kernel.org>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Sam Ravnborg <sam@ravnborg.org>
Cc: Kefeng Wang <wangkefeng.wang@huawei.com>
Cc: sparclinux@vger.kernel.org
Signed-off-by: Jiang Liu <liuj97@gmail.com>
---
 arch/sparc/include/asm/pil.h  |  5 ++---
 arch/sparc/kernel/smp_64.c    | 11 +----------
 arch/sparc/kernel/ttable_64.S | 12 ++++--------
 arch/sparc/mm/ultra.S         |  5 -----
 4 files changed, 7 insertions(+), 26 deletions(-)

diff --git a/arch/sparc/include/asm/pil.h b/arch/sparc/include/asm/pil.h
index 2669370..5ffb15d 100644
--- a/arch/sparc/include/asm/pil.h
+++ b/arch/sparc/include/asm/pil.h
@@ -22,9 +22,8 @@
 #define PIL_SMP_CAPTURE		3
 #define PIL_SMP_CTX_NEW_VERSION	4
 #define PIL_DEVICE_IRQ		5
-#define PIL_SMP_CALL_FUNC_SNGL	6
-#define PIL_DEFERRED_PCR_WORK	7
-#define PIL_KGDB_CAPTURE	8
+#define PIL_DEFERRED_PCR_WORK	6
+#define PIL_KGDB_CAPTURE	7
 #define PIL_NORMAL_MAX		14
 #define PIL_NMI			15
 
diff --git a/arch/sparc/kernel/smp_64.c b/arch/sparc/kernel/smp_64.c
index b66a533..07d624b 100644
--- a/arch/sparc/kernel/smp_64.c
+++ b/arch/sparc/kernel/smp_64.c
@@ -811,12 +811,9 @@ void arch_send_call_function_ipi_mask(const struct cpumask *mask)
 	xcall_deliver((u64) &xcall_call_function, 0, 0, mask);
 }
 
-extern unsigned long xcall_call_function_single;
-
 void arch_send_call_function_single_ipi(int cpu)
 {
-	xcall_deliver((u64) &xcall_call_function_single, 0, 0,
-		      cpumask_of(cpu));
+	xcall_deliver((u64) &xcall_call_function, 0, 0, cpumask_of(cpu));
 }
 
 void __irq_entry smp_call_function_client(int irq, struct pt_regs *regs)
@@ -825,12 +822,6 @@ void __irq_entry smp_call_function_client(int irq, struct pt_regs *regs)
 	generic_smp_call_function_interrupt();
 }
 
-void __irq_entry smp_call_function_single_client(int irq, struct pt_regs *regs)
-{
-	clear_softint(1 << irq);
-	generic_smp_call_function_single_interrupt();
-}
-
 static void tsb_sync(void *info)
 {
 	struct trap_per_cpu *tp = &trap_block[raw_smp_processor_id()];
diff --git a/arch/sparc/kernel/ttable_64.S b/arch/sparc/kernel/ttable_64.S
index c6dfdaa..defa2db 100644
--- a/arch/sparc/kernel/ttable_64.S
+++ b/arch/sparc/kernel/ttable_64.S
@@ -58,17 +58,13 @@ tl0_irq3:	BTRAP(0x43)
 tl0_irq4:	BTRAP(0x44)
 #endif
 tl0_irq5:	TRAP_IRQ(handler_irq, 5)
-#ifdef CONFIG_SMP
-tl0_irq6:	TRAP_IRQ(smp_call_function_single_client, 6)
-#else
-tl0_irq6:	BTRAP(0x46)
-#endif
-tl0_irq7:	TRAP_IRQ(deferred_pcr_work_irq, 7)
+tl0_irq6:	TRAP_IRQ(deferred_pcr_work_irq, 6)
 #if defined(CONFIG_KGDB) && defined(CONFIG_SMP)
-tl0_irq8:	TRAP_IRQ(smp_kgdb_capture_client, 8)
+tl0_irq7:	TRAP_IRQ(smp_kgdb_capture_client, 7)
 #else
-tl0_irq8:	BTRAP(0x48)
+tl0_irq7:	BTRAP(0x47)
 #endif
+tl0_irq8:	BTRAP(0x48)
 tl0_irq9:	BTRAP(0x49)
 tl0_irq10:	BTRAP(0x4a) BTRAP(0x4b) BTRAP(0x4c) BTRAP(0x4d)
 tl0_irq14:	TRAP_IRQ(timer_interrupt, 14)
diff --git a/arch/sparc/mm/ultra.S b/arch/sparc/mm/ultra.S
index b4f4733..1da4739 100644
--- a/arch/sparc/mm/ultra.S
+++ b/arch/sparc/mm/ultra.S
@@ -780,11 +780,6 @@ xcall_call_function:
 	wr		%g0, (1 << PIL_SMP_CALL_FUNC), %set_softint
 	retry
 
-	.globl		xcall_call_function_single
-xcall_call_function_single:
-	wr		%g0, (1 << PIL_SMP_CALL_FUNC_SNGL), %set_softint
-	retry
-
 	.globl		xcall_receive_signal
 xcall_receive_signal:
 	wr		%g0, (1 << PIL_SMP_RECEIVE_SIGNAL), %set_softint
-- 
1.8.1.2


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v3 [resend] 12/18] smp, sparc64: kill SMP single function call interrupt
  2013-12-15 16:36 ` [PATCH v3 [resend] 12/18] smp, sparc64: " Jiang Liu
@ 2013-12-15 16:36   ` Jiang Liu
  0 siblings, 0 replies; 33+ messages in thread
From: Jiang Liu @ 2013-12-15 16:36 UTC (permalink / raw)
  To: Andrew Morton, Shaohua Li, David S. Miller, Sam Ravnborg,
	Paul Gortmaker, Kirill Tkhai, Greg Kroah-Hartman, Bob Picco,
	Dave Kleikamp, sparclinux, linux-kernel
  Cc: Jiang Liu, Ingo Molnar, Peter Zijlstra, Steven Rostedt,
	Jiri Kosina, Wang YanQing, linux-arch, Kefeng Wang

Commit 9a46ad6d6df3b54 "smp: make smp_call_function_many() use logic
similar to smp_call_function_single()" has unified the way to handle
single and multiple cross-CPU function calls. Now only one interrupt
is needed for architecture specific code to support generic SMP function
call interfaces, so kill the redundant single function call interrupt.

Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Shaohua Li <shli@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Jiri Kosina <trivial@kernel.org>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Sam Ravnborg <sam@ravnborg.org>
Cc: Kefeng Wang <wangkefeng.wang@huawei.com>
Cc: sparclinux@vger.kernel.org
Signed-off-by: Jiang Liu <liuj97@gmail.com>
---
 arch/sparc/include/asm/pil.h  |  5 ++---
 arch/sparc/kernel/smp_64.c    | 11 +----------
 arch/sparc/kernel/ttable_64.S | 12 ++++--------
 arch/sparc/mm/ultra.S         |  5 -----
 4 files changed, 7 insertions(+), 26 deletions(-)

diff --git a/arch/sparc/include/asm/pil.h b/arch/sparc/include/asm/pil.h
index 2669370..5ffb15d 100644
--- a/arch/sparc/include/asm/pil.h
+++ b/arch/sparc/include/asm/pil.h
@@ -22,9 +22,8 @@
 #define PIL_SMP_CAPTURE		3
 #define PIL_SMP_CTX_NEW_VERSION	4
 #define PIL_DEVICE_IRQ		5
-#define PIL_SMP_CALL_FUNC_SNGL	6
-#define PIL_DEFERRED_PCR_WORK	7
-#define PIL_KGDB_CAPTURE	8
+#define PIL_DEFERRED_PCR_WORK	6
+#define PIL_KGDB_CAPTURE	7
 #define PIL_NORMAL_MAX		14
 #define PIL_NMI			15
 
diff --git a/arch/sparc/kernel/smp_64.c b/arch/sparc/kernel/smp_64.c
index b66a533..07d624b 100644
--- a/arch/sparc/kernel/smp_64.c
+++ b/arch/sparc/kernel/smp_64.c
@@ -811,12 +811,9 @@ void arch_send_call_function_ipi_mask(const struct cpumask *mask)
 	xcall_deliver((u64) &xcall_call_function, 0, 0, mask);
 }
 
-extern unsigned long xcall_call_function_single;
-
 void arch_send_call_function_single_ipi(int cpu)
 {
-	xcall_deliver((u64) &xcall_call_function_single, 0, 0,
-		      cpumask_of(cpu));
+	xcall_deliver((u64) &xcall_call_function, 0, 0, cpumask_of(cpu));
 }
 
 void __irq_entry smp_call_function_client(int irq, struct pt_regs *regs)
@@ -825,12 +822,6 @@ void __irq_entry smp_call_function_client(int irq, struct pt_regs *regs)
 	generic_smp_call_function_interrupt();
 }
 
-void __irq_entry smp_call_function_single_client(int irq, struct pt_regs *regs)
-{
-	clear_softint(1 << irq);
-	generic_smp_call_function_single_interrupt();
-}
-
 static void tsb_sync(void *info)
 {
 	struct trap_per_cpu *tp = &trap_block[raw_smp_processor_id()];
diff --git a/arch/sparc/kernel/ttable_64.S b/arch/sparc/kernel/ttable_64.S
index c6dfdaa..defa2db 100644
--- a/arch/sparc/kernel/ttable_64.S
+++ b/arch/sparc/kernel/ttable_64.S
@@ -58,17 +58,13 @@ tl0_irq3:	BTRAP(0x43)
 tl0_irq4:	BTRAP(0x44)
 #endif
 tl0_irq5:	TRAP_IRQ(handler_irq, 5)
-#ifdef CONFIG_SMP
-tl0_irq6:	TRAP_IRQ(smp_call_function_single_client, 6)
-#else
-tl0_irq6:	BTRAP(0x46)
-#endif
-tl0_irq7:	TRAP_IRQ(deferred_pcr_work_irq, 7)
+tl0_irq6:	TRAP_IRQ(deferred_pcr_work_irq, 6)
 #if defined(CONFIG_KGDB) && defined(CONFIG_SMP)
-tl0_irq8:	TRAP_IRQ(smp_kgdb_capture_client, 8)
+tl0_irq7:	TRAP_IRQ(smp_kgdb_capture_client, 7)
 #else
-tl0_irq8:	BTRAP(0x48)
+tl0_irq7:	BTRAP(0x47)
 #endif
+tl0_irq8:	BTRAP(0x48)
 tl0_irq9:	BTRAP(0x49)
 tl0_irq10:	BTRAP(0x4a) BTRAP(0x4b) BTRAP(0x4c) BTRAP(0x4d)
 tl0_irq14:	TRAP_IRQ(timer_interrupt, 14)
diff --git a/arch/sparc/mm/ultra.S b/arch/sparc/mm/ultra.S
index b4f4733..1da4739 100644
--- a/arch/sparc/mm/ultra.S
+++ b/arch/sparc/mm/ultra.S
@@ -780,11 +780,6 @@ xcall_call_function:
 	wr		%g0, (1 << PIL_SMP_CALL_FUNC), %set_softint
 	retry
 
-	.globl		xcall_call_function_single
-xcall_call_function_single:
-	wr		%g0, (1 << PIL_SMP_CALL_FUNC_SNGL), %set_softint
-	retry
-
 	.globl		xcall_receive_signal
 xcall_receive_signal:
 	wr		%g0, (1 << PIL_SMP_RECEIVE_SIGNAL), %set_softint
-- 
1.8.1.2


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v3 [resend] 13/18] smp, sparc: kill SMP single function call interrupt
  2013-12-15 16:36 [PATCH v3 [resend] 00/18] simplify generic cross CPU function call implementation Jiang Liu
                   ` (11 preceding siblings ...)
  2013-12-15 16:36 ` [PATCH v3 [resend] 12/18] smp, sparc64: " Jiang Liu
@ 2013-12-15 16:36 ` Jiang Liu
  2013-12-15 16:36 ` [PATCH v3 [resend] 14/18] smp, x86, xen: " Jiang Liu
                   ` (4 subsequent siblings)
  17 siblings, 0 replies; 33+ messages in thread
From: Jiang Liu @ 2013-12-15 16:36 UTC (permalink / raw)
  To: Andrew Morton, Shaohua Li, David S. Miller, Kefeng Wang,
	Sam Ravnborg, Kirill Tkhai, Al Viro, Jiang Liu, Paul Gortmaker,
	Srivatsa S. Bhat, Thomas Gleixner, sparclinux, linux-kernel
  Cc: Jiang Liu, Ingo Molnar, Peter Zijlstra, Steven Rostedt,
	Jiri Kosina, Wang YanQing, linux-arch

Commit 9a46ad6d6df3b54 "smp: make smp_call_function_many() use logic
similar to smp_call_function_single()" has unified the way to handle
single and multiple cross-CPU function calls. Now only one interrupt
is needed for architecture specific code to support generic SMP function
call interfaces, so kill the redundant single function call interrupt.

Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Shaohua Li <shli@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Jiri Kosina <trivial@kernel.org>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Sam Ravnborg <sam@ravnborg.org>
Cc: Kefeng Wang <wangkefeng.wang@huawei.com>
Cc: sparclinux@vger.kernel.org
Signed-off-by: Jiang Liu <liuj97@gmail.com>
---
 arch/sparc/include/asm/smp_32.h |  4 +---
 arch/sparc/kernel/entry.S       | 10 ++--------
 arch/sparc/kernel/leon_smp.c    | 31 +++++++------------------------
 arch/sparc/kernel/smp_32.c      | 14 ++------------
 arch/sparc/kernel/sun4d_smp.c   | 31 +++++++------------------------
 arch/sparc/kernel/sun4m_smp.c   | 11 ++---------
 6 files changed, 21 insertions(+), 80 deletions(-)

diff --git a/arch/sparc/include/asm/smp_32.h b/arch/sparc/include/asm/smp_32.h
index 3c8917f..6aec01a 100644
--- a/arch/sparc/include/asm/smp_32.h
+++ b/arch/sparc/include/asm/smp_32.h
@@ -48,7 +48,6 @@ void smp_callin(void);
 void smp_store_cpu_info(int);
 
 void smp_resched_interrupt(void);
-void smp_call_function_single_interrupt(void);
 void smp_call_function_interrupt(void);
 
 struct seq_file;
@@ -60,8 +59,7 @@ struct sparc32_ipi_ops {
 			   unsigned long arg2, unsigned long arg3,
 			   unsigned long arg4);
 	void (*resched)(int cpu);
-	void (*single)(int cpu);
-	void (*mask_one)(int cpu);
+	void (*func_call)(int cpu);
 };
 extern const struct sparc32_ipi_ops *sparc32_ipi_ops;
 
diff --git a/arch/sparc/kernel/entry.S b/arch/sparc/kernel/entry.S
index 33c02b1..98bacfb 100644
--- a/arch/sparc/kernel/entry.S
+++ b/arch/sparc/kernel/entry.S
@@ -263,7 +263,7 @@ smp4m_ticker:
 	 * on some level other than 15 which is the NMI and only used
 	 * for cross calls.  That has a separate entry point below.
 	 *
-	 * IPIs are sent on Level 12, 13 and 14. See IRQ_IPI_*.
+	 * IPIs are sent on Level 13 and 14. See IRQ_IPI_*.
 	 */
 maybe_smp4m_msg:
 	GET_PROCESSOR4M_ID(o3)
@@ -287,14 +287,8 @@ maybe_smp4m_msg:
 	wr	%l4, PSR_ET, %psr
 	WRITE_PAUSE
 	srl	%o3, 28, %o2		! shift for simpler checks below
-maybe_smp4m_msg_check_single:
-	andcc	%o2, 0x1, %g0
-	beq,a	maybe_smp4m_msg_check_mask
-	 andcc	%o2, 0x2, %g0
-	call	smp_call_function_single_interrupt
-	 nop
-	andcc	%o2, 0x2, %g0
 maybe_smp4m_msg_check_mask:
+	andcc	%o2, 0x2, %g0
 	beq,a	maybe_smp4m_msg_check_resched
 	 andcc	%o2, 0x4, %g0
 	call	smp_call_function_interrupt
diff --git a/arch/sparc/kernel/leon_smp.c b/arch/sparc/kernel/leon_smp.c
index 6edf955..396b71d 100644
--- a/arch/sparc/kernel/leon_smp.c
+++ b/arch/sparc/kernel/leon_smp.c
@@ -271,8 +271,7 @@ void leon_irq_rotate(int cpu)
 }
 
 struct leon_ipi_work {
-	int single;
-	int msk;
+	int func_call;
 	int resched;
 };
 
@@ -308,7 +307,7 @@ static void __init leon_ipi_init(void)
 
 	for_each_possible_cpu(cpu) {
 		work = &per_cpu(leon_ipi_work, cpu);
-		work->single = work->msk = work->resched = 0;
+		work->func_call = work->resched = 0;
 	}
 }
 
@@ -319,23 +318,12 @@ static void leon_send_ipi(int cpu, int level)
 	LEON3_BYPASS_STORE_PA(&leon3_irqctrl_regs->force[cpu], mask);
 }
 
-static void leon_ipi_single(int cpu)
+static void leon_ipi_func_call(int cpu)
 {
 	struct leon_ipi_work *work = &per_cpu(leon_ipi_work, cpu);
 
 	/* Mark work */
-	work->single = 1;
-
-	/* Generate IRQ on the CPU */
-	leon_send_ipi(cpu, leon_ipi_irq);
-}
-
-static void leon_ipi_mask_one(int cpu)
-{
-	struct leon_ipi_work *work = &per_cpu(leon_ipi_work, cpu);
-
-	/* Mark work */
-	work->msk = 1;
+	work->func_call = 1;
 
 	/* Generate IRQ on the CPU */
 	leon_send_ipi(cpu, leon_ipi_irq);
@@ -356,12 +344,8 @@ void leonsmp_ipi_interrupt(void)
 {
 	struct leon_ipi_work *work = &__get_cpu_var(leon_ipi_work);
 
-	if (work->single) {
-		work->single = 0;
-		smp_call_function_single_interrupt();
-	}
-	if (work->msk) {
-		work->msk = 0;
+	if (work->func_call) {
+		work->func_call = 0;
 		smp_call_function_interrupt();
 	}
 	if (work->resched) {
@@ -467,8 +451,7 @@ void leon_cross_call_irq(void)
 static const struct sparc32_ipi_ops leon_ipi_ops = {
 	.cross_call = leon_cross_call,
 	.resched    = leon_ipi_resched,
-	.single     = leon_ipi_single,
-	.mask_one   = leon_ipi_mask_one,
+	.func_call   = leon_ipi_func_call,
 };
 
 void __init leon_init_smp(void)
diff --git a/arch/sparc/kernel/smp_32.c b/arch/sparc/kernel/smp_32.c
index a102bfb..0530d67 100644
--- a/arch/sparc/kernel/smp_32.c
+++ b/arch/sparc/kernel/smp_32.c
@@ -138,17 +138,15 @@ void smp_send_stop(void)
 
 void arch_send_call_function_single_ipi(int cpu)
 {
-	/* trigger one IPI single call on one CPU */
-	sparc32_ipi_ops->single(cpu);
+	sparc32_ipi_ops->func_call(cpu);
 }
 
 void arch_send_call_function_ipi_mask(const struct cpumask *mask)
 {
 	int cpu;
 
-	/* trigger IPI mask call on each CPU */
 	for_each_cpu(cpu, mask)
-		sparc32_ipi_ops->mask_one(cpu);
+		sparc32_ipi_ops->func_call(cpu);
 }
 
 void smp_resched_interrupt(void)
@@ -160,14 +158,6 @@ void smp_resched_interrupt(void)
 	/* re-schedule routine called by interrupt return code. */
 }
 
-void smp_call_function_single_interrupt(void)
-{
-	irq_enter();
-	generic_smp_call_function_single_interrupt();
-	local_cpu_data().irq_call_count++;
-	irq_exit();
-}
-
 void smp_call_function_interrupt(void)
 {
 	irq_enter();
diff --git a/arch/sparc/kernel/sun4d_smp.c b/arch/sparc/kernel/sun4d_smp.c
index d5c3195..72f3797 100644
--- a/arch/sparc/kernel/sun4d_smp.c
+++ b/arch/sparc/kernel/sun4d_smp.c
@@ -181,8 +181,7 @@ void __init smp4d_smp_done(void)
 
 /* Memory structure giving interrupt handler information about IPI generated */
 struct sun4d_ipi_work {
-	int single;
-	int msk;
+	int func_call;
 	int resched;
 };
 
@@ -198,7 +197,7 @@ static void __init smp4d_ipi_init(void)
 
 	for_each_possible_cpu(cpu) {
 		work = &per_cpu(sun4d_ipi_work, cpu);
-		work->single = work->msk = work->resched = 0;
+		work->func_call = work->resched = 0;
 	}
 }
 
@@ -206,12 +205,8 @@ void sun4d_ipi_interrupt(void)
 {
 	struct sun4d_ipi_work *work = &__get_cpu_var(sun4d_ipi_work);
 
-	if (work->single) {
-		work->single = 0;
-		smp_call_function_single_interrupt();
-	}
-	if (work->msk) {
-		work->msk = 0;
+	if (work->func_call) {
+		work->func_call = 0;
 		smp_call_function_interrupt();
 	}
 	if (work->resched) {
@@ -233,23 +228,12 @@ static void sun4d_send_ipi(int cpu, int level)
 	cc_set_igen(IGEN_MESSAGE(0, cpu << 3, 6 + ((level >> 1) & 7), 1 << (level - 1)));
 }
 
-static void sun4d_ipi_single(int cpu)
-{
-	struct sun4d_ipi_work *work = &per_cpu(sun4d_ipi_work, cpu);
-
-	/* Mark work */
-	work->single = 1;
-
-	/* Generate IRQ on the CPU */
-	sun4d_send_ipi(cpu, SUN4D_IPI_IRQ);
-}
-
-static void sun4d_ipi_mask_one(int cpu)
+static void sun4d_ipi_func_call(int cpu)
 {
 	struct sun4d_ipi_work *work = &per_cpu(sun4d_ipi_work, cpu);
 
 	/* Mark work */
-	work->msk = 1;
+	work->func_call = 1;
 
 	/* Generate IRQ on the CPU */
 	sun4d_send_ipi(cpu, SUN4D_IPI_IRQ);
@@ -392,8 +376,7 @@ void smp4d_percpu_timer_interrupt(struct pt_regs *regs)
 static const struct sparc32_ipi_ops sun4d_ipi_ops = {
 	.cross_call = sun4d_cross_call,
 	.resched    = sun4d_ipi_resched,
-	.single     = sun4d_ipi_single,
-	.mask_one   = sun4d_ipi_mask_one,
+	.func_call   = sun4d_ipi_func_call,
 };
 
 void __init sun4d_init_smp(void)
diff --git a/arch/sparc/kernel/sun4m_smp.c b/arch/sparc/kernel/sun4m_smp.c
index d3408e7..d4b7d01 100644
--- a/arch/sparc/kernel/sun4m_smp.c
+++ b/arch/sparc/kernel/sun4m_smp.c
@@ -20,7 +20,6 @@
 #include "irq.h"
 #include "kernel.h"
 
-#define IRQ_IPI_SINGLE		12
 #define IRQ_IPI_MASK		13
 #define IRQ_IPI_RESCHED		14
 #define IRQ_CROSS_CALL		15
@@ -145,12 +144,7 @@ static void sun4m_ipi_resched(int cpu)
 	sun4m_send_ipi(cpu, IRQ_IPI_RESCHED);
 }
 
-static void sun4m_ipi_single(int cpu)
-{
-	sun4m_send_ipi(cpu, IRQ_IPI_SINGLE);
-}
-
-static void sun4m_ipi_mask_one(int cpu)
+static void sun4m_ipi_func_call(int cpu)
 {
 	sun4m_send_ipi(cpu, IRQ_IPI_MASK);
 }
@@ -262,8 +256,7 @@ void smp4m_percpu_timer_interrupt(struct pt_regs *regs)
 static const struct sparc32_ipi_ops sun4m_ipi_ops = {
 	.cross_call = sun4m_cross_call,
 	.resched    = sun4m_ipi_resched,
-	.single     = sun4m_ipi_single,
-	.mask_one   = sun4m_ipi_mask_one,
+	.func_call   = sun4m_ipi_func_call,
 };
 
 void __init sun4m_init_smp(void)
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v3 [resend] 14/18] smp, x86, xen: kill SMP single function call interrupt
  2013-12-15 16:36 [PATCH v3 [resend] 00/18] simplify generic cross CPU function call implementation Jiang Liu
                   ` (12 preceding siblings ...)
  2013-12-15 16:36 ` [PATCH v3 [resend] 13/18] smp, sparc: " Jiang Liu
@ 2013-12-15 16:36 ` Jiang Liu
  2013-12-15 16:36   ` Jiang Liu
  2013-12-16  3:00   ` Konrad Rzeszutek Wilk
  2013-12-15 16:36 ` [PATCH v3 [resend] 15/18] smp, x86: " Jiang Liu
                   ` (3 subsequent siblings)
  17 siblings, 2 replies; 33+ messages in thread
From: Jiang Liu @ 2013-12-15 16:36 UTC (permalink / raw)
  To: Andrew Morton, Shaohua Li, Konrad Rzeszutek Wilk, Boris Ostrovsky,
	David Vrabel, Thomas Gleixner, Ingo Molnar, H. Peter Anvin, x86,
	xen-devel, linux-kernel
  Cc: linux-arch, Jeremy Fitzhardinge, xen-devel, Jiri Kosina,
	Peter Zijlstra, Wang YanQing, Steven Rostedt, virtualization,
	Sebastian Andrzej Siewior, Ingo Molnar, Jiang Liu

Commit 9a46ad6d6df3b54 "smp: make smp_call_function_many() use logic
similar to smp_call_function_single()" has unified the way to handle
single and multiple cross-CPU function calls. Now only one interrupt
is needed for architecture specific code to support generic SMP function
call interfaces, so kill the redundant single function call interrupt.

Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Shaohua Li <shli@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Jiri Kosina <trivial@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Cc: Jeremy Fitzhardinge <jeremy@goop.org>
Cc: Sebastian Andrzej Siewior <sebastian@breakpoint.cc>
Cc: x86@kernel.org
Cc: xen-devel@lists.xensource.com
Cc: virtualization@lists.linux-foundation.org
Signed-off-by: Jiang Liu <liuj97@gmail.com>
---
 arch/x86/include/asm/xen/events.h |  1 -
 arch/x86/xen/smp.c                | 38 ++------------------------------------
 2 files changed, 2 insertions(+), 37 deletions(-)

diff --git a/arch/x86/include/asm/xen/events.h b/arch/x86/include/asm/xen/events.h
index 608a79d..a9e54dc 100644
--- a/arch/x86/include/asm/xen/events.h
+++ b/arch/x86/include/asm/xen/events.h
@@ -4,7 +4,6 @@
 enum ipi_vector {
 	XEN_RESCHEDULE_VECTOR,
 	XEN_CALL_FUNCTION_VECTOR,
-	XEN_CALL_FUNCTION_SINGLE_VECTOR,
 	XEN_SPIN_UNLOCK_VECTOR,
 	XEN_IRQ_WORK_VECTOR,
 	XEN_NMI_VECTOR,
diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c
index c36b325..7cf1689 100644
--- a/arch/x86/xen/smp.c
+++ b/arch/x86/xen/smp.c
@@ -46,12 +46,10 @@ struct xen_common_irq {
 };
 static DEFINE_PER_CPU(struct xen_common_irq, xen_resched_irq) = { .irq = -1 };
 static DEFINE_PER_CPU(struct xen_common_irq, xen_callfunc_irq) = { .irq = -1 };
-static DEFINE_PER_CPU(struct xen_common_irq, xen_callfuncsingle_irq) = { .irq = -1 };
 static DEFINE_PER_CPU(struct xen_common_irq, xen_irq_work) = { .irq = -1 };
 static DEFINE_PER_CPU(struct xen_common_irq, xen_debug_irq) = { .irq = -1 };
 
 static irqreturn_t xen_call_function_interrupt(int irq, void *dev_id);
-static irqreturn_t xen_call_function_single_interrupt(int irq, void *dev_id);
 static irqreturn_t xen_irq_work_interrupt(int irq, void *dev_id);
 
 /*
@@ -123,13 +121,6 @@ static void xen_smp_intr_free(unsigned int cpu)
 		kfree(per_cpu(xen_debug_irq, cpu).name);
 		per_cpu(xen_debug_irq, cpu).name = NULL;
 	}
-	if (per_cpu(xen_callfuncsingle_irq, cpu).irq >= 0) {
-		unbind_from_irqhandler(per_cpu(xen_callfuncsingle_irq, cpu).irq,
-				       NULL);
-		per_cpu(xen_callfuncsingle_irq, cpu).irq = -1;
-		kfree(per_cpu(xen_callfuncsingle_irq, cpu).name);
-		per_cpu(xen_callfuncsingle_irq, cpu).name = NULL;
-	}
 	if (xen_hvm_domain())
 		return;
 
@@ -178,18 +169,6 @@ static int xen_smp_intr_init(unsigned int cpu)
 	per_cpu(xen_debug_irq, cpu).irq = rc;
 	per_cpu(xen_debug_irq, cpu).name = debug_name;
 
-	callfunc_name = kasprintf(GFP_KERNEL, "callfuncsingle%d", cpu);
-	rc = bind_ipi_to_irqhandler(XEN_CALL_FUNCTION_SINGLE_VECTOR,
-				    cpu,
-				    xen_call_function_single_interrupt,
-				    IRQF_PERCPU|IRQF_NOBALANCING,
-				    callfunc_name,
-				    NULL);
-	if (rc < 0)
-		goto fail;
-	per_cpu(xen_callfuncsingle_irq, cpu).irq = rc;
-	per_cpu(xen_callfuncsingle_irq, cpu).name = callfunc_name;
-
 	/*
 	 * The IRQ worker on PVHVM goes through the native path and uses the
 	 * IPI mechanism.
@@ -569,8 +548,7 @@ static void xen_smp_send_call_function_ipi(const struct cpumask *mask)
 
 static void xen_smp_send_call_function_single_ipi(int cpu)
 {
-	__xen_send_IPI_mask(cpumask_of(cpu),
-			  XEN_CALL_FUNCTION_SINGLE_VECTOR);
+	__xen_send_IPI_mask(cpumask_of(cpu), XEN_CALL_FUNCTION_VECTOR);
 }
 
 static inline int xen_map_vector(int vector)
@@ -582,10 +560,8 @@ static inline int xen_map_vector(int vector)
 		xen_vector = XEN_RESCHEDULE_VECTOR;
 		break;
 	case CALL_FUNCTION_VECTOR:
-		xen_vector = XEN_CALL_FUNCTION_VECTOR;
-		break;
 	case CALL_FUNCTION_SINGLE_VECTOR:
-		xen_vector = XEN_CALL_FUNCTION_SINGLE_VECTOR;
+		xen_vector = XEN_CALL_FUNCTION_VECTOR;
 		break;
 	case IRQ_WORK_VECTOR:
 		xen_vector = XEN_IRQ_WORK_VECTOR;
@@ -663,16 +639,6 @@ static irqreturn_t xen_call_function_interrupt(int irq, void *dev_id)
 	return IRQ_HANDLED;
 }
 
-static irqreturn_t xen_call_function_single_interrupt(int irq, void *dev_id)
-{
-	irq_enter();
-	generic_smp_call_function_single_interrupt();
-	inc_irq_stat(irq_call_count);
-	irq_exit();
-
-	return IRQ_HANDLED;
-}
-
 static irqreturn_t xen_irq_work_interrupt(int irq, void *dev_id)
 {
 	irq_enter();
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v3 [resend] 14/18] smp, x86, xen: kill SMP single function call interrupt
  2013-12-15 16:36 ` [PATCH v3 [resend] 14/18] smp, x86, xen: " Jiang Liu
@ 2013-12-15 16:36   ` Jiang Liu
  2013-12-16  3:00   ` Konrad Rzeszutek Wilk
  1 sibling, 0 replies; 33+ messages in thread
From: Jiang Liu @ 2013-12-15 16:36 UTC (permalink / raw)
  To: Andrew Morton, Shaohua Li, Konrad Rzeszutek Wilk, Boris Ostrovsky,
	David Vrabel, Thomas Gleixner, Ingo Molnar, H. Peter Anvin, x86,
	xen-devel, linux-kernel
  Cc: Jiang Liu, Ingo Molnar, Peter Zijlstra, Steven Rostedt,
	Jiri Kosina, Wang YanQing, linux-arch, Jeremy Fitzhardinge,
	Sebastian Andrzej Siewior, xen-devel, virtualization

Commit 9a46ad6d6df3b54 "smp: make smp_call_function_many() use logic
similar to smp_call_function_single()" has unified the way to handle
single and multiple cross-CPU function calls. Now only one interrupt
is needed for architecture specific code to support generic SMP function
call interfaces, so kill the redundant single function call interrupt.

Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Shaohua Li <shli@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Jiri Kosina <trivial@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Cc: Jeremy Fitzhardinge <jeremy@goop.org>
Cc: Sebastian Andrzej Siewior <sebastian@breakpoint.cc>
Cc: x86@kernel.org
Cc: xen-devel@lists.xensource.com
Cc: virtualization@lists.linux-foundation.org
Signed-off-by: Jiang Liu <liuj97@gmail.com>
---
 arch/x86/include/asm/xen/events.h |  1 -
 arch/x86/xen/smp.c                | 38 ++------------------------------------
 2 files changed, 2 insertions(+), 37 deletions(-)

diff --git a/arch/x86/include/asm/xen/events.h b/arch/x86/include/asm/xen/events.h
index 608a79d..a9e54dc 100644
--- a/arch/x86/include/asm/xen/events.h
+++ b/arch/x86/include/asm/xen/events.h
@@ -4,7 +4,6 @@
 enum ipi_vector {
 	XEN_RESCHEDULE_VECTOR,
 	XEN_CALL_FUNCTION_VECTOR,
-	XEN_CALL_FUNCTION_SINGLE_VECTOR,
 	XEN_SPIN_UNLOCK_VECTOR,
 	XEN_IRQ_WORK_VECTOR,
 	XEN_NMI_VECTOR,
diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c
index c36b325..7cf1689 100644
--- a/arch/x86/xen/smp.c
+++ b/arch/x86/xen/smp.c
@@ -46,12 +46,10 @@ struct xen_common_irq {
 };
 static DEFINE_PER_CPU(struct xen_common_irq, xen_resched_irq) = { .irq = -1 };
 static DEFINE_PER_CPU(struct xen_common_irq, xen_callfunc_irq) = { .irq = -1 };
-static DEFINE_PER_CPU(struct xen_common_irq, xen_callfuncsingle_irq) = { .irq = -1 };
 static DEFINE_PER_CPU(struct xen_common_irq, xen_irq_work) = { .irq = -1 };
 static DEFINE_PER_CPU(struct xen_common_irq, xen_debug_irq) = { .irq = -1 };
 
 static irqreturn_t xen_call_function_interrupt(int irq, void *dev_id);
-static irqreturn_t xen_call_function_single_interrupt(int irq, void *dev_id);
 static irqreturn_t xen_irq_work_interrupt(int irq, void *dev_id);
 
 /*
@@ -123,13 +121,6 @@ static void xen_smp_intr_free(unsigned int cpu)
 		kfree(per_cpu(xen_debug_irq, cpu).name);
 		per_cpu(xen_debug_irq, cpu).name = NULL;
 	}
-	if (per_cpu(xen_callfuncsingle_irq, cpu).irq >= 0) {
-		unbind_from_irqhandler(per_cpu(xen_callfuncsingle_irq, cpu).irq,
-				       NULL);
-		per_cpu(xen_callfuncsingle_irq, cpu).irq = -1;
-		kfree(per_cpu(xen_callfuncsingle_irq, cpu).name);
-		per_cpu(xen_callfuncsingle_irq, cpu).name = NULL;
-	}
 	if (xen_hvm_domain())
 		return;
 
@@ -178,18 +169,6 @@ static int xen_smp_intr_init(unsigned int cpu)
 	per_cpu(xen_debug_irq, cpu).irq = rc;
 	per_cpu(xen_debug_irq, cpu).name = debug_name;
 
-	callfunc_name = kasprintf(GFP_KERNEL, "callfuncsingle%d", cpu);
-	rc = bind_ipi_to_irqhandler(XEN_CALL_FUNCTION_SINGLE_VECTOR,
-				    cpu,
-				    xen_call_function_single_interrupt,
-				    IRQF_PERCPU|IRQF_NOBALANCING,
-				    callfunc_name,
-				    NULL);
-	if (rc < 0)
-		goto fail;
-	per_cpu(xen_callfuncsingle_irq, cpu).irq = rc;
-	per_cpu(xen_callfuncsingle_irq, cpu).name = callfunc_name;
-
 	/*
 	 * The IRQ worker on PVHVM goes through the native path and uses the
 	 * IPI mechanism.
@@ -569,8 +548,7 @@ static void xen_smp_send_call_function_ipi(const struct cpumask *mask)
 
 static void xen_smp_send_call_function_single_ipi(int cpu)
 {
-	__xen_send_IPI_mask(cpumask_of(cpu),
-			  XEN_CALL_FUNCTION_SINGLE_VECTOR);
+	__xen_send_IPI_mask(cpumask_of(cpu), XEN_CALL_FUNCTION_VECTOR);
 }
 
 static inline int xen_map_vector(int vector)
@@ -582,10 +560,8 @@ static inline int xen_map_vector(int vector)
 		xen_vector = XEN_RESCHEDULE_VECTOR;
 		break;
 	case CALL_FUNCTION_VECTOR:
-		xen_vector = XEN_CALL_FUNCTION_VECTOR;
-		break;
 	case CALL_FUNCTION_SINGLE_VECTOR:
-		xen_vector = XEN_CALL_FUNCTION_SINGLE_VECTOR;
+		xen_vector = XEN_CALL_FUNCTION_VECTOR;
 		break;
 	case IRQ_WORK_VECTOR:
 		xen_vector = XEN_IRQ_WORK_VECTOR;
@@ -663,16 +639,6 @@ static irqreturn_t xen_call_function_interrupt(int irq, void *dev_id)
 	return IRQ_HANDLED;
 }
 
-static irqreturn_t xen_call_function_single_interrupt(int irq, void *dev_id)
-{
-	irq_enter();
-	generic_smp_call_function_single_interrupt();
-	inc_irq_stat(irq_call_count);
-	irq_exit();
-
-	return IRQ_HANDLED;
-}
-
 static irqreturn_t xen_irq_work_interrupt(int irq, void *dev_id)
 {
 	irq_enter();
-- 
1.8.1.2


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v3 [resend] 15/18] smp, x86: kill SMP single function call interrupt
  2013-12-15 16:36 [PATCH v3 [resend] 00/18] simplify generic cross CPU function call implementation Jiang Liu
                   ` (13 preceding siblings ...)
  2013-12-15 16:36 ` [PATCH v3 [resend] 14/18] smp, x86, xen: " Jiang Liu
@ 2013-12-15 16:36 ` Jiang Liu
  2013-12-15 16:36   ` Jiang Liu
  2013-12-15 16:36 ` [PATCH v3 [resend] 16/18] smp: cleanup unsued generic_smp_call_function_single_interrupt() Jiang Liu
                   ` (2 subsequent siblings)
  17 siblings, 1 reply; 33+ messages in thread
From: Jiang Liu @ 2013-12-15 16:36 UTC (permalink / raw)
  To: Andrew Morton, Shaohua Li, Thomas Gleixner, Ingo Molnar,
	H. Peter Anvin, x86, Konrad Rzeszutek Wilk, Boris Ostrovsky,
	David Vrabel, Yang Zhang, Marcelo Tosatti, Seiji Aguchi,
	Gleb Natapov, Sebastian Andrzej Siewior, Joerg Roedel,
	K. Y. Srinivasan, Peter Zijlstra, Al Viro, Andi Kleen,
	Steven Rostedt, linux-kernel, xen-devel
  Cc: linux-arch, Jeremy Fitzhardinge, xen-devel, Jiri Kosina,
	Peter Zijlstra, Wang YanQing, virtualization, Ingo Molnar,
	Jiang Liu

Commit 9a46ad6d6df3b54 "smp: make smp_call_function_many() use logic
similar to smp_call_function_single()" has unified the way to handle
single and multiple cross-CPU function calls. Now only one interrupt
is needed for architecture specific code to support generic SMP function
call interfaces, so kill the redundant single function call interrupt.

Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Shaohua Li <shli@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Jiri Kosina <trivial@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Cc: Jeremy Fitzhardinge <jeremy@goop.org>
Cc: Sebastian Andrzej Siewior <sebastian@breakpoint.cc>
Cc: x86@kernel.org
Cc: xen-devel@lists.xensource.com
Cc: virtualization@lists.linux-foundation.org
Signed-off-by: Jiang Liu <liuj97@gmail.com>
---
 arch/x86/include/asm/entry_arch.h        |  1 -
 arch/x86/include/asm/hw_irq.h            |  3 ---
 arch/x86/include/asm/irq_vectors.h       |  7 +++----
 arch/x86/include/asm/trace/irq_vectors.h |  6 ------
 arch/x86/kernel/entry_64.S               |  2 --
 arch/x86/kernel/irqinit.c                |  4 ----
 arch/x86/kernel/smp.c                    | 24 +-----------------------
 arch/x86/xen/smp.c                       |  1 -
 8 files changed, 4 insertions(+), 44 deletions(-)

diff --git a/arch/x86/include/asm/entry_arch.h b/arch/x86/include/asm/entry_arch.h
index dc5fa66..9670cff 100644
--- a/arch/x86/include/asm/entry_arch.h
+++ b/arch/x86/include/asm/entry_arch.h
@@ -12,7 +12,6 @@
 #ifdef CONFIG_SMP
 BUILD_INTERRUPT(reschedule_interrupt,RESCHEDULE_VECTOR)
 BUILD_INTERRUPT(call_function_interrupt,CALL_FUNCTION_VECTOR)
-BUILD_INTERRUPT(call_function_single_interrupt,CALL_FUNCTION_SINGLE_VECTOR)
 BUILD_INTERRUPT3(irq_move_cleanup_interrupt, IRQ_MOVE_CLEANUP_VECTOR,
 		 smp_irq_move_cleanup_interrupt)
 BUILD_INTERRUPT3(reboot_interrupt, REBOOT_VECTOR, smp_reboot_interrupt)
diff --git a/arch/x86/include/asm/hw_irq.h b/arch/x86/include/asm/hw_irq.h
index cba45d9..66bacec 100644
--- a/arch/x86/include/asm/hw_irq.h
+++ b/arch/x86/include/asm/hw_irq.h
@@ -75,7 +75,6 @@ extern asmlinkage void reboot_interrupt(void);
 extern asmlinkage void threshold_interrupt(void);
 
 extern asmlinkage void call_function_interrupt(void);
-extern asmlinkage void call_function_single_interrupt(void);
 
 #ifdef CONFIG_TRACING
 /* Interrupt handlers registered during init_IRQ */
@@ -88,7 +87,6 @@ extern void trace_thermal_interrupt(void);
 extern void trace_reschedule_interrupt(void);
 extern void trace_threshold_interrupt(void);
 extern void trace_call_function_interrupt(void);
-extern void trace_call_function_single_interrupt(void);
 #define trace_irq_move_cleanup_interrupt  irq_move_cleanup_interrupt
 #define trace_reboot_interrupt  reboot_interrupt
 #define trace_kvm_posted_intr_ipi kvm_posted_intr_ipi
@@ -182,7 +180,6 @@ extern asmlinkage void smp_irq_move_cleanup_interrupt(void);
 #ifdef CONFIG_SMP
 extern __visible void smp_reschedule_interrupt(struct pt_regs *);
 extern __visible void smp_call_function_interrupt(struct pt_regs *);
-extern __visible void smp_call_function_single_interrupt(struct pt_regs *);
 extern __visible void smp_invalidate_interrupt(struct pt_regs *);
 #endif
 
diff --git a/arch/x86/include/asm/irq_vectors.h b/arch/x86/include/asm/irq_vectors.h
index 5702d7e..98a302d 100644
--- a/arch/x86/include/asm/irq_vectors.h
+++ b/arch/x86/include/asm/irq_vectors.h
@@ -92,10 +92,9 @@
 #define ERROR_APIC_VECTOR		0xfe
 #define RESCHEDULE_VECTOR		0xfd
 #define CALL_FUNCTION_VECTOR		0xfc
-#define CALL_FUNCTION_SINGLE_VECTOR	0xfb
-#define THERMAL_APIC_VECTOR		0xfa
-#define THRESHOLD_APIC_VECTOR		0xf9
-#define REBOOT_VECTOR			0xf8
+#define THERMAL_APIC_VECTOR		0xfb
+#define THRESHOLD_APIC_VECTOR		0xfa
+#define REBOOT_VECTOR			0xf9
 
 /*
  * Generic system vector for platform specific use
diff --git a/arch/x86/include/asm/trace/irq_vectors.h b/arch/x86/include/asm/trace/irq_vectors.h
index 4cab890..e672e20 100644
--- a/arch/x86/include/asm/trace/irq_vectors.h
+++ b/arch/x86/include/asm/trace/irq_vectors.h
@@ -89,12 +89,6 @@ TRACE_EVENT_PERF_PERM(irq_work_exit, is_sampling_event(p_event) ? -EPERM : 0);
 DEFINE_IRQ_VECTOR_EVENT(call_function);
 
 /*
- * call_function_single - called when entering/exiting a call function
- * single interrupt vector handler
- */
-DEFINE_IRQ_VECTOR_EVENT(call_function_single);
-
-/*
  * threshold_apic - called when entering/exiting a threshold apic interrupt
  * vector handler
  */
diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S
index e21b078..8d5d21a 100644
--- a/arch/x86/kernel/entry_64.S
+++ b/arch/x86/kernel/entry_64.S
@@ -1182,8 +1182,6 @@ apicinterrupt THERMAL_APIC_VECTOR \
 #endif
 
 #ifdef CONFIG_SMP
-apicinterrupt CALL_FUNCTION_SINGLE_VECTOR \
-	call_function_single_interrupt smp_call_function_single_interrupt
 apicinterrupt CALL_FUNCTION_VECTOR \
 	call_function_interrupt smp_call_function_interrupt
 apicinterrupt RESCHEDULE_VECTOR \
diff --git a/arch/x86/kernel/irqinit.c b/arch/x86/kernel/irqinit.c
index a2a1fbc..4aa1b8c 100644
--- a/arch/x86/kernel/irqinit.c
+++ b/arch/x86/kernel/irqinit.c
@@ -141,10 +141,6 @@ static void __init smp_intr_init(void)
 	/* IPI for generic function call */
 	alloc_intr_gate(CALL_FUNCTION_VECTOR, call_function_interrupt);
 
-	/* IPI for generic single function call */
-	alloc_intr_gate(CALL_FUNCTION_SINGLE_VECTOR,
-			call_function_single_interrupt);
-
 	/* Low priority IPI to cleanup after moving an irq */
 	set_intr_gate(IRQ_MOVE_CLEANUP_VECTOR, irq_move_cleanup_interrupt);
 	set_bit(IRQ_MOVE_CLEANUP_VECTOR, used_vectors);
diff --git a/arch/x86/kernel/smp.c b/arch/x86/kernel/smp.c
index 7c3a5a6..f363dd2 100644
--- a/arch/x86/kernel/smp.c
+++ b/arch/x86/kernel/smp.c
@@ -129,7 +129,7 @@ static void native_smp_send_reschedule(int cpu)
 
 void native_send_call_func_single_ipi(int cpu)
 {
-	apic->send_IPI_mask(cpumask_of(cpu), CALL_FUNCTION_SINGLE_VECTOR);
+	apic->send_IPI_mask(cpumask_of(cpu), CALL_FUNCTION_VECTOR);
 }
 
 void native_send_call_func_ipi(const struct cpumask *mask)
@@ -311,28 +311,6 @@ __visible void smp_trace_call_function_interrupt(struct pt_regs *regs)
 	exiting_irq();
 }
 
-static inline void __smp_call_function_single_interrupt(void)
-{
-	generic_smp_call_function_single_interrupt();
-	inc_irq_stat(irq_call_count);
-}
-
-__visible void smp_call_function_single_interrupt(struct pt_regs *regs)
-{
-	smp_entering_irq();
-	__smp_call_function_single_interrupt();
-	exiting_irq();
-}
-
-__visible void smp_trace_call_function_single_interrupt(struct pt_regs *regs)
-{
-	smp_entering_irq();
-	trace_call_function_single_entry(CALL_FUNCTION_SINGLE_VECTOR);
-	__smp_call_function_single_interrupt();
-	trace_call_function_single_exit(CALL_FUNCTION_SINGLE_VECTOR);
-	exiting_irq();
-}
-
 static int __init nonmi_ipi_setup(char *str)
 {
 	smp_no_nmi_ipi = true;
diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c
index 7cf1689..f241792 100644
--- a/arch/x86/xen/smp.c
+++ b/arch/x86/xen/smp.c
@@ -560,7 +560,6 @@ static inline int xen_map_vector(int vector)
 		xen_vector = XEN_RESCHEDULE_VECTOR;
 		break;
 	case CALL_FUNCTION_VECTOR:
-	case CALL_FUNCTION_SINGLE_VECTOR:
 		xen_vector = XEN_CALL_FUNCTION_VECTOR;
 		break;
 	case IRQ_WORK_VECTOR:
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v3 [resend] 15/18] smp, x86: kill SMP single function call interrupt
  2013-12-15 16:36 ` [PATCH v3 [resend] 15/18] smp, x86: " Jiang Liu
@ 2013-12-15 16:36   ` Jiang Liu
  0 siblings, 0 replies; 33+ messages in thread
From: Jiang Liu @ 2013-12-15 16:36 UTC (permalink / raw)
  To: Andrew Morton, Shaohua Li, Thomas Gleixner, Ingo Molnar,
	H. Peter Anvin, x86, Konrad Rzeszutek Wilk, Boris Ostrovsky,
	David Vrabel, Yang Zhang, Marcelo Tosatti, Seiji Aguchi,
	Gleb Natapov, Sebastian Andrzej Siewior, Joerg Roedel,
	K. Y. Srinivasan, Peter Zijlstra, Al Viro, Andi Kleen,
	Steven Rostedt, linux-kernel, xen-devel
  Cc: Jiang Liu, Ingo Molnar, Peter Zijlstra, Jiri Kosina, Wang YanQing,
	linux-arch, Jeremy Fitzhardinge, xen-devel, virtualization

Commit 9a46ad6d6df3b54 "smp: make smp_call_function_many() use logic
similar to smp_call_function_single()" has unified the way to handle
single and multiple cross-CPU function calls. Now only one interrupt
is needed for architecture specific code to support generic SMP function
call interfaces, so kill the redundant single function call interrupt.

Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Shaohua Li <shli@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Jiri Kosina <trivial@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Cc: Jeremy Fitzhardinge <jeremy@goop.org>
Cc: Sebastian Andrzej Siewior <sebastian@breakpoint.cc>
Cc: x86@kernel.org
Cc: xen-devel@lists.xensource.com
Cc: virtualization@lists.linux-foundation.org
Signed-off-by: Jiang Liu <liuj97@gmail.com>
---
 arch/x86/include/asm/entry_arch.h        |  1 -
 arch/x86/include/asm/hw_irq.h            |  3 ---
 arch/x86/include/asm/irq_vectors.h       |  7 +++----
 arch/x86/include/asm/trace/irq_vectors.h |  6 ------
 arch/x86/kernel/entry_64.S               |  2 --
 arch/x86/kernel/irqinit.c                |  4 ----
 arch/x86/kernel/smp.c                    | 24 +-----------------------
 arch/x86/xen/smp.c                       |  1 -
 8 files changed, 4 insertions(+), 44 deletions(-)

diff --git a/arch/x86/include/asm/entry_arch.h b/arch/x86/include/asm/entry_arch.h
index dc5fa66..9670cff 100644
--- a/arch/x86/include/asm/entry_arch.h
+++ b/arch/x86/include/asm/entry_arch.h
@@ -12,7 +12,6 @@
 #ifdef CONFIG_SMP
 BUILD_INTERRUPT(reschedule_interrupt,RESCHEDULE_VECTOR)
 BUILD_INTERRUPT(call_function_interrupt,CALL_FUNCTION_VECTOR)
-BUILD_INTERRUPT(call_function_single_interrupt,CALL_FUNCTION_SINGLE_VECTOR)
 BUILD_INTERRUPT3(irq_move_cleanup_interrupt, IRQ_MOVE_CLEANUP_VECTOR,
 		 smp_irq_move_cleanup_interrupt)
 BUILD_INTERRUPT3(reboot_interrupt, REBOOT_VECTOR, smp_reboot_interrupt)
diff --git a/arch/x86/include/asm/hw_irq.h b/arch/x86/include/asm/hw_irq.h
index cba45d9..66bacec 100644
--- a/arch/x86/include/asm/hw_irq.h
+++ b/arch/x86/include/asm/hw_irq.h
@@ -75,7 +75,6 @@ extern asmlinkage void reboot_interrupt(void);
 extern asmlinkage void threshold_interrupt(void);
 
 extern asmlinkage void call_function_interrupt(void);
-extern asmlinkage void call_function_single_interrupt(void);
 
 #ifdef CONFIG_TRACING
 /* Interrupt handlers registered during init_IRQ */
@@ -88,7 +87,6 @@ extern void trace_thermal_interrupt(void);
 extern void trace_reschedule_interrupt(void);
 extern void trace_threshold_interrupt(void);
 extern void trace_call_function_interrupt(void);
-extern void trace_call_function_single_interrupt(void);
 #define trace_irq_move_cleanup_interrupt  irq_move_cleanup_interrupt
 #define trace_reboot_interrupt  reboot_interrupt
 #define trace_kvm_posted_intr_ipi kvm_posted_intr_ipi
@@ -182,7 +180,6 @@ extern asmlinkage void smp_irq_move_cleanup_interrupt(void);
 #ifdef CONFIG_SMP
 extern __visible void smp_reschedule_interrupt(struct pt_regs *);
 extern __visible void smp_call_function_interrupt(struct pt_regs *);
-extern __visible void smp_call_function_single_interrupt(struct pt_regs *);
 extern __visible void smp_invalidate_interrupt(struct pt_regs *);
 #endif
 
diff --git a/arch/x86/include/asm/irq_vectors.h b/arch/x86/include/asm/irq_vectors.h
index 5702d7e..98a302d 100644
--- a/arch/x86/include/asm/irq_vectors.h
+++ b/arch/x86/include/asm/irq_vectors.h
@@ -92,10 +92,9 @@
 #define ERROR_APIC_VECTOR		0xfe
 #define RESCHEDULE_VECTOR		0xfd
 #define CALL_FUNCTION_VECTOR		0xfc
-#define CALL_FUNCTION_SINGLE_VECTOR	0xfb
-#define THERMAL_APIC_VECTOR		0xfa
-#define THRESHOLD_APIC_VECTOR		0xf9
-#define REBOOT_VECTOR			0xf8
+#define THERMAL_APIC_VECTOR		0xfb
+#define THRESHOLD_APIC_VECTOR		0xfa
+#define REBOOT_VECTOR			0xf9
 
 /*
  * Generic system vector for platform specific use
diff --git a/arch/x86/include/asm/trace/irq_vectors.h b/arch/x86/include/asm/trace/irq_vectors.h
index 4cab890..e672e20 100644
--- a/arch/x86/include/asm/trace/irq_vectors.h
+++ b/arch/x86/include/asm/trace/irq_vectors.h
@@ -89,12 +89,6 @@ TRACE_EVENT_PERF_PERM(irq_work_exit, is_sampling_event(p_event) ? -EPERM : 0);
 DEFINE_IRQ_VECTOR_EVENT(call_function);
 
 /*
- * call_function_single - called when entering/exiting a call function
- * single interrupt vector handler
- */
-DEFINE_IRQ_VECTOR_EVENT(call_function_single);
-
-/*
  * threshold_apic - called when entering/exiting a threshold apic interrupt
  * vector handler
  */
diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S
index e21b078..8d5d21a 100644
--- a/arch/x86/kernel/entry_64.S
+++ b/arch/x86/kernel/entry_64.S
@@ -1182,8 +1182,6 @@ apicinterrupt THERMAL_APIC_VECTOR \
 #endif
 
 #ifdef CONFIG_SMP
-apicinterrupt CALL_FUNCTION_SINGLE_VECTOR \
-	call_function_single_interrupt smp_call_function_single_interrupt
 apicinterrupt CALL_FUNCTION_VECTOR \
 	call_function_interrupt smp_call_function_interrupt
 apicinterrupt RESCHEDULE_VECTOR \
diff --git a/arch/x86/kernel/irqinit.c b/arch/x86/kernel/irqinit.c
index a2a1fbc..4aa1b8c 100644
--- a/arch/x86/kernel/irqinit.c
+++ b/arch/x86/kernel/irqinit.c
@@ -141,10 +141,6 @@ static void __init smp_intr_init(void)
 	/* IPI for generic function call */
 	alloc_intr_gate(CALL_FUNCTION_VECTOR, call_function_interrupt);
 
-	/* IPI for generic single function call */
-	alloc_intr_gate(CALL_FUNCTION_SINGLE_VECTOR,
-			call_function_single_interrupt);
-
 	/* Low priority IPI to cleanup after moving an irq */
 	set_intr_gate(IRQ_MOVE_CLEANUP_VECTOR, irq_move_cleanup_interrupt);
 	set_bit(IRQ_MOVE_CLEANUP_VECTOR, used_vectors);
diff --git a/arch/x86/kernel/smp.c b/arch/x86/kernel/smp.c
index 7c3a5a6..f363dd2 100644
--- a/arch/x86/kernel/smp.c
+++ b/arch/x86/kernel/smp.c
@@ -129,7 +129,7 @@ static void native_smp_send_reschedule(int cpu)
 
 void native_send_call_func_single_ipi(int cpu)
 {
-	apic->send_IPI_mask(cpumask_of(cpu), CALL_FUNCTION_SINGLE_VECTOR);
+	apic->send_IPI_mask(cpumask_of(cpu), CALL_FUNCTION_VECTOR);
 }
 
 void native_send_call_func_ipi(const struct cpumask *mask)
@@ -311,28 +311,6 @@ __visible void smp_trace_call_function_interrupt(struct pt_regs *regs)
 	exiting_irq();
 }
 
-static inline void __smp_call_function_single_interrupt(void)
-{
-	generic_smp_call_function_single_interrupt();
-	inc_irq_stat(irq_call_count);
-}
-
-__visible void smp_call_function_single_interrupt(struct pt_regs *regs)
-{
-	smp_entering_irq();
-	__smp_call_function_single_interrupt();
-	exiting_irq();
-}
-
-__visible void smp_trace_call_function_single_interrupt(struct pt_regs *regs)
-{
-	smp_entering_irq();
-	trace_call_function_single_entry(CALL_FUNCTION_SINGLE_VECTOR);
-	__smp_call_function_single_interrupt();
-	trace_call_function_single_exit(CALL_FUNCTION_SINGLE_VECTOR);
-	exiting_irq();
-}
-
 static int __init nonmi_ipi_setup(char *str)
 {
 	smp_no_nmi_ipi = true;
diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c
index 7cf1689..f241792 100644
--- a/arch/x86/xen/smp.c
+++ b/arch/x86/xen/smp.c
@@ -560,7 +560,6 @@ static inline int xen_map_vector(int vector)
 		xen_vector = XEN_RESCHEDULE_VECTOR;
 		break;
 	case CALL_FUNCTION_VECTOR:
-	case CALL_FUNCTION_SINGLE_VECTOR:
 		xen_vector = XEN_CALL_FUNCTION_VECTOR;
 		break;
 	case IRQ_WORK_VECTOR:
-- 
1.8.1.2


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v3 [resend] 16/18] smp: cleanup unsued generic_smp_call_function_single_interrupt()
  2013-12-15 16:36 [PATCH v3 [resend] 00/18] simplify generic cross CPU function call implementation Jiang Liu
                   ` (14 preceding siblings ...)
  2013-12-15 16:36 ` [PATCH v3 [resend] 15/18] smp, x86: " Jiang Liu
@ 2013-12-15 16:36 ` Jiang Liu
  2013-12-15 16:36 ` [PATCH v3 [resend] 17/18] smp: rename call_single_queue as call_function_queue Jiang Liu
  2013-12-15 16:36 ` [PATCH v3 [resend] 18/18] SMP, trivial: remove unused code from smp_boot.h Jiang Liu
  17 siblings, 0 replies; 33+ messages in thread
From: Jiang Liu @ 2013-12-15 16:36 UTC (permalink / raw)
  To: Andrew Morton, Shaohua Li, David Daney, Michal Hocko, liguang,
	Christoph Hellwig, Ingo Molnar, Wang YanQing, Jiang Liu,
	linux-kernel
  Cc: Ingo Molnar, Peter Zijlstra, Steven Rostedt, Jiri Kosina,
	linux-arch, Jiang Liu

From: Jiang Liu <jiang.liu@huawei.com>

Now we have killed all usage of generic_smp_call_function_single_interrupt()
from arch code, so kill it.

Signed-off-by: Jiang Liu <jiang.liu@huawei.com>
Cc: Jiang Liu <liuj97@gmail.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Shaohua Li <shli@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Jiri Kosina <trivial@kernel.org>
Signed-off-by: Jiang Liu <liuj97@gmail.com>
---
 include/linux/smp.h | 7 ++++---
 kernel/smp.c        | 2 +-
 2 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/include/linux/smp.h b/include/linux/smp.h
index 5da22ee..5261608 100644
--- a/include/linux/smp.h
+++ b/include/linux/smp.h
@@ -107,9 +107,10 @@ void kick_all_cpus_sync(void);
  * Generic and arch helpers
  */
 void __init call_function_init(void);
-void generic_smp_call_function_single_interrupt(void);
-#define generic_smp_call_function_interrupt \
-	generic_smp_call_function_single_interrupt
+void smp_call_function_interrupt(void);
+#define generic_smp_call_function_interrupt	smp_call_function_interrupt
+#define generic_smp_call_function_single_interrupt \
+	smp_call_function_interrupt
 
 /*
  * Mark the boot cpu "online" so that it can call console drivers in
diff --git a/kernel/smp.c b/kernel/smp.c
index 25c19af..144a427 100644
--- a/kernel/smp.c
+++ b/kernel/smp.c
@@ -167,7 +167,7 @@ static void generic_exec_single(int cpu, struct call_single_data *csd, int wait)
  * Invoked by arch to handle an IPI for call function single. Must be
  * called from the arch with interrupts disabled.
  */
-void generic_smp_call_function_single_interrupt(void)
+void smp_call_function_interrupt(void)
 {
 	struct call_single_queue *q = &__get_cpu_var(call_single_queue);
 	LIST_HEAD(list);
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v3 [resend] 17/18] smp: rename call_single_queue as call_function_queue
  2013-12-15 16:36 [PATCH v3 [resend] 00/18] simplify generic cross CPU function call implementation Jiang Liu
                   ` (15 preceding siblings ...)
  2013-12-15 16:36 ` [PATCH v3 [resend] 16/18] smp: cleanup unsued generic_smp_call_function_single_interrupt() Jiang Liu
@ 2013-12-15 16:36 ` Jiang Liu
  2013-12-15 16:36 ` [PATCH v3 [resend] 18/18] SMP, trivial: remove unused code from smp_boot.h Jiang Liu
  17 siblings, 0 replies; 33+ messages in thread
From: Jiang Liu @ 2013-12-15 16:36 UTC (permalink / raw)
  To: Andrew Morton, Shaohua Li, Ingo Molnar, Christoph Hellwig,
	Wang YanQing, Jiang Liu, linux-kernel
  Cc: Ingo Molnar, Peter Zijlstra, Steven Rostedt, Jiri Kosina,
	linux-arch, Jiang Liu

From: Jiang Liu <jiang.liu@huawei.com>

Now the same list is used to serve both single and multiple function
call requests, so rename call_single_queue as call_function_queue.

Signed-off-by: Jiang Liu <jiang.liu@huawei.com>
Cc: Jiang Liu <liuj97@gmail.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Shaohua Li <shli@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Jiri Kosina <trivial@kernel.org>
Signed-off-by: Jiang Liu <liuj97@gmail.com>
---
 kernel/smp.c | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/kernel/smp.c b/kernel/smp.c
index 144a427..413183d 100644
--- a/kernel/smp.c
+++ b/kernel/smp.c
@@ -27,12 +27,12 @@ struct call_function_data {
 
 static DEFINE_PER_CPU_SHARED_ALIGNED(struct call_function_data, cfd_data);
 
-struct call_single_queue {
+struct call_function_queue {
 	struct list_head	list;
 	raw_spinlock_t		lock;
 };
 
-static DEFINE_PER_CPU_SHARED_ALIGNED(struct call_single_queue, call_single_queue);
+static DEFINE_PER_CPU_SHARED_ALIGNED(struct call_function_queue, call_function_queue);
 
 static int
 hotplug_cfd(struct notifier_block *nfb, unsigned long action, void *hcpu)
@@ -75,11 +75,11 @@ static struct notifier_block hotplug_cfd_notifier = {
 void __init call_function_init(void)
 {
 	void *cpu = (void *)(long)smp_processor_id();
+	struct call_function_queue *q;
 	int i;
 
 	for_each_possible_cpu(i) {
-		struct call_single_queue *q = &per_cpu(call_single_queue, i);
-
+		q = &per_cpu(call_function_queue, i);
 		raw_spin_lock_init(&q->lock);
 		INIT_LIST_HEAD(&q->list);
 	}
@@ -133,7 +133,7 @@ static void csd_unlock(struct call_single_data *csd)
  */
 static void generic_exec_single(int cpu, struct call_single_data *csd, int wait)
 {
-	struct call_single_queue *dst = &per_cpu(call_single_queue, cpu);
+	struct call_function_queue *dst = &per_cpu(call_function_queue, cpu);
 	unsigned long flags;
 	int ipi;
 
@@ -164,12 +164,12 @@ static void generic_exec_single(int cpu, struct call_single_data *csd, int wait)
 }
 
 /*
- * Invoked by arch to handle an IPI for call function single. Must be
+ * Invoked by arch to handle an IPI for call function. Must be
  * called from the arch with interrupts disabled.
  */
 void smp_call_function_interrupt(void)
 {
-	struct call_single_queue *q = &__get_cpu_var(call_single_queue);
+	struct call_function_queue *q = &__get_cpu_var(call_function_queue);
 	LIST_HEAD(list);
 
 	/*
@@ -396,8 +396,8 @@ void smp_call_function_many(const struct cpumask *mask,
 
 	for_each_cpu(cpu, cfd->cpumask) {
 		struct call_single_data *csd = per_cpu_ptr(cfd->csd, cpu);
-		struct call_single_queue *dst =
-					&per_cpu(call_single_queue, cpu);
+		struct call_function_queue *dst =
+					&per_cpu(call_function_queue, cpu);
 		unsigned long flags;
 
 		csd_lock(csd);
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v3 [resend] 18/18] SMP, trivial: remove unused code from smp_boot.h
  2013-12-15 16:36 [PATCH v3 [resend] 00/18] simplify generic cross CPU function call implementation Jiang Liu
                   ` (16 preceding siblings ...)
  2013-12-15 16:36 ` [PATCH v3 [resend] 17/18] smp: rename call_single_queue as call_function_queue Jiang Liu
@ 2013-12-15 16:36 ` Jiang Liu
  2013-12-15 16:36   ` Jiang Liu
  17 siblings, 1 reply; 33+ messages in thread
From: Jiang Liu @ 2013-12-15 16:36 UTC (permalink / raw)
  To: Andrew Morton, Shaohua Li, Jiri Kosina, Thomas Gleixner,
	Jiang Liu, linux-kernel
  Cc: Ingo Molnar, Peter Zijlstra, Steven Rostedt, Wang YanQing,
	linux-arch, Jiang Liu

From: Jiang Liu <jiang.liu@huawei.com>

Function smpboot_thread_schedule() is never defined or used,
so remove it from smp_boot.h.

Signed-off-by: Jiang Liu <jiang.liu@huawei.com>
Cc: Jiang Liu <liuj97@gmail.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Shaohua Li <shli@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Jiri Kosina <trivial@kernel.org>
Signed-off-by: Jiang Liu <liuj97@gmail.com>
---
 include/linux/smpboot.h | 1 -
 1 file changed, 1 deletion(-)

diff --git a/include/linux/smpboot.h b/include/linux/smpboot.h
index 13e9296..d600afb 100644
--- a/include/linux/smpboot.h
+++ b/include/linux/smpboot.h
@@ -47,6 +47,5 @@ struct smp_hotplug_thread {
 
 int smpboot_register_percpu_thread(struct smp_hotplug_thread *plug_thread);
 void smpboot_unregister_percpu_thread(struct smp_hotplug_thread *plug_thread);
-int smpboot_thread_schedule(void);
 
 #endif
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v3 [resend] 18/18] SMP, trivial: remove unused code from smp_boot.h
  2013-12-15 16:36 ` [PATCH v3 [resend] 18/18] SMP, trivial: remove unused code from smp_boot.h Jiang Liu
@ 2013-12-15 16:36   ` Jiang Liu
  0 siblings, 0 replies; 33+ messages in thread
From: Jiang Liu @ 2013-12-15 16:36 UTC (permalink / raw)
  To: Andrew Morton, Shaohua Li, Jiri Kosina, Thomas Gleixner,
	Jiang Liu, linux-kernel
  Cc: Ingo Molnar, Peter Zijlstra, Steven Rostedt, Wang YanQing,
	linux-arch, Jiang Liu

From: Jiang Liu <jiang.liu@huawei.com>

Function smpboot_thread_schedule() is never defined or used,
so remove it from smp_boot.h.

Signed-off-by: Jiang Liu <jiang.liu@huawei.com>
Cc: Jiang Liu <liuj97@gmail.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Shaohua Li <shli@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Jiri Kosina <trivial@kernel.org>
Signed-off-by: Jiang Liu <liuj97@gmail.com>
---
 include/linux/smpboot.h | 1 -
 1 file changed, 1 deletion(-)

diff --git a/include/linux/smpboot.h b/include/linux/smpboot.h
index 13e9296..d600afb 100644
--- a/include/linux/smpboot.h
+++ b/include/linux/smpboot.h
@@ -47,6 +47,5 @@ struct smp_hotplug_thread {
 
 int smpboot_register_percpu_thread(struct smp_hotplug_thread *plug_thread);
 void smpboot_unregister_percpu_thread(struct smp_hotplug_thread *plug_thread);
-int smpboot_thread_schedule(void);
 
 #endif
-- 
1.8.1.2


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* Re: [PATCH v3 [resend] 14/18] smp, x86, xen: kill SMP single function call interrupt
  2013-12-15 16:36 ` [PATCH v3 [resend] 14/18] smp, x86, xen: " Jiang Liu
  2013-12-15 16:36   ` Jiang Liu
@ 2013-12-16  3:00   ` Konrad Rzeszutek Wilk
  2013-12-16  3:00     ` Konrad Rzeszutek Wilk
  2013-12-16  4:24     ` Liu, Jinsong
  1 sibling, 2 replies; 33+ messages in thread
From: Konrad Rzeszutek Wilk @ 2013-12-16  3:00 UTC (permalink / raw)
  To: Jiang Liu
  Cc: linux-arch, Jeremy Fitzhardinge, xen-devel, Jiri Kosina,
	Peter Zijlstra, x86, linux-kernel, Steven Rostedt, Wang YanQing,
	Sebastian Andrzej Siewior, Ingo Molnar, Thomas Gleixner,
	David Vrabel, Ingo Molnar, H. Peter Anvin, xen-devel,
	Andrew Morton, virtualization, Shaohua Li, Boris Ostrovsky

On Mon, Dec 16, 2013 at 12:36:36AM +0800, Jiang Liu wrote:
> Commit 9a46ad6d6df3b54 "smp: make smp_call_function_many() use logic
> similar to smp_call_function_single()" has unified the way to handle
> single and multiple cross-CPU function calls. Now only one interrupt
> is needed for architecture specific code to support generic SMP function
> call interfaces, so kill the redundant single function call interrupt.
> 
> Cc: Andrew Morton <akpm@linux-foundation.org>
> Cc: Shaohua Li <shli@kernel.org>
> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
> Cc: Ingo Molnar <mingo@elte.hu>
> Cc: Steven Rostedt <rostedt@goodmis.org>
> Cc: Jiri Kosina <trivial@kernel.org>
> Cc: Thomas Gleixner <tglx@linutronix.de>
> Cc: "H. Peter Anvin" <hpa@zytor.com>
> Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>

I presume this has been tested?

> Cc: Jeremy Fitzhardinge <jeremy@goop.org>
> Cc: Sebastian Andrzej Siewior <sebastian@breakpoint.cc>
> Cc: x86@kernel.org
> Cc: xen-devel@lists.xensource.com
> Cc: virtualization@lists.linux-foundation.org
> Signed-off-by: Jiang Liu <liuj97@gmail.com>
> ---
>  arch/x86/include/asm/xen/events.h |  1 -
>  arch/x86/xen/smp.c                | 38 ++------------------------------------
>  2 files changed, 2 insertions(+), 37 deletions(-)
> 
> diff --git a/arch/x86/include/asm/xen/events.h b/arch/x86/include/asm/xen/events.h
> index 608a79d..a9e54dc 100644
> --- a/arch/x86/include/asm/xen/events.h
> +++ b/arch/x86/include/asm/xen/events.h
> @@ -4,7 +4,6 @@
>  enum ipi_vector {
>  	XEN_RESCHEDULE_VECTOR,
>  	XEN_CALL_FUNCTION_VECTOR,
> -	XEN_CALL_FUNCTION_SINGLE_VECTOR,
>  	XEN_SPIN_UNLOCK_VECTOR,
>  	XEN_IRQ_WORK_VECTOR,
>  	XEN_NMI_VECTOR,
> diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c
> index c36b325..7cf1689 100644
> --- a/arch/x86/xen/smp.c
> +++ b/arch/x86/xen/smp.c
> @@ -46,12 +46,10 @@ struct xen_common_irq {
>  };
>  static DEFINE_PER_CPU(struct xen_common_irq, xen_resched_irq) = { .irq = -1 };
>  static DEFINE_PER_CPU(struct xen_common_irq, xen_callfunc_irq) = { .irq = -1 };
> -static DEFINE_PER_CPU(struct xen_common_irq, xen_callfuncsingle_irq) = { .irq = -1 };
>  static DEFINE_PER_CPU(struct xen_common_irq, xen_irq_work) = { .irq = -1 };
>  static DEFINE_PER_CPU(struct xen_common_irq, xen_debug_irq) = { .irq = -1 };
>  
>  static irqreturn_t xen_call_function_interrupt(int irq, void *dev_id);
> -static irqreturn_t xen_call_function_single_interrupt(int irq, void *dev_id);
>  static irqreturn_t xen_irq_work_interrupt(int irq, void *dev_id);
>  
>  /*
> @@ -123,13 +121,6 @@ static void xen_smp_intr_free(unsigned int cpu)
>  		kfree(per_cpu(xen_debug_irq, cpu).name);
>  		per_cpu(xen_debug_irq, cpu).name = NULL;
>  	}
> -	if (per_cpu(xen_callfuncsingle_irq, cpu).irq >= 0) {
> -		unbind_from_irqhandler(per_cpu(xen_callfuncsingle_irq, cpu).irq,
> -				       NULL);
> -		per_cpu(xen_callfuncsingle_irq, cpu).irq = -1;
> -		kfree(per_cpu(xen_callfuncsingle_irq, cpu).name);
> -		per_cpu(xen_callfuncsingle_irq, cpu).name = NULL;
> -	}
>  	if (xen_hvm_domain())
>  		return;
>  
> @@ -178,18 +169,6 @@ static int xen_smp_intr_init(unsigned int cpu)
>  	per_cpu(xen_debug_irq, cpu).irq = rc;
>  	per_cpu(xen_debug_irq, cpu).name = debug_name;
>  
> -	callfunc_name = kasprintf(GFP_KERNEL, "callfuncsingle%d", cpu);
> -	rc = bind_ipi_to_irqhandler(XEN_CALL_FUNCTION_SINGLE_VECTOR,
> -				    cpu,
> -				    xen_call_function_single_interrupt,
> -				    IRQF_PERCPU|IRQF_NOBALANCING,
> -				    callfunc_name,
> -				    NULL);
> -	if (rc < 0)
> -		goto fail;
> -	per_cpu(xen_callfuncsingle_irq, cpu).irq = rc;
> -	per_cpu(xen_callfuncsingle_irq, cpu).name = callfunc_name;
> -
>  	/*
>  	 * The IRQ worker on PVHVM goes through the native path and uses the
>  	 * IPI mechanism.
> @@ -569,8 +548,7 @@ static void xen_smp_send_call_function_ipi(const struct cpumask *mask)
>  
>  static void xen_smp_send_call_function_single_ipi(int cpu)
>  {
> -	__xen_send_IPI_mask(cpumask_of(cpu),
> -			  XEN_CALL_FUNCTION_SINGLE_VECTOR);
> +	__xen_send_IPI_mask(cpumask_of(cpu), XEN_CALL_FUNCTION_VECTOR);
>  }
>  
>  static inline int xen_map_vector(int vector)
> @@ -582,10 +560,8 @@ static inline int xen_map_vector(int vector)
>  		xen_vector = XEN_RESCHEDULE_VECTOR;
>  		break;
>  	case CALL_FUNCTION_VECTOR:
> -		xen_vector = XEN_CALL_FUNCTION_VECTOR;
> -		break;
>  	case CALL_FUNCTION_SINGLE_VECTOR:
> -		xen_vector = XEN_CALL_FUNCTION_SINGLE_VECTOR;
> +		xen_vector = XEN_CALL_FUNCTION_VECTOR;
>  		break;
>  	case IRQ_WORK_VECTOR:
>  		xen_vector = XEN_IRQ_WORK_VECTOR;
> @@ -663,16 +639,6 @@ static irqreturn_t xen_call_function_interrupt(int irq, void *dev_id)
>  	return IRQ_HANDLED;
>  }
>  
> -static irqreturn_t xen_call_function_single_interrupt(int irq, void *dev_id)
> -{
> -	irq_enter();
> -	generic_smp_call_function_single_interrupt();
> -	inc_irq_stat(irq_call_count);
> -	irq_exit();
> -
> -	return IRQ_HANDLED;
> -}
> -
>  static irqreturn_t xen_irq_work_interrupt(int irq, void *dev_id)
>  {
>  	irq_enter();
> -- 
> 1.8.1.2
> 

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v3 [resend] 14/18] smp, x86, xen: kill SMP single function call interrupt
  2013-12-16  3:00   ` Konrad Rzeszutek Wilk
@ 2013-12-16  3:00     ` Konrad Rzeszutek Wilk
  2013-12-16  4:24     ` Liu, Jinsong
  1 sibling, 0 replies; 33+ messages in thread
From: Konrad Rzeszutek Wilk @ 2013-12-16  3:00 UTC (permalink / raw)
  To: Jiang Liu
  Cc: Andrew Morton, Shaohua Li, Boris Ostrovsky, David Vrabel,
	Thomas Gleixner, Ingo Molnar, H. Peter Anvin, x86, xen-devel,
	linux-kernel, Ingo Molnar, Peter Zijlstra, Steven Rostedt,
	Jiri Kosina, Wang YanQing, linux-arch, Jeremy Fitzhardinge,
	Sebastian Andrzej Siewior, xen-devel, virtualization

On Mon, Dec 16, 2013 at 12:36:36AM +0800, Jiang Liu wrote:
> Commit 9a46ad6d6df3b54 "smp: make smp_call_function_many() use logic
> similar to smp_call_function_single()" has unified the way to handle
> single and multiple cross-CPU function calls. Now only one interrupt
> is needed for architecture specific code to support generic SMP function
> call interfaces, so kill the redundant single function call interrupt.
> 
> Cc: Andrew Morton <akpm@linux-foundation.org>
> Cc: Shaohua Li <shli@kernel.org>
> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
> Cc: Ingo Molnar <mingo@elte.hu>
> Cc: Steven Rostedt <rostedt@goodmis.org>
> Cc: Jiri Kosina <trivial@kernel.org>
> Cc: Thomas Gleixner <tglx@linutronix.de>
> Cc: "H. Peter Anvin" <hpa@zytor.com>
> Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>

I presume this has been tested?

> Cc: Jeremy Fitzhardinge <jeremy@goop.org>
> Cc: Sebastian Andrzej Siewior <sebastian@breakpoint.cc>
> Cc: x86@kernel.org
> Cc: xen-devel@lists.xensource.com
> Cc: virtualization@lists.linux-foundation.org
> Signed-off-by: Jiang Liu <liuj97@gmail.com>
> ---
>  arch/x86/include/asm/xen/events.h |  1 -
>  arch/x86/xen/smp.c                | 38 ++------------------------------------
>  2 files changed, 2 insertions(+), 37 deletions(-)
> 
> diff --git a/arch/x86/include/asm/xen/events.h b/arch/x86/include/asm/xen/events.h
> index 608a79d..a9e54dc 100644
> --- a/arch/x86/include/asm/xen/events.h
> +++ b/arch/x86/include/asm/xen/events.h
> @@ -4,7 +4,6 @@
>  enum ipi_vector {
>  	XEN_RESCHEDULE_VECTOR,
>  	XEN_CALL_FUNCTION_VECTOR,
> -	XEN_CALL_FUNCTION_SINGLE_VECTOR,
>  	XEN_SPIN_UNLOCK_VECTOR,
>  	XEN_IRQ_WORK_VECTOR,
>  	XEN_NMI_VECTOR,
> diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c
> index c36b325..7cf1689 100644
> --- a/arch/x86/xen/smp.c
> +++ b/arch/x86/xen/smp.c
> @@ -46,12 +46,10 @@ struct xen_common_irq {
>  };
>  static DEFINE_PER_CPU(struct xen_common_irq, xen_resched_irq) = { .irq = -1 };
>  static DEFINE_PER_CPU(struct xen_common_irq, xen_callfunc_irq) = { .irq = -1 };
> -static DEFINE_PER_CPU(struct xen_common_irq, xen_callfuncsingle_irq) = { .irq = -1 };
>  static DEFINE_PER_CPU(struct xen_common_irq, xen_irq_work) = { .irq = -1 };
>  static DEFINE_PER_CPU(struct xen_common_irq, xen_debug_irq) = { .irq = -1 };
>  
>  static irqreturn_t xen_call_function_interrupt(int irq, void *dev_id);
> -static irqreturn_t xen_call_function_single_interrupt(int irq, void *dev_id);
>  static irqreturn_t xen_irq_work_interrupt(int irq, void *dev_id);
>  
>  /*
> @@ -123,13 +121,6 @@ static void xen_smp_intr_free(unsigned int cpu)
>  		kfree(per_cpu(xen_debug_irq, cpu).name);
>  		per_cpu(xen_debug_irq, cpu).name = NULL;
>  	}
> -	if (per_cpu(xen_callfuncsingle_irq, cpu).irq >= 0) {
> -		unbind_from_irqhandler(per_cpu(xen_callfuncsingle_irq, cpu).irq,
> -				       NULL);
> -		per_cpu(xen_callfuncsingle_irq, cpu).irq = -1;
> -		kfree(per_cpu(xen_callfuncsingle_irq, cpu).name);
> -		per_cpu(xen_callfuncsingle_irq, cpu).name = NULL;
> -	}
>  	if (xen_hvm_domain())
>  		return;
>  
> @@ -178,18 +169,6 @@ static int xen_smp_intr_init(unsigned int cpu)
>  	per_cpu(xen_debug_irq, cpu).irq = rc;
>  	per_cpu(xen_debug_irq, cpu).name = debug_name;
>  
> -	callfunc_name = kasprintf(GFP_KERNEL, "callfuncsingle%d", cpu);
> -	rc = bind_ipi_to_irqhandler(XEN_CALL_FUNCTION_SINGLE_VECTOR,
> -				    cpu,
> -				    xen_call_function_single_interrupt,
> -				    IRQF_PERCPU|IRQF_NOBALANCING,
> -				    callfunc_name,
> -				    NULL);
> -	if (rc < 0)
> -		goto fail;
> -	per_cpu(xen_callfuncsingle_irq, cpu).irq = rc;
> -	per_cpu(xen_callfuncsingle_irq, cpu).name = callfunc_name;
> -
>  	/*
>  	 * The IRQ worker on PVHVM goes through the native path and uses the
>  	 * IPI mechanism.
> @@ -569,8 +548,7 @@ static void xen_smp_send_call_function_ipi(const struct cpumask *mask)
>  
>  static void xen_smp_send_call_function_single_ipi(int cpu)
>  {
> -	__xen_send_IPI_mask(cpumask_of(cpu),
> -			  XEN_CALL_FUNCTION_SINGLE_VECTOR);
> +	__xen_send_IPI_mask(cpumask_of(cpu), XEN_CALL_FUNCTION_VECTOR);
>  }
>  
>  static inline int xen_map_vector(int vector)
> @@ -582,10 +560,8 @@ static inline int xen_map_vector(int vector)
>  		xen_vector = XEN_RESCHEDULE_VECTOR;
>  		break;
>  	case CALL_FUNCTION_VECTOR:
> -		xen_vector = XEN_CALL_FUNCTION_VECTOR;
> -		break;
>  	case CALL_FUNCTION_SINGLE_VECTOR:
> -		xen_vector = XEN_CALL_FUNCTION_SINGLE_VECTOR;
> +		xen_vector = XEN_CALL_FUNCTION_VECTOR;
>  		break;
>  	case IRQ_WORK_VECTOR:
>  		xen_vector = XEN_IRQ_WORK_VECTOR;
> @@ -663,16 +639,6 @@ static irqreturn_t xen_call_function_interrupt(int irq, void *dev_id)
>  	return IRQ_HANDLED;
>  }
>  
> -static irqreturn_t xen_call_function_single_interrupt(int irq, void *dev_id)
> -{
> -	irq_enter();
> -	generic_smp_call_function_single_interrupt();
> -	inc_irq_stat(irq_call_count);
> -	irq_exit();
> -
> -	return IRQ_HANDLED;
> -}
> -
>  static irqreturn_t xen_irq_work_interrupt(int irq, void *dev_id)
>  {
>  	irq_enter();
> -- 
> 1.8.1.2
> 

^ permalink raw reply	[flat|nested] 33+ messages in thread

* RE: [PATCH v3 [resend] 14/18] smp, x86, xen: kill SMP single function call interrupt
  2013-12-16  3:00   ` Konrad Rzeszutek Wilk
  2013-12-16  3:00     ` Konrad Rzeszutek Wilk
@ 2013-12-16  4:24     ` Liu, Jinsong
  2013-12-16  4:24       ` Liu, Jinsong
  2013-12-16 16:33       ` Konrad Rzeszutek Wilk
  1 sibling, 2 replies; 33+ messages in thread
From: Liu, Jinsong @ 2013-12-16  4:24 UTC (permalink / raw)
  To: Konrad Rzeszutek Wilk, Jiang Liu
  Cc: Andrew Morton, Shaohua Li, Boris Ostrovsky, David Vrabel,
	Thomas Gleixner, Ingo Molnar, H. Peter Anvin, x86@kernel.org,
	xen-devel@lists.xenproject.org, linux-kernel@vger.kernel.org,
	Ingo Molnar, Peter Zijlstra, Steven Rostedt, Jiri Kosina,
	Wang YanQing, linux-arch@vger.kernel.org, Jeremy Fitzhardinge,
	Sebastian Andrzej Siewior, xen-devel@lists.xensource.com,
	"virtualization@lists.linux-foundation.org" <virtual>

Konrad Rzeszutek Wilk wrote:
> On Mon, Dec 16, 2013 at 12:36:36AM +0800, Jiang Liu wrote:
>> Commit 9a46ad6d6df3b54 "smp: make smp_call_function_many() use logic
>> similar to smp_call_function_single()" has unified the way to handle
>> single and multiple cross-CPU function calls. Now only one interrupt
>> is needed for architecture specific code to support generic SMP
>> function 
>> call interfaces, so kill the redundant single function call
>> interrupt. 
>> 
>> Cc: Andrew Morton <akpm@linux-foundation.org>
>> Cc: Shaohua Li <shli@kernel.org>
>> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
>> Cc: Ingo Molnar <mingo@elte.hu>
>> Cc: Steven Rostedt <rostedt@goodmis.org>
>> Cc: Jiri Kosina <trivial@kernel.org>
>> Cc: Thomas Gleixner <tglx@linutronix.de>
>> Cc: "H. Peter Anvin" <hpa@zytor.com>
>> Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> 
> I presume this has been tested?
> 

I have just test Jiang's patch, it works fine for dom0 booting.

Thanks,
Jinsong

^ permalink raw reply	[flat|nested] 33+ messages in thread

* RE: [PATCH v3 [resend] 14/18] smp, x86, xen: kill SMP single function call interrupt
  2013-12-16  4:24     ` Liu, Jinsong
@ 2013-12-16  4:24       ` Liu, Jinsong
  2013-12-16 16:33       ` Konrad Rzeszutek Wilk
  1 sibling, 0 replies; 33+ messages in thread
From: Liu, Jinsong @ 2013-12-16  4:24 UTC (permalink / raw)
  To: Konrad Rzeszutek Wilk, Jiang Liu
  Cc: Andrew Morton, Shaohua Li, Boris Ostrovsky, David Vrabel,
	Thomas Gleixner, Ingo Molnar, H. Peter Anvin, x86@kernel.org,
	xen-devel@lists.xenproject.org, linux-kernel@vger.kernel.org,
	Ingo Molnar, Peter Zijlstra, Steven Rostedt, Jiri Kosina,
	Wang YanQing, linux-arch@vger.kernel.org, Jeremy Fitzhardinge,
	Sebastian Andrzej Siewior, xen-devel@lists.xensource.com,
	virtualization@lists.linux-foundation.org

Konrad Rzeszutek Wilk wrote:
> On Mon, Dec 16, 2013 at 12:36:36AM +0800, Jiang Liu wrote:
>> Commit 9a46ad6d6df3b54 "smp: make smp_call_function_many() use logic
>> similar to smp_call_function_single()" has unified the way to handle
>> single and multiple cross-CPU function calls. Now only one interrupt
>> is needed for architecture specific code to support generic SMP
>> function 
>> call interfaces, so kill the redundant single function call
>> interrupt. 
>> 
>> Cc: Andrew Morton <akpm@linux-foundation.org>
>> Cc: Shaohua Li <shli@kernel.org>
>> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
>> Cc: Ingo Molnar <mingo@elte.hu>
>> Cc: Steven Rostedt <rostedt@goodmis.org>
>> Cc: Jiri Kosina <trivial@kernel.org>
>> Cc: Thomas Gleixner <tglx@linutronix.de>
>> Cc: "H. Peter Anvin" <hpa@zytor.com>
>> Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> 
> I presume this has been tested?
> 

I have just test Jiang's patch, it works fine for dom0 booting.

Thanks,
Jinsong



^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v3 [resend] 14/18] smp, x86, xen: kill SMP single function call interrupt
  2013-12-16  4:24     ` Liu, Jinsong
  2013-12-16  4:24       ` Liu, Jinsong
@ 2013-12-16 16:33       ` Konrad Rzeszutek Wilk
  2013-12-16 16:33         ` Konrad Rzeszutek Wilk
  1 sibling, 1 reply; 33+ messages in thread
From: Konrad Rzeszutek Wilk @ 2013-12-16 16:33 UTC (permalink / raw)
  To: Liu, Jinsong
  Cc: linux-arch@vger.kernel.org, Jeremy Fitzhardinge,
	xen-devel@lists.xensource.com, Jiri Kosina, Peter Zijlstra,
	x86@kernel.org, linux-kernel@vger.kernel.org, Steven Rostedt,
	Wang YanQing, Sebastian Andrzej Siewior, Ingo Molnar,
	Thomas Gleixner, David Vrabel, Ingo Molnar, H. Peter Anvin,
	xen-devel@lists.xenproject.org, Andrew Morton,
	virtualization@lists.linux-foundation.org, Shaohua Li

On Mon, Dec 16, 2013 at 04:24:41AM +0000, Liu, Jinsong wrote:
> Konrad Rzeszutek Wilk wrote:
> > On Mon, Dec 16, 2013 at 12:36:36AM +0800, Jiang Liu wrote:
> >> Commit 9a46ad6d6df3b54 "smp: make smp_call_function_many() use logic
> >> similar to smp_call_function_single()" has unified the way to handle
> >> single and multiple cross-CPU function calls. Now only one interrupt
> >> is needed for architecture specific code to support generic SMP
> >> function 
> >> call interfaces, so kill the redundant single function call
> >> interrupt. 
> >> 
> >> Cc: Andrew Morton <akpm@linux-foundation.org>
> >> Cc: Shaohua Li <shli@kernel.org>
> >> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
> >> Cc: Ingo Molnar <mingo@elte.hu>
> >> Cc: Steven Rostedt <rostedt@goodmis.org>
> >> Cc: Jiri Kosina <trivial@kernel.org>
> >> Cc: Thomas Gleixner <tglx@linutronix.de>
> >> Cc: "H. Peter Anvin" <hpa@zytor.com>
> >> Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> > 
> > I presume this has been tested?
> > 
> 
> I have just test Jiang's patch, it works fine for dom0 booting.

Excellent! Please add Acked-by from me.

Thanks!

> 
> Thanks,
> Jinsong
> 
> 

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v3 [resend] 14/18] smp, x86, xen: kill SMP single function call interrupt
  2013-12-16 16:33       ` Konrad Rzeszutek Wilk
@ 2013-12-16 16:33         ` Konrad Rzeszutek Wilk
  0 siblings, 0 replies; 33+ messages in thread
From: Konrad Rzeszutek Wilk @ 2013-12-16 16:33 UTC (permalink / raw)
  To: Liu, Jinsong
  Cc: Jiang Liu, Andrew Morton, Shaohua Li, Boris Ostrovsky,
	David Vrabel, Thomas Gleixner, Ingo Molnar, H. Peter Anvin,
	x86@kernel.org, xen-devel@lists.xenproject.org,
	linux-kernel@vger.kernel.org, Ingo Molnar, Peter Zijlstra,
	Steven Rostedt, Jiri Kosina, Wang YanQing,
	linux-arch@vger.kernel.org, Jeremy Fitzhardinge,
	Sebastian Andrzej Siewior, xen-devel@lists.xensource.com,
	virtualization@lists.linux-foundation.org

On Mon, Dec 16, 2013 at 04:24:41AM +0000, Liu, Jinsong wrote:
> Konrad Rzeszutek Wilk wrote:
> > On Mon, Dec 16, 2013 at 12:36:36AM +0800, Jiang Liu wrote:
> >> Commit 9a46ad6d6df3b54 "smp: make smp_call_function_many() use logic
> >> similar to smp_call_function_single()" has unified the way to handle
> >> single and multiple cross-CPU function calls. Now only one interrupt
> >> is needed for architecture specific code to support generic SMP
> >> function 
> >> call interfaces, so kill the redundant single function call
> >> interrupt. 
> >> 
> >> Cc: Andrew Morton <akpm@linux-foundation.org>
> >> Cc: Shaohua Li <shli@kernel.org>
> >> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
> >> Cc: Ingo Molnar <mingo@elte.hu>
> >> Cc: Steven Rostedt <rostedt@goodmis.org>
> >> Cc: Jiri Kosina <trivial@kernel.org>
> >> Cc: Thomas Gleixner <tglx@linutronix.de>
> >> Cc: "H. Peter Anvin" <hpa@zytor.com>
> >> Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> > 
> > I presume this has been tested?
> > 
> 
> I have just test Jiang's patch, it works fine for dom0 booting.

Excellent! Please add Acked-by from me.

Thanks!

> 
> Thanks,
> Jinsong
> 
> 

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v3 [resend] 05/18] smp, ARM64: kill SMP single function call interrupt
  2013-12-15 16:36 ` [PATCH v3 [resend] 05/18] smp, ARM64: " Jiang Liu
@ 2013-12-17 17:16   ` Will Deacon
  0 siblings, 0 replies; 33+ messages in thread
From: Will Deacon @ 2013-12-17 17:16 UTC (permalink / raw)
  To: Jiang Liu
  Cc: Andrew Morton, Shaohua Li, Catalin Marinas, Mark Rutland,
	Javi Merino, Marc Zyngier, linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org, Ingo Molnar, Peter Zijlstra,
	Steven Rostedt, Jiri Kosina, Wang YanQing,
	linux-arch@vger.kernel.org, Arnd Bergmann

On Sun, Dec 15, 2013 at 04:36:27PM +0000, Jiang Liu wrote:
> Commit 9a46ad6d6df3b54 "smp: make smp_call_function_many() use logic
> similar to smp_call_function_single()" has unified the way to handle
> single and multiple cross-CPU function calls. Now only one interrupt
> is needed for architecture specific code to support generic SMP function
> call interfaces, so kill the redundant single function call interrupt.
> 
> Cc: Andrew Morton <akpm@linux-foundation.org>
> Cc: Shaohua Li <shli@kernel.org>
> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
> Cc: Ingo Molnar <mingo@elte.hu>
> Cc: Steven Rostedt <rostedt@goodmis.org>
> Cc: Jiri Kosina <trivial@kernel.org>
> Cc: Catalin Marinas <catalin.marinas@arm.com>
> Cc: Will Deacon <will.deacon@arm.com>
> Cc: Arnd Bergmann <arnd@arndb.de>
> Cc: linux-arm-kernel@lists.infradead.org
> Signed-off-by: Jiang Liu <liuj97@gmail.com>
> ---
>  arch/arm64/include/asm/hardirq.h |  2 +-
>  arch/arm64/kernel/smp.c          | 10 +---------
>  2 files changed, 2 insertions(+), 10 deletions(-)

  Acked-by: Will Deacon <will.deacon@arm.com>

I assume you're taking this series via some other route (than the arch/
trees) in order to deal with any core dependencies?

Will

^ permalink raw reply	[flat|nested] 33+ messages in thread

end of thread, other threads:[~2013-12-17 17:16 UTC | newest]

Thread overview: 33+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-12-15 16:36 [PATCH v3 [resend] 00/18] simplify generic cross CPU function call implementation Jiang Liu
2013-12-15 16:36 ` [PATCH v3 [resend] 01/18] Revert "kernel/smp.c: free related resources when failure occurs in hotplug_cfd()" Jiang Liu
2013-12-15 16:36 ` [PATCH v3 [resend] 02/18] Revert "smp: Fix SMP function call empty cpu mask race" Jiang Liu
2013-12-15 16:36 ` [PATCH v3 [resend] 03/18] smp, alpha: kill SMP single function call interrupt Jiang Liu
2013-12-15 16:36   ` Jiang Liu
2013-12-15 16:36 ` [PATCH v3 [resend] 04/18] smp, ARM: " Jiang Liu
2013-12-15 16:36 ` [PATCH v3 [resend] 05/18] smp, ARM64: " Jiang Liu
2013-12-17 17:16   ` Will Deacon
2013-12-15 16:36 ` [PATCH v3 [resend] 06/18] smp, blackfin: " Jiang Liu
2013-12-15 16:36 ` [PATCH v3 [resend] 07/18] smp, IA64: " Jiang Liu
2013-12-15 16:36   ` Jiang Liu
2013-12-15 16:36 ` [PATCH v3 [resend] 08/18] smp, m32r: " Jiang Liu
2013-12-15 16:36 ` [PATCH v3 [resend] 09/18] smp, mn10300: " Jiang Liu
2013-12-15 16:36 ` [PATCH v3 [resend] 10/18] smp, mn10300: enable arch_send_call_function_ipi_mask() Jiang Liu
2013-12-15 16:36 ` [PATCH v3 [resend] 11/18] smp, sh: kill SMP single function call interrupt Jiang Liu
2013-12-15 16:36   ` Jiang Liu
2013-12-15 16:36 ` [PATCH v3 [resend] 12/18] smp, sparc64: " Jiang Liu
2013-12-15 16:36   ` Jiang Liu
2013-12-15 16:36 ` [PATCH v3 [resend] 13/18] smp, sparc: " Jiang Liu
2013-12-15 16:36 ` [PATCH v3 [resend] 14/18] smp, x86, xen: " Jiang Liu
2013-12-15 16:36   ` Jiang Liu
2013-12-16  3:00   ` Konrad Rzeszutek Wilk
2013-12-16  3:00     ` Konrad Rzeszutek Wilk
2013-12-16  4:24     ` Liu, Jinsong
2013-12-16  4:24       ` Liu, Jinsong
2013-12-16 16:33       ` Konrad Rzeszutek Wilk
2013-12-16 16:33         ` Konrad Rzeszutek Wilk
2013-12-15 16:36 ` [PATCH v3 [resend] 15/18] smp, x86: " Jiang Liu
2013-12-15 16:36   ` Jiang Liu
2013-12-15 16:36 ` [PATCH v3 [resend] 16/18] smp: cleanup unsued generic_smp_call_function_single_interrupt() Jiang Liu
2013-12-15 16:36 ` [PATCH v3 [resend] 17/18] smp: rename call_single_queue as call_function_queue Jiang Liu
2013-12-15 16:36 ` [PATCH v3 [resend] 18/18] SMP, trivial: remove unused code from smp_boot.h Jiang Liu
2013-12-15 16:36   ` Jiang Liu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).