Module Name: src
Committed By: bouyer
Date: Wed May 6 16:50:13 UTC 2020
Modified Files:
src/sys/arch/xen/xenbus: xenbus_comms.c xenbus_comms.h xenbus_probe.c
xenbus_xs.c
Log Message:
Convert remaining splfoo/splx and tsleep/wakeup to mutex and condvar.
Mark kernel threads and interrupt handlers MPSAFE.
To generate a diff of this commit:
cvs rdiff -u -r1.22 -r1.23 src/sys/arch/xen/xenbus/xenbus_comms.c
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/xen/xenbus/xenbus_comms.h
cvs rdiff -u -r1.51 -r1.52 src/sys/arch/xen/xenbus/xenbus_probe.c
cvs rdiff -u -r1.26 -r1.27 src/sys/arch/xen/xenbus/xenbus_xs.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/arch/xen/xenbus/xenbus_comms.c
diff -u src/sys/arch/xen/xenbus/xenbus_comms.c:1.22 src/sys/arch/xen/xenbus/xenbus_comms.c:1.23
--- src/sys/arch/xen/xenbus/xenbus_comms.c:1.22 Sat Apr 25 15:26:18 2020
+++ src/sys/arch/xen/xenbus/xenbus_comms.c Wed May 6 16:50:13 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: xenbus_comms.c,v 1.22 2020/04/25 15:26:18 bouyer Exp $ */
+/* $NetBSD: xenbus_comms.c,v 1.23 2020/05/06 16:50:13 bouyer Exp $ */
/******************************************************************************
* xenbus_comms.c
*
@@ -29,7 +29,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xenbus_comms.c,v 1.22 2020/04/25 15:26:18 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xenbus_comms.c,v 1.23 2020/05/06 16:50:13 bouyer Exp $");
#include <sys/types.h>
#include <sys/null.h>
@@ -37,6 +37,7 @@ __KERNEL_RCSID(0, "$NetBSD: xenbus_comms
#include <sys/param.h>
#include <sys/proc.h>
#include <sys/systm.h>
+#include <sys/mutex.h>
#include <xen/xen.h> /* for xendomain_is_dom0() */
#include <xen/intr.h> /* for xendomain_is_dom0() */
@@ -54,6 +55,8 @@ __KERNEL_RCSID(0, "$NetBSD: xenbus_comms
static struct intrhand *ih;
struct xenstore_domain_interface *xenstore_interface;
+static kmutex_t xenstore_lock;
+static kcondvar_t xenstore_cv;
extern int xenstored_ready;
// static DECLARE_WORK(probe_work, xenbus_probe, NULL);
@@ -76,11 +79,12 @@ static int
wake_waiting(void *arg)
{
if (__predict_false(xenstored_ready == 0 && xendomain_is_dom0())) {
- xenstored_ready = 1;
- wakeup(&xenstored_ready);
+ xb_xenstored_make_ready();
}
- wakeup(&xenstore_interface);
+ mutex_enter(&xenstore_lock);
+ cv_broadcast(&xenstore_cv);
+ mutex_exit(&xenstore_lock);
return 1;
}
@@ -118,16 +122,15 @@ xb_write(const void *data, unsigned len)
struct xenstore_domain_interface *intf = xenstore_domain_interface();
XENSTORE_RING_IDX cons, prod;
- int s = spltty();
-
+ mutex_enter(&xenstore_lock);
while (len != 0) {
void *dst;
unsigned int avail;
while ((intf->req_prod - intf->req_cons) == XENSTORE_RING_SIZE) {
- XENPRINTF(("xb_write tsleep\n"));
- tsleep(&xenstore_interface, PRIBIO, "wrst", 0);
- XENPRINTF(("xb_write tsleep done\n"));
+ XENPRINTF(("xb_write cv_wait\n"));
+ cv_wait(&xenstore_cv, &xenstore_lock);
+ XENPRINTF(("xb_write cv_wait done\n"));
}
/* Read indexes, then verify. */
@@ -135,7 +138,7 @@ xb_write(const void *data, unsigned len)
prod = intf->req_prod;
xen_rmb();
if (!check_indexes(cons, prod)) {
- splx(s);
+ mutex_exit(&xenstore_lock);
return EIO;
}
@@ -156,8 +159,7 @@ xb_write(const void *data, unsigned len)
hypervisor_notify_via_evtchn(xen_start_info.store_evtchn);
}
-
- splx(s);
+ mutex_exit(&xenstore_lock);
return 0;
}
@@ -167,14 +169,14 @@ xb_read(void *data, unsigned len)
struct xenstore_domain_interface *intf = xenstore_domain_interface();
XENSTORE_RING_IDX cons, prod;
- int s = spltty();
+ mutex_enter(&xenstore_lock);
while (len != 0) {
unsigned int avail;
const char *src;
while (intf->rsp_cons == intf->rsp_prod)
- tsleep(&xenstore_interface, PRIBIO, "rdst", 0);
+ cv_wait(&xenstore_cv, &xenstore_lock);
/* Read indexes, then verify. */
cons = intf->rsp_cons;
@@ -182,7 +184,7 @@ xb_read(void *data, unsigned len)
xen_rmb();
if (!check_indexes(cons, prod)) {
XENPRINTF(("xb_read EIO\n"));
- splx(s);
+ mutex_exit(&xenstore_lock);
return EIO;
}
@@ -209,8 +211,7 @@ xb_read(void *data, unsigned len)
hypervisor_notify_via_evtchn(xen_start_info.store_evtchn);
}
-
- splx(s);
+ mutex_exit(&xenstore_lock);
return 0;
}
@@ -220,10 +221,13 @@ xb_init_comms(device_t dev)
{
int evtchn;
+ mutex_init(&xenstore_lock, MUTEX_DEFAULT, IPL_TTY);
+ cv_init(&xenstore_cv, "xsio");
+
evtchn = xen_start_info.store_evtchn;
ih = xen_intr_establish_xname(-1, &xen_pic, evtchn, IST_LEVEL, IPL_TTY,
- wake_waiting, NULL, false, device_xname(dev));
+ wake_waiting, NULL, true, device_xname(dev));
hypervisor_unmask_event(evtchn);
aprint_verbose_dev(dev, "using event channel %d\n", evtchn);
Index: src/sys/arch/xen/xenbus/xenbus_comms.h
diff -u src/sys/arch/xen/xenbus/xenbus_comms.h:1.6 src/sys/arch/xen/xenbus/xenbus_comms.h:1.7
--- src/sys/arch/xen/xenbus/xenbus_comms.h:1.6 Tue Sep 20 00:12:25 2011
+++ src/sys/arch/xen/xenbus/xenbus_comms.h Wed May 6 16:50:13 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: xenbus_comms.h,v 1.6 2011/09/20 00:12:25 jym Exp $ */
+/* $NetBSD: xenbus_comms.h,v 1.7 2020/05/06 16:50:13 bouyer Exp $ */
/*
* Private include for xenbus communications.
*
@@ -35,6 +35,8 @@ int xb_init_comms(device_t dev);
void xb_suspend_comms(device_t dev);
void xb_resume_comms(device_t dev);
+void xb_xenstored_make_ready(void);
+
/* Low level routines. */
int xb_write(const void *data, unsigned len);
int xb_read(void *data, unsigned len);
@@ -42,6 +44,8 @@ int xs_input_avail(void);
extern struct xenstore_domain_interface *xenstore_interface;
+extern int xenstored_ready;
+
#endif /* _XENBUS_COMMS_H */
/*
Index: src/sys/arch/xen/xenbus/xenbus_probe.c
diff -u src/sys/arch/xen/xenbus/xenbus_probe.c:1.51 src/sys/arch/xen/xenbus/xenbus_probe.c:1.52
--- src/sys/arch/xen/xenbus/xenbus_probe.c:1.51 Tue Apr 28 13:21:01 2020
+++ src/sys/arch/xen/xenbus/xenbus_probe.c Wed May 6 16:50:13 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: xenbus_probe.c,v 1.51 2020/04/28 13:21:01 bouyer Exp $ */
+/* $NetBSD: xenbus_probe.c,v 1.52 2020/05/06 16:50:13 bouyer Exp $ */
/******************************************************************************
* Talks to Xen Store to figure out what devices we have.
*
@@ -29,7 +29,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xenbus_probe.c,v 1.51 2020/04/28 13:21:01 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xenbus_probe.c,v 1.52 2020/05/06 16:50:13 bouyer Exp $");
#if 0
#define DPRINTK(fmt, args...) \
@@ -45,6 +45,7 @@ __KERNEL_RCSID(0, "$NetBSD: xenbus_probe
#include <sys/systm.h>
#include <sys/param.h>
#include <sys/kthread.h>
+#include <sys/mutex.h>
#include <uvm/uvm.h>
#include <xen/xen.h> /* for xendomain_is_dom0() */
@@ -108,8 +109,8 @@ xenbus_attach(device_t parent, device_t
xenbus_dmat = xa->xa_dmat;
config_pending_incr(self);
- err = kthread_create(PRI_NONE, 0, NULL, xenbus_probe_init, NULL,
- NULL, "xenbus_probe");
+ err = kthread_create(PRI_NONE, KTHREAD_MPSAFE, NULL,
+ xenbus_probe_init, NULL, NULL, "xenbus_probe");
if (err)
aprint_error_dev(xenbus_dev,
"kthread_create(xenbus_probe): %d\n", err);
@@ -618,6 +619,8 @@ static struct xenbus_watch be_watch;
/* A flag to determine if xenstored is 'ready' (i.e. has started) */
int xenstored_ready = 0;
+static kmutex_t xenstored_lock;
+static kcondvar_t xenstored_cv;
void
xenbus_probe(void *unused)
@@ -655,6 +658,15 @@ xenbus_probe(void *unused)
//notifier_call_chain(&xenstore_chain, 0, NULL);
}
+void
+xb_xenstored_make_ready(void)
+{
+ mutex_enter(&xenstored_lock);
+ xenstored_ready = 1;
+ cv_broadcast(&xenstored_cv);
+ mutex_exit(&xenstored_lock);
+}
+
static void
xenbus_probe_init(void *unused)
{
@@ -665,6 +677,8 @@ xenbus_probe_init(void *unused)
DPRINTK("");
SLIST_INIT(&xenbus_device_list);
+ mutex_init(&xenstored_lock, MUTEX_DEFAULT, IPL_TTY);
+ cv_init(&xenstored_cv, "xsready");
/*
** Domain0 doesn't have a store_evtchn or store_mfn yet.
@@ -728,13 +742,14 @@ xenbus_probe_init(void *unused)
config_pending_decr(xenbus_dev);
#ifdef DOM0OPS
if (dom0) {
- int s;
- s = spltty();
+ mutex_enter(&xenstored_lock);
while (xenstored_ready == 0) {
- tsleep(&xenstored_ready, PRIBIO, "xsready", 0);
+ cv_wait(&xenstored_cv, &xenstored_lock);
+ mutex_exit(&xenstored_lock);
xenbus_probe(NULL);
+ mutex_enter(&xenstored_lock);
}
- splx(s);
+ mutex_exit(&xenstored_lock);
}
#endif
kthread_exit(0);
Index: src/sys/arch/xen/xenbus/xenbus_xs.c
diff -u src/sys/arch/xen/xenbus/xenbus_xs.c:1.26 src/sys/arch/xen/xenbus/xenbus_xs.c:1.27
--- src/sys/arch/xen/xenbus/xenbus_xs.c:1.26 Tue Apr 7 16:10:48 2020
+++ src/sys/arch/xen/xenbus/xenbus_xs.c Wed May 6 16:50:13 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: xenbus_xs.c,v 1.26 2020/04/07 16:10:48 jdolecek Exp $ */
+/* $NetBSD: xenbus_xs.c,v 1.27 2020/05/06 16:50:13 bouyer Exp $ */
/******************************************************************************
* xenbus_xs.c
*
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xenbus_xs.c,v 1.26 2020/04/07 16:10:48 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xenbus_xs.c,v 1.27 2020/05/06 16:50:13 bouyer Exp $");
#if 0
#define DPRINTK(fmt, args...) \
@@ -158,9 +158,8 @@ xenbus_debug_write(const char *str, unsi
int
xenbus_dev_request_and_reply(struct xsd_sockmsg *msg, void**reply)
{
- int err = 0, s;
+ int err = 0;
- s = spltty();
mutex_enter(&xs_state.xs_lock);
err = xb_write(msg, sizeof(*msg) + msg->len);
if (err) {
@@ -170,7 +169,6 @@ xenbus_dev_request_and_reply(struct xsd_
*reply = read_reply(&msg->type, &msg->len);
}
mutex_exit(&xs_state.xs_lock);
- splx(s);
return err;
}
@@ -192,7 +190,7 @@ xs_talkv(struct xenbus_transaction *t,
{
struct xsd_sockmsg msg;
unsigned int i;
- int err, s;
+ int err;
void *ret;
msg.tx_id = (uint32_t)(unsigned long)t;
@@ -202,7 +200,6 @@ xs_talkv(struct xenbus_transaction *t,
for (i = 0; i < num_vecs; i++)
msg.len += iovec[i].iov_len;
- s = spltty();
mutex_enter(&xs_state.xs_lock);
DPRINTK("write msg");
@@ -210,7 +207,6 @@ xs_talkv(struct xenbus_transaction *t,
DPRINTK("write msg err %d", err);
if (err) {
mutex_exit(&xs_state.xs_lock);
- splx(s);
return (err);
}
@@ -220,7 +216,6 @@ xs_talkv(struct xenbus_transaction *t,
DPRINTK("write iovect err %d", err);
if (err) {
mutex_exit(&xs_state.xs_lock);
- splx(s);
return (err);
}
}
@@ -230,7 +225,6 @@ xs_talkv(struct xenbus_transaction *t,
DPRINTK("read done");
mutex_exit(&xs_state.xs_lock);
- splx(s);
if (msg.type == XS_ERROR) {
err = get_error(ret);
@@ -829,14 +823,14 @@ xs_init(device_t dev)
mutex_init(&xs_state.reply_lock, MUTEX_DEFAULT, IPL_TTY);
cv_init(&xs_state.reply_cv, "rplq");
- err = kthread_create(PRI_NONE, 0, NULL, xenwatch_thread,
+ err = kthread_create(PRI_NONE, KTHREAD_MPSAFE, NULL, xenwatch_thread,
NULL, NULL, "xenwatch");
if (err) {
aprint_error_dev(dev, "kthread_create(xenwatch): %d\n", err);
return err;
}
- err = kthread_create(PRI_NONE, 0, NULL, xenbus_thread,
+ err = kthread_create(PRI_NONE, KTHREAD_MPSAFE, NULL, xenbus_thread,
NULL, NULL, "xenbus");
if (err) {
aprint_error_dev(dev, "kthread_create(xenbus): %d\n", err);