Add on_each_cpu() and wbinvd_on_all_cpus().

Reviewed by:	hselasky
MFC after:	2 weeks
Differential Revision:	https://reviews.freebsd.org/D10550
This commit is contained in:
Mark Johnston 2017-05-01 16:32:28 +00:00
parent ba13ab83f2
commit c12488bbe0
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=317651
3 changed files with 111 additions and 1 deletions

View File

@ -0,0 +1,40 @@
/*-
* Copyright (c) 2017 Mark Johnston <markj@FreeBSD.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $FreeBSD$
*/
#ifndef _ASM_SMP_H_
#define _ASM_SMP_H_
#if defined(__i386__) || defined(__amd64__)
#define wbinvd_on_all_cpus() linux_wbinvd_on_all_cpus()
int linux_wbinvd_on_all_cpus(void);
#endif
#endif /* _ASM_SMP_H_ */

View File

@ -0,0 +1,39 @@
/*-
* Copyright (c) 2017 Mark Johnston <markj@FreeBSD.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $FreeBSD$
*/
#ifndef _LINUX_SMP_H_
#define _LINUX_SMP_H_
#define on_each_cpu(cb, data, wait) ({ \
CTASSERT(wait); \
linux_on_each_cpu(cb, data); \
})
extern int linux_on_each_cpu(void (*)(void *), void *);
#endif /* _LINUX_SMP_H_ */

View File

@ -48,6 +48,9 @@ __FBSDID("$FreeBSD$");
#include <vm/vm.h>
#include <vm/pmap.h>
#include <vm/vm_object.h>
#include <vm/vm_page.h>
#include <vm/vm_pager.h>
#include <machine/stdarg.h>
@ -74,8 +77,11 @@ __FBSDID("$FreeBSD$");
#include <linux/list.h>
#include <linux/compat.h>
#include <linux/poll.h>
#include <linux/smp.h>
#include <vm/vm_pager.h>
#if defined(__i386__) || defined(__amd64__)
#include <asm/smp.h>
#endif
SYSCTL_NODE(_compat, OID_AUTO, linuxkpi, CTLFLAG_RW, 0, "LinuxKPI parameters");
@ -1619,6 +1625,31 @@ linux_irq_handler(void *ent)
irqe->handler(irqe->irq, irqe->arg);
}
#if defined(__i386__) || defined(__amd64__)
static void
wbinvd_cb(void *arg __unused)
{
wbinvd();
}
int
linux_wbinvd_on_all_cpus(void)
{
return (linux_on_each_cpu(wbinvd_cb, NULL));
}
#endif
int
linux_on_each_cpu(void callback(void *), void *data)
{
smp_rendezvous(smp_no_rendezvous_barrier, callback,
smp_no_rendezvous_barrier, data);
return (0);
}
struct linux_cdev *
linux_find_cdev(const char *name, unsigned major, unsigned minor)
{