arrr, implement softint_disestablish(). this code be needin' an enema, matey.
This commit is contained in:
parent
961dc58afe
commit
64d32972db
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: intr.c,v 1.17 2009/04/26 20:44:50 pooka Exp $ */
|
/* $NetBSD: intr.c,v 1.18 2009/09/19 14:18:01 pooka Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2008 Antti Kantee. All Rights Reserved.
|
* Copyright (c) 2008 Antti Kantee. All Rights Reserved.
|
||||||
|
@ -26,7 +26,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.17 2009/04/26 20:44:50 pooka Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.18 2009/09/19 14:18:01 pooka Exp $");
|
||||||
|
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <sys/cpu.h>
|
#include <sys/cpu.h>
|
||||||
|
@ -44,11 +44,13 @@ __KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.17 2009/04/26 20:44:50 pooka Exp $");
|
||||||
|
|
||||||
time_t time_uptime = 0;
|
time_t time_uptime = 0;
|
||||||
|
|
||||||
|
#define SI_MPSAFE 0x01
|
||||||
|
#define SI_ONLIST 0x02
|
||||||
|
#define SI_KILLME 0x04
|
||||||
struct softint {
|
struct softint {
|
||||||
void (*si_func)(void *);
|
void (*si_func)(void *);
|
||||||
void *si_arg;
|
void *si_arg;
|
||||||
bool si_onlist;
|
int si_flags;
|
||||||
bool si_mpsafe;
|
|
||||||
|
|
||||||
LIST_ENTRY(softint) si_entries;
|
LIST_ENTRY(softint) si_entries;
|
||||||
};
|
};
|
||||||
|
@ -174,10 +176,12 @@ sithread(void *arg)
|
||||||
si = LIST_FIRST(&si_pending);
|
si = LIST_FIRST(&si_pending);
|
||||||
func = si->si_func;
|
func = si->si_func;
|
||||||
funarg = si->si_arg;
|
funarg = si->si_arg;
|
||||||
mpsafe = si->si_mpsafe;
|
mpsafe = si->si_flags & SI_MPSAFE;
|
||||||
|
|
||||||
si->si_onlist = false;
|
si->si_flags &= ~SI_ONLIST;
|
||||||
LIST_REMOVE(si, si_entries);
|
LIST_REMOVE(si, si_entries);
|
||||||
|
if (si->si_flags & SI_KILLME)
|
||||||
|
softint_disestablish(si);
|
||||||
} else {
|
} else {
|
||||||
cv_wait(&si_cv, &si_mtx);
|
cv_wait(&si_cv, &si_mtx);
|
||||||
continue;
|
continue;
|
||||||
|
@ -246,8 +250,7 @@ softint_establish(u_int flags, void (*func)(void *), void *arg)
|
||||||
si = kmem_alloc(sizeof(*si), KM_SLEEP);
|
si = kmem_alloc(sizeof(*si), KM_SLEEP);
|
||||||
si->si_func = func;
|
si->si_func = func;
|
||||||
si->si_arg = arg;
|
si->si_arg = arg;
|
||||||
si->si_onlist = false;
|
si->si_flags = flags & SOFTINT_MPSAFE ? SI_MPSAFE : 0;
|
||||||
si->si_mpsafe = flags & SOFTINT_MPSAFE;
|
|
||||||
|
|
||||||
return si;
|
return si;
|
||||||
}
|
}
|
||||||
|
@ -261,15 +264,28 @@ softint_schedule(void *arg)
|
||||||
si->si_func(si->si_arg);
|
si->si_func(si->si_arg);
|
||||||
} else {
|
} else {
|
||||||
mutex_enter(&si_mtx);
|
mutex_enter(&si_mtx);
|
||||||
if (!si->si_onlist) {
|
if (!(si->si_flags & SI_ONLIST)) {
|
||||||
LIST_INSERT_HEAD(&si_pending, si, si_entries);
|
LIST_INSERT_HEAD(&si_pending, si, si_entries);
|
||||||
si->si_onlist = true;
|
si->si_flags |= SI_ONLIST;
|
||||||
}
|
}
|
||||||
cv_signal(&si_cv);
|
cv_signal(&si_cv);
|
||||||
mutex_exit(&si_mtx);
|
mutex_exit(&si_mtx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* flimsy disestablish: should wait for softints to finish */
|
||||||
|
void
|
||||||
|
softint_disestablish(void *cook)
|
||||||
|
{
|
||||||
|
struct softint *si = cook;
|
||||||
|
|
||||||
|
if (si->si_flags & SI_ONLIST) {
|
||||||
|
si->si_flags |= SI_KILLME;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
kmem_free(si, sizeof(*si));
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
cpu_intr_p(void)
|
cpu_intr_p(void)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue