linuxkpi: Add a few wait_bit functions

The linux function does a lot more than that as multiple waitqueue could be fetch
from a static table based on the hash of the argument but since in DRM it's only used
in one place just add a single variable.
We will probably need to change that in the futur but it's ok with DRM even with current
linux.

Reviewed by:	hselasky
MFC after:	1 week
Sponsored by:	The FreeBSD Foundation
Differential Revision:	https://reviews.freebsd.org/D26054
This commit is contained in:
Emmanuel Vadot 2020-08-14 08:48:17 +00:00
parent 967fbfd9e2
commit 0e123c13fe
3 changed files with 71 additions and 0 deletions

View File

@ -36,6 +36,7 @@
#include <linux/compiler.h>
#include <linux/list.h>
#include <linux/spinlock.h>
#include <linux/sched.h>
#include <asm/atomic.h>

View File

@ -0,0 +1,64 @@
/*-
* Copyright (c) 2020 The FreeBSD Foundation
*
* This software was developed by Emmanuel Vadot under sponsorship
* from the FreeBSD Foundation.
*
* 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_WAITBIT_H__
#define __LINUX_WAITBIT_H__
#include <linux/wait.h>
#include <linux/bitops.h>
extern wait_queue_head_t linux_bit_waitq;
extern wait_queue_head_t linux_var_waitq;
#define wait_var_event_killable(var, cond) \
wait_event_killable(linux_var_waitq, cond)
static inline void
clear_and_wake_up_bit(int bit, void *word)
{
clear_bit_unlock(bit, word);
wake_up_bit(word, bit);
}
static inline wait_queue_head_t *
bit_waitqueue(void *word, int bit)
{
return (&linux_bit_waitq);
}
static inline void
wake_up_var(void *var)
{
wake_up(&linux_var_waitq);
}
#endif /* __LINUX_WAITBIT_H__ */

View File

@ -86,6 +86,7 @@ __FBSDID("$FreeBSD$");
#include <linux/compat.h>
#include <linux/poll.h>
#include <linux/smp.h>
#include <linux/wait_bit.h>
#if defined(__i386__) || defined(__amd64__)
#include <asm/smp.h>
@ -119,6 +120,9 @@ spinlock_t pci_lock;
unsigned long linux_timer_hz_mask;
wait_queue_head_t linux_bit_waitq;
wait_queue_head_t linux_var_waitq;
int
panic_cmp(struct rb_node *one, struct rb_node *two)
{
@ -2523,6 +2527,8 @@ linux_compat_init(void *arg)
mtx_init(&vmmaplock, "IO Map lock", NULL, MTX_DEF);
for (i = 0; i < VMMAP_HASH_SIZE; i++)
LIST_INIT(&vmmaphead[i]);
init_waitqueue_head(&linux_bit_waitq);
init_waitqueue_head(&linux_var_waitq);
}
SYSINIT(linux_compat, SI_SUB_DRIVERS, SI_ORDER_SECOND, linux_compat_init, NULL);