git: 74f80bc1af2f - main - coretemp(4): Switch to smp_rendezvous_cpus().
Konstantin Belousov
kostikbel at gmail.com
Sat Jul 31 12:48:40 UTC 2021
On Fri, Jul 30, 2021 at 03:26:16AM +0000, Alexander Motin wrote:
> The branch main has been updated by mav:
>
> URL: https://cgit.FreeBSD.org/src/commit/?id=74f80bc1af2ffd56ec290f610c80e46f768731a0
>
> commit 74f80bc1af2ffd56ec290f610c80e46f768731a0
> Author: Alexander Motin <mav at FreeBSD.org>
> AuthorDate: 2021-07-30 03:16:22 +0000
> Commit: Alexander Motin <mav at FreeBSD.org>
> CommitDate: 2021-07-30 03:26:10 +0000
>
> coretemp(4): Switch to smp_rendezvous_cpus().
>
> Use of smp_rendezvous_cpus() instead of sched_bind() allows to not
> block indefinitely if target CPU is running some thread with higher
> priority, while all we need is single rdmsr/wrmsr instruction call.
> I guess it should also be much cheaper than full thread migration.
>
> MFC after: 2 weeks
> Sponsored by: iXsystems, Inc.
> ---
> sys/dev/coretemp/coretemp.c | 59 ++++++++++++++++++++++++++++-----------------
> 1 file changed, 37 insertions(+), 22 deletions(-)
>
> diff --git a/sys/dev/coretemp/coretemp.c b/sys/dev/coretemp/coretemp.c
> index 884ed6309f0e..53a2434254f6 100644
> --- a/sys/dev/coretemp/coretemp.c
> +++ b/sys/dev/coretemp/coretemp.c
> @@ -42,7 +42,7 @@ __FBSDID("$FreeBSD$");
> #include <sys/module.h>
> #include <sys/mutex.h>
> #include <sys/proc.h> /* for curthread */
> -#include <sys/sched.h>
> +#include <sys/smp.h>
> #include <sys/sysctl.h>
> #include <sys/systm.h>
>
> @@ -310,14 +310,32 @@ coretemp_detach(device_t dev)
> return (0);
> }
>
> +struct coretemp_args {
> + u_int msr;
> + uint64_t val;
> +};
> +
> +static void
> +coretemp_rdmsr(void *arg)
> +{
> + struct coretemp_args *args = arg;
> +
> + args->val = rdmsr(args->msr);
> +}
> +
> +static void
> +coretemp_wrmsr(void *arg)
> +{
> + struct coretemp_args *args = arg;
> +
> + wrmsr(args->msr, args->val);
> +}
We have x86_msr_op(). It covers coretemp_wrmsr(), and with slight
change of the interface would also handle the functionality of
coretemp_rdmsr().
> +
> static uint64_t
> coretemp_get_thermal_msr(int cpu)
> {
> - uint64_t msr;
> -
> - thread_lock(curthread);
> - sched_bind(curthread, cpu);
> - thread_unlock(curthread);
> + struct coretemp_args args;
> + cpuset_t cpus;
>
> /*
> * The digital temperature reading is located at bit 16
> @@ -329,27 +347,24 @@ coretemp_get_thermal_msr(int cpu)
> * The temperature is computed by subtracting the temperature
> * reading by Tj(max).
> */
> - msr = rdmsr(MSR_THERM_STATUS);
> -
> - thread_lock(curthread);
> - sched_unbind(curthread);
> - thread_unlock(curthread);
> -
> - return (msr);
> + args.msr = MSR_THERM_STATUS;
> + CPU_SETOF(cpu, &cpus);
> + smp_rendezvous_cpus(cpus, smp_no_rendezvous_barrier, coretemp_rdmsr,
> + smp_no_rendezvous_barrier, &args);
> + return (args.val);
> }
>
> static void
> coretemp_clear_thermal_msr(int cpu)
> {
> - thread_lock(curthread);
> - sched_bind(curthread, cpu);
> - thread_unlock(curthread);
> -
> - wrmsr(MSR_THERM_STATUS, 0);
> -
> - thread_lock(curthread);
> - sched_unbind(curthread);
> - thread_unlock(curthread);
> + struct coretemp_args args;
> + cpuset_t cpus;
> +
> + args.msr = MSR_THERM_STATUS;
> + args.val = 0;
> + CPU_SETOF(cpu, &cpus);
> + smp_rendezvous_cpus(cpus, smp_no_rendezvous_barrier, coretemp_wrmsr,
> + smp_no_rendezvous_barrier, &args);
> }
>
> static int
More information about the dev-commits-src-all
mailing list