freebsd_network: Mutex handling cleanup.
* Add support for mtx_assert. * Move MTX_SPIN handling to dedicated functions like FreeBSD does. Tested with ipro1000 and realtekwifi.
This commit is contained in:
parent
ba641651b4
commit
d6e2a3156a
@ -7,14 +7,8 @@
|
|||||||
#define _FBSD_COMPAT_SYS_MUTEX_H_
|
#define _FBSD_COMPAT_SYS_MUTEX_H_
|
||||||
|
|
||||||
|
|
||||||
#include <sys/haiku-module.h>
|
|
||||||
#include <kernel/int.h>
|
|
||||||
|
|
||||||
#include <sys/queue.h>
|
|
||||||
#include <sys/_mutex.h>
|
#include <sys/_mutex.h>
|
||||||
#include <sys/pcpu.h>
|
#include <sys/systm.h>
|
||||||
#include <machine/atomic.h>
|
|
||||||
#include <machine/cpufunc.h>
|
|
||||||
|
|
||||||
|
|
||||||
#define MA_OWNED 0x1
|
#define MA_OWNED 0x1
|
||||||
@ -22,8 +16,6 @@
|
|||||||
#define MA_RECURSED 0x4
|
#define MA_RECURSED 0x4
|
||||||
#define MA_NOTRECURSED 0x8
|
#define MA_NOTRECURSED 0x8
|
||||||
|
|
||||||
#define mtx_assert(mtx, what)
|
|
||||||
|
|
||||||
#define MTX_DEF 0x00000000
|
#define MTX_DEF 0x00000000
|
||||||
#define MTX_SPIN 0x00000001
|
#define MTX_SPIN 0x00000001
|
||||||
#define MTX_RECURSE 0x00000004
|
#define MTX_RECURSE 0x00000004
|
||||||
@ -34,17 +26,23 @@
|
|||||||
#define MTX_NETWORK_LOCK "network driver"
|
#define MTX_NETWORK_LOCK "network driver"
|
||||||
|
|
||||||
|
|
||||||
/* on FreeBSD these are different functions */
|
|
||||||
#define mtx_lock_spin(x) mtx_lock(x)
|
|
||||||
#define mtx_unlock_spin(x) mtx_unlock(x)
|
|
||||||
|
|
||||||
|
|
||||||
extern struct mtx Giant;
|
extern struct mtx Giant;
|
||||||
|
|
||||||
|
|
||||||
void mtx_init(struct mtx*, const char*, const char*, int);
|
void mtx_init(struct mtx*, const char*, const char*, int);
|
||||||
void mtx_sysinit(void *arg);
|
void mtx_sysinit(void *arg);
|
||||||
void mtx_destroy(struct mtx*);
|
void mtx_destroy(struct mtx*);
|
||||||
|
void mtx_lock_spin(struct mtx* mutex);
|
||||||
|
void mtx_unlock_spin(struct mtx* mutex);
|
||||||
|
void _mtx_assert(struct mtx *m, int what, const char *file, int line);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef INVARIANTS
|
||||||
|
# define mtx_assert(m, what) \
|
||||||
|
_mtx_assert((m), (what), __FILE__, __LINE__)
|
||||||
|
#else
|
||||||
|
# define mtx_assert(m, what)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
@ -56,9 +54,7 @@ mtx_lock(struct mtx* mutex)
|
|||||||
} else if (mutex->type == MTX_RECURSE) {
|
} else if (mutex->type == MTX_RECURSE) {
|
||||||
recursive_lock_lock(&mutex->u.recursive);
|
recursive_lock_lock(&mutex->u.recursive);
|
||||||
} else if (mutex->type == MTX_SPIN) {
|
} else if (mutex->type == MTX_SPIN) {
|
||||||
cpu_status status = disable_interrupts();
|
mtx_lock_spin(mutex);
|
||||||
acquire_spinlock(&mutex->u.spinlock.lock);
|
|
||||||
mutex->u.spinlock.state = status;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -91,9 +87,7 @@ mtx_unlock(struct mtx* mutex)
|
|||||||
} else if (mutex->type == MTX_RECURSE) {
|
} else if (mutex->type == MTX_RECURSE) {
|
||||||
recursive_lock_unlock(&mutex->u.recursive);
|
recursive_lock_unlock(&mutex->u.recursive);
|
||||||
} else if (mutex->type == MTX_SPIN) {
|
} else if (mutex->type == MTX_SPIN) {
|
||||||
cpu_status status = mutex->u.spinlock.state;
|
mtx_unlock_spin(mutex);
|
||||||
release_spinlock(&mutex->u.spinlock.lock);
|
|
||||||
restore_interrupts(status);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -118,11 +112,22 @@ mtx_owned(struct mtx* mutex)
|
|||||||
return mutex->u.recursive.holder == find_thread(NULL);
|
return mutex->u.recursive.holder == find_thread(NULL);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
if (mutex->type == MTX_SPIN)
|
||||||
|
return mutex->u.spinlock.lock.lock != 0;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
mtx_recursed(struct mtx* mutex)
|
||||||
|
{
|
||||||
|
if (mutex->type == MTX_RECURSE)
|
||||||
|
return mutex->u.recursive.recursion != 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
struct mtx_args {
|
struct mtx_args {
|
||||||
void *ma_mtx;
|
void *ma_mtx;
|
||||||
const char *ma_desc;
|
const char *ma_desc;
|
||||||
|
@ -57,6 +57,58 @@ mtx_destroy(struct mtx *mutex)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
mtx_lock_spin(struct mtx* mutex)
|
||||||
|
{
|
||||||
|
KASSERT(mutex->type == MTX_SPIN, ("not a spin mutex"));
|
||||||
|
|
||||||
|
cpu_status status = disable_interrupts();
|
||||||
|
acquire_spinlock(&mutex->u.spinlock.lock);
|
||||||
|
mutex->u.spinlock.state = status;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
mtx_unlock_spin(struct mtx* mutex)
|
||||||
|
{
|
||||||
|
KASSERT(mutex->type == MTX_SPIN, ("not a spin mutex"));
|
||||||
|
|
||||||
|
cpu_status status = mutex->u.spinlock.state;
|
||||||
|
release_spinlock(&mutex->u.spinlock.lock);
|
||||||
|
restore_interrupts(status);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
_mtx_assert(struct mtx *m, int what, const char *file, int line)
|
||||||
|
{
|
||||||
|
switch (what) {
|
||||||
|
case MA_OWNED:
|
||||||
|
case MA_OWNED | MA_RECURSED:
|
||||||
|
case MA_OWNED | MA_NOTRECURSED:
|
||||||
|
if (!mtx_owned(m))
|
||||||
|
panic("mutex %p not owned at %s:%d",
|
||||||
|
m, file, line);
|
||||||
|
if (mtx_recursed(m)) {
|
||||||
|
if ((what & MA_NOTRECURSED) != 0)
|
||||||
|
panic("mutex %p recursed at %s:%d",
|
||||||
|
m, file, line);
|
||||||
|
} else if ((what & MA_RECURSED) != 0) {
|
||||||
|
panic("mutex %p unrecursed at %s:%d",
|
||||||
|
m, file, line);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MA_NOTOWNED:
|
||||||
|
if (mtx_owned(m))
|
||||||
|
panic("mutex %p owned at %s:%d",
|
||||||
|
m, file, line);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
panic("unknown mtx_assert at %s:%d", file, line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
init_mutexes()
|
init_mutexes()
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user