xen console lock needs to be a spin lock in case it is acquired from an interrupt context
This commit is contained in:
parent
92919e4a54
commit
94a24e4240
@ -76,17 +76,17 @@ static unsigned int wc, wp; /* write_cons, write_prod */
|
||||
#define XCUNIT(x) (dev2unit(x))
|
||||
#define ISTTYOPEN(tp) ((tp) && ((tp)->t_state & TS_ISOPEN))
|
||||
#define CN_LOCK_INIT(x, _name) \
|
||||
mtx_init(&x, _name, NULL, MTX_DEF|MTX_RECURSE)
|
||||
mtx_init(&x, _name, NULL, MTX_SPIN|MTX_RECURSE)
|
||||
|
||||
#define CN_LOCK(l) \
|
||||
do { \
|
||||
if (panicstr == NULL) \
|
||||
mtx_lock(&(l)); \
|
||||
mtx_lock_spin(&(l)); \
|
||||
} while (0)
|
||||
#define CN_UNLOCK(l) \
|
||||
do { \
|
||||
if (panicstr == NULL) \
|
||||
mtx_unlock(&(l)); \
|
||||
mtx_unlock_spin(&(l)); \
|
||||
} while (0)
|
||||
#define CN_LOCK_ASSERT(x) mtx_assert(&x, MA_OWNED)
|
||||
#define CN_LOCK_DESTROY(x) mtx_destroy(&x)
|
||||
|
@ -89,7 +89,7 @@ xencons_handle_input(void *unused)
|
||||
struct xencons_interface *intf;
|
||||
XENCONS_RING_IDX cons, prod;
|
||||
|
||||
mtx_lock(&cn_mtx);
|
||||
CN_LOCK(cn_mtx);
|
||||
intf = xencons_interface();
|
||||
|
||||
cons = intf->in_cons;
|
||||
@ -107,7 +107,7 @@ xencons_handle_input(void *unused)
|
||||
notify_remote_via_evtchn(xen_start_info->console_evtchn);
|
||||
|
||||
xencons_tx();
|
||||
mtx_unlock(&cn_mtx);
|
||||
CN_UNLOCK(cn_mtx);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -5,6 +5,17 @@
|
||||
#ifndef _XENCONS_RING_H
|
||||
#define _XENCONS_RING_H
|
||||
|
||||
#define CN_LOCK(l) \
|
||||
do { \
|
||||
if (panicstr == NULL) \
|
||||
mtx_lock_spin(&(l)); \
|
||||
} while (0)
|
||||
#define CN_UNLOCK(l) \
|
||||
do { \
|
||||
if (panicstr == NULL) \
|
||||
mtx_unlock_spin(&(l)); \
|
||||
} while (0)
|
||||
|
||||
int xencons_ring_init(void);
|
||||
int xencons_ring_send(const char *data, unsigned len);
|
||||
void xencons_rx(char *buf, unsigned len);
|
||||
|
Loading…
Reference in New Issue
Block a user