From: tip-bot for Juergen Gross <tipbot@zytor.com>
To: linux-tip-commits@vger.kernel.org
Cc: tglx@linutronix.de, peterz@infradead.org,
linux-kernel@vger.kernel.org, jgross@suse.com, mingo@kernel.org,
hpa@zytor.com, torvalds@linux-foundation.org
Subject: [tip:core/smp] smp: Add function to execute a function synchronously on a CPU
Date: Mon, 5 Sep 2016 06:28:48 -0700 [thread overview]
Message-ID: <tip-df8ce9d78a4e7fbe7ddfd8ccee3ecaaa0013e883@git.kernel.org> (raw)
In-Reply-To: <1472453327-19050-4-git-send-email-jgross@suse.com>
Commit-ID: df8ce9d78a4e7fbe7ddfd8ccee3ecaaa0013e883
Gitweb: http://git.kernel.org/tip/df8ce9d78a4e7fbe7ddfd8ccee3ecaaa0013e883
Author: Juergen Gross <jgross@suse.com>
AuthorDate: Mon, 29 Aug 2016 08:48:44 +0200
Committer: Ingo Molnar <mingo@kernel.org>
CommitDate: Mon, 5 Sep 2016 13:52:39 +0200
smp: Add function to execute a function synchronously on a CPU
On some hardware models (e.g. Dell Studio 1555 laptop) some hardware
related functions (e.g. SMIs) are to be executed on physical CPU 0
only. Instead of open coding such a functionality multiple times in
the kernel add a service function for this purpose. This will enable
the possibility to take special measures in virtualized environments
like Xen, too.
Signed-off-by: Juergen Gross <jgross@suse.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Douglas_Warzecha@dell.com
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: akataria@vmware.com
Cc: boris.ostrovsky@oracle.com
Cc: chrisw@sous-sol.org
Cc: david.vrabel@citrix.com
Cc: hpa@zytor.com
Cc: jdelvare@suse.com
Cc: jeremy@goop.org
Cc: linux@roeck-us.net
Cc: pali.rohar@gmail.com
Cc: rusty@rustcorp.com.au
Cc: virtualization@lists.linux-foundation.org
Cc: xen-devel@lists.xenproject.org
Link: http://lkml.kernel.org/r/1472453327-19050-4-git-send-email-jgross@suse.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
include/linux/smp.h | 3 +++
kernel/smp.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
kernel/up.c | 17 +++++++++++++++++
3 files changed, 70 insertions(+)
diff --git a/include/linux/smp.h b/include/linux/smp.h
index eccae469..8e0cb7a 100644
--- a/include/linux/smp.h
+++ b/include/linux/smp.h
@@ -196,6 +196,9 @@ extern void arch_enable_nonboot_cpus_end(void);
void smp_setup_processor_id(void);
+int smp_call_on_cpu(unsigned int cpu, int (*func)(void *), void *par,
+ bool phys);
+
/* SMP core functions */
int smpcfd_prepare_cpu(unsigned int cpu);
int smpcfd_dead_cpu(unsigned int cpu);
diff --git a/kernel/smp.c b/kernel/smp.c
index 4274ca5..f4f6137 100644
--- a/kernel/smp.c
+++ b/kernel/smp.c
@@ -725,3 +725,53 @@ void wake_up_all_idle_cpus(void)
preempt_enable();
}
EXPORT_SYMBOL_GPL(wake_up_all_idle_cpus);
+
+/**
+ * smp_call_on_cpu - Call a function on a specific cpu
+ *
+ * Used to call a function on a specific cpu and wait for it to return.
+ * Optionally make sure the call is done on a specified physical cpu via vcpu
+ * pinning in order to support virtualized environments.
+ */
+struct smp_call_on_cpu_struct {
+ struct work_struct work;
+ struct completion done;
+ int (*func)(void *);
+ void *data;
+ int ret;
+ int cpu;
+};
+
+static void smp_call_on_cpu_callback(struct work_struct *work)
+{
+ struct smp_call_on_cpu_struct *sscs;
+
+ sscs = container_of(work, struct smp_call_on_cpu_struct, work);
+ if (sscs->cpu >= 0)
+ hypervisor_pin_vcpu(sscs->cpu);
+ sscs->ret = sscs->func(sscs->data);
+ if (sscs->cpu >= 0)
+ hypervisor_pin_vcpu(-1);
+
+ complete(&sscs->done);
+}
+
+int smp_call_on_cpu(unsigned int cpu, int (*func)(void *), void *par, bool phys)
+{
+ struct smp_call_on_cpu_struct sscs = {
+ .work = __WORK_INITIALIZER(sscs.work, smp_call_on_cpu_callback),
+ .done = COMPLETION_INITIALIZER_ONSTACK(sscs.done),
+ .func = func,
+ .data = par,
+ .cpu = phys ? cpu : -1,
+ };
+
+ if (cpu >= nr_cpu_ids || !cpu_online(cpu))
+ return -ENXIO;
+
+ queue_work_on(cpu, system_wq, &sscs.work);
+ wait_for_completion(&sscs.done);
+
+ return sscs.ret;
+}
+EXPORT_SYMBOL_GPL(smp_call_on_cpu);
diff --git a/kernel/up.c b/kernel/up.c
index 3ccee2b..ee81ac9 100644
--- a/kernel/up.c
+++ b/kernel/up.c
@@ -83,3 +83,20 @@ void on_each_cpu_cond(bool (*cond_func)(int cpu, void *info),
preempt_enable();
}
EXPORT_SYMBOL(on_each_cpu_cond);
+
+int smp_call_on_cpu(unsigned int cpu, int (*func)(void *), void *par, bool phys)
+{
+ int ret;
+
+ if (cpu != 0)
+ return -ENXIO;
+
+ if (phys)
+ hypervisor_pin_vcpu(0);
+ ret = func(par);
+ if (phys)
+ hypervisor_pin_vcpu(-1);
+
+ return ret;
+}
+EXPORT_SYMBOL_GPL(smp_call_on_cpu);
next prev parent reply other threads:[~2016-09-05 13:30 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-08-29 6:48 [PATCH v6 0/6] Support calling functions on dedicated physical cpu Juergen Gross
2016-08-29 6:48 ` Juergen Gross
2016-08-29 6:48 ` [PATCH v6 1/6] xen: sync xen header Juergen Gross
2016-08-29 6:48 ` Juergen Gross
2016-09-05 13:27 ` [tip:core/smp] xen: Sync " tip-bot for Juergen Gross
2016-08-29 6:48 ` [PATCH v6 1/6] xen: sync " Juergen Gross
2016-08-29 6:48 ` [PATCH v6 2/6] virt, sched: add generic vcpu pinning support Juergen Gross
2016-08-29 6:48 ` Juergen Gross
2016-08-29 6:48 ` Juergen Gross
2016-09-05 13:28 ` [tip:core/smp] virt, sched: Add generic vCPU " tip-bot for Juergen Gross
2016-08-29 6:48 ` [PATCH v6 3/6] smp: add function to execute a function synchronously on a cpu Juergen Gross
2016-08-29 6:48 ` Juergen Gross
2016-09-05 13:28 ` tip-bot for Juergen Gross [this message]
2016-08-29 6:48 ` Juergen Gross
2016-08-29 6:48 ` [PATCH v6 4/6] xen: add xen_pin_vcpu() to support calling functions on a dedicated pcpu Juergen Gross
2016-08-29 6:48 ` Juergen Gross
2016-09-05 13:29 ` [tip:core/smp] xen: Add xen_pin_vcpu() to support calling functions on a dedicated pCPU tip-bot for Juergen Gross
2016-08-29 6:48 ` [PATCH v6 4/6] xen: add xen_pin_vcpu() to support calling functions on a dedicated pcpu Juergen Gross
2016-08-29 6:48 ` [PATCH v6 5/6] dcdbas: make use of smp_call_on_cpu() Juergen Gross
2016-08-29 6:48 ` Juergen Gross
2016-08-29 6:48 ` Juergen Gross
2016-09-05 13:29 ` [tip:core/smp] dcdbas: Make " tip-bot for Juergen Gross
2016-08-29 6:48 ` [PATCH v6 6/6] hwmon: use smp_call_on_cpu() for dell-smm i8k Juergen Gross
2016-08-29 6:48 ` Juergen Gross
2016-09-05 13:30 ` [tip:core/smp] hwmon: Use " tip-bot for Juergen Gross
2016-08-29 6:48 ` [PATCH v6 6/6] hwmon: use " Juergen Gross
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=tip-df8ce9d78a4e7fbe7ddfd8ccee3ecaaa0013e883@git.kernel.org \
--to=tipbot@zytor.com \
--cc=hpa@zytor.com \
--cc=jgross@suse.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-tip-commits@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=peterz@infradead.org \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.