Module Name: src Committed By: riastradh Date: Sun Dec 19 01:34:57 UTC 2021
Modified Files: src/sys/external/bsd/drm2/include/linux: stop_machine.h src/sys/external/bsd/drm2/linux: files.drmkms_linux Added Files: src/sys/external/bsd/drm2/linux: linux_stop_machine.c Log Message: Draft stop_machine. Hope the callback runs quickly under splhigh... To generate a diff of this commit: cvs rdiff -u -r1.1 -r1.2 \ src/sys/external/bsd/drm2/include/linux/stop_machine.h cvs rdiff -u -r1.21 -r1.22 src/sys/external/bsd/drm2/linux/files.drmkms_linux cvs rdiff -u -r0 -r1.1 src/sys/external/bsd/drm2/linux/linux_stop_machine.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/external/bsd/drm2/include/linux/stop_machine.h diff -u src/sys/external/bsd/drm2/include/linux/stop_machine.h:1.1 src/sys/external/bsd/drm2/include/linux/stop_machine.h:1.2 --- src/sys/external/bsd/drm2/include/linux/stop_machine.h:1.1 Sun Dec 19 00:31:27 2021 +++ src/sys/external/bsd/drm2/include/linux/stop_machine.h Sun Dec 19 01:34:57 2021 @@ -0,0 +1,41 @@ +/* $NetBSD: stop_machine.h,v 1.2 2021/12/19 01:34:57 riastradh Exp $ */ + +/*- + * Copyright (c) 2018 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Taylor R. Campbell. + * + * 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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. + */ + +#ifndef _LINUX_STOP_MACHINE_H_ +#define _LINUX_STOP_MACHINE_H_ + +#define stop_machine linux_stop_machine + +struct kcpuset; + +void stop_machine(int (*)(void *), void *, const struct kcpuset *); + +#endif /* _LINUX_STOP_MACHINE_H_ */ Index: src/sys/external/bsd/drm2/linux/files.drmkms_linux diff -u src/sys/external/bsd/drm2/linux/files.drmkms_linux:1.21 src/sys/external/bsd/drm2/linux/files.drmkms_linux:1.22 --- src/sys/external/bsd/drm2/linux/files.drmkms_linux:1.21 Sun Dec 19 01:33:18 2021 +++ src/sys/external/bsd/drm2/linux/files.drmkms_linux Sun Dec 19 01:34:57 2021 @@ -1,4 +1,4 @@ -# $NetBSD: files.drmkms_linux,v 1.21 2021/12/19 01:33:18 riastradh Exp $ +# $NetBSD: files.drmkms_linux,v 1.22 2021/12/19 01:34:57 riastradh Exp $ define drmkms_linux: i2cexec, i2c_bitbang @@ -17,6 +17,7 @@ file external/bsd/drm2/linux/linux_modul file external/bsd/drm2/linux/linux_pci.c drmkms_linux file external/bsd/drm2/linux/linux_reservation.c drmkms_linux file external/bsd/drm2/linux/linux_srcu.c drmkms_linux +file external/bsd/drm2/linux/linux_stop_machine.c drmkms_linux file external/bsd/drm2/linux/linux_wait_bit.c drmkms_linux file external/bsd/drm2/linux/linux_writecomb.c drmkms_linux file external/bsd/drm2/linux/linux_ww_mutex.c drmkms_linux Added files: Index: src/sys/external/bsd/drm2/linux/linux_stop_machine.c diff -u /dev/null src/sys/external/bsd/drm2/linux/linux_stop_machine.c:1.1 --- /dev/null Sun Dec 19 01:34:57 2021 +++ src/sys/external/bsd/drm2/linux/linux_stop_machine.c Sun Dec 19 01:34:57 2021 @@ -0,0 +1,90 @@ +/* $NetBSD: linux_stop_machine.c,v 1.1 2021/12/19 01:34:57 riastradh Exp $ */ + +/*- + * Copyright (c) 2018 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Taylor R. Campbell. + * + * 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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. + */ + +#include <sys/cdefs.h> +__KERNEL_RCSID(0, "$NetBSD: linux_stop_machine.c,v 1.1 2021/12/19 01:34:57 riastradh Exp $"); + +#include <sys/atomic.h> +#include <sys/intr.h> +#include <sys/lock.h> +#include <sys/systm.h> +#include <sys/xcall.h> + +#include <linux/stop_machine.h> + +struct stop_machine { + int (*callback)(void *); + void *cookie; + volatile unsigned ncpu; + volatile bool done; +}; + +static void +stop_machine_xcall(void *a, void *b) +{ + struct stop_machine *S = a; + int s; + + /* Block all activity on this CPU. */ + s = splhigh(); + + /* Note that we're ready, and see whether we're the chosen one. */ + if (atomic_dec_uint_nv(&S->ncpu) != 0) { + /* Not the chosen one. Wait until done. */ + while (!S->done) + SPINLOCK_BACKOFF_HOOK; + goto out; + } + + /* It's time. Call the callback. */ + S->callback(S->cookie); + + /* Notify everyone else that we're done. */ + S->done = true; + + /* Allow activity again. */ +out: splx(s); +} + +void +stop_machine(int (*callback)(void *), void *cookie, const struct kcpuset *cpus) +{ + struct stop_machine stop, *S = &stop; + + KASSERT(cpus == NULL); /* not implemented */ + + S->callback = callback; + S->cookie = cookie; + S->ncpu = ncpu; /* XXX cpu hotplug */ + S->done = false; + + xc_wait(xc_broadcast(0, stop_machine_xcall, &S, NULL)); +}