Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/xen/xenbus Convert remaining splfoo/splx and tsleep...
details: https://anonhg.NetBSD.org/src/rev/2d02b68329fa
branches: trunk
changeset: 971849:2d02b68329fa
user: bouyer <bouyer%NetBSD.org@localhost>
date: Wed May 06 16:50:13 2020 +0000
description:
Convert remaining splfoo/splx and tsleep/wakeup to mutex and condvar.
Mark kernel threads and interrupt handlers MPSAFE.
diffstat:
sys/arch/xen/xenbus/xenbus_comms.c | 42 ++++++++++++++++++++-----------------
sys/arch/xen/xenbus/xenbus_comms.h | 6 ++++-
sys/arch/xen/xenbus/xenbus_probe.c | 31 ++++++++++++++++++++-------
sys/arch/xen/xenbus/xenbus_xs.c | 18 +++++----------
4 files changed, 57 insertions(+), 40 deletions(-)
diffs (truncated from 354 to 300 lines):
diff -r d344b0191d17 -r 2d02b68329fa sys/arch/xen/xenbus/xenbus_comms.c
--- a/sys/arch/xen/xenbus/xenbus_comms.c Wed May 06 16:17:36 2020 +0000
+++ b/sys/arch/xen/xenbus/xenbus_comms.c Wed May 06 16:50:13 2020 +0000
@@ -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 @@
#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 @@
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 @@
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 @@
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 @@
prod = intf->req_prod;
xen_rmb();
if (!check_indexes(cons, prod)) {
- splx(s);
+ mutex_exit(&xenstore_lock);
return EIO;
}
@@ -156,8 +159,7 @@
hypervisor_notify_via_evtchn(xen_start_info.store_evtchn);
}
-
- splx(s);
+ mutex_exit(&xenstore_lock);
return 0;
}
@@ -167,14 +169,14 @@
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 @@
xen_rmb();
if (!check_indexes(cons, prod)) {
XENPRINTF(("xb_read EIO\n"));
- splx(s);
+ mutex_exit(&xenstore_lock);
return EIO;
}
@@ -209,8 +211,7 @@
hypervisor_notify_via_evtchn(xen_start_info.store_evtchn);
}
-
- splx(s);
+ mutex_exit(&xenstore_lock);
return 0;
}
@@ -220,10 +221,13 @@
{
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);
diff -r d344b0191d17 -r 2d02b68329fa sys/arch/xen/xenbus/xenbus_comms.h
--- a/sys/arch/xen/xenbus/xenbus_comms.h Wed May 06 16:17:36 2020 +0000
+++ b/sys/arch/xen/xenbus/xenbus_comms.h Wed May 06 16:50:13 2020 +0000
@@ -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 @@
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 @@
extern struct xenstore_domain_interface *xenstore_interface;
+extern int xenstored_ready;
+
#endif /* _XENBUS_COMMS_H */
/*
diff -r d344b0191d17 -r 2d02b68329fa sys/arch/xen/xenbus/xenbus_probe.c
--- a/sys/arch/xen/xenbus/xenbus_probe.c Wed May 06 16:17:36 2020 +0000
+++ b/sys/arch/xen/xenbus/xenbus_probe.c Wed May 06 16:50:13 2020 +0000
@@ -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 @@
#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_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 @@
/* 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 @@
//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 @@
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 @@
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);
diff -r d344b0191d17 -r 2d02b68329fa sys/arch/xen/xenbus/xenbus_xs.c
--- a/sys/arch/xen/xenbus/xenbus_xs.c Wed May 06 16:17:36 2020 +0000
+++ b/sys/arch/xen/xenbus/xenbus_xs.c Wed May 06 16:50:13 2020 +0000
@@ -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 @@
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 @@
*reply = read_reply(&msg->type, &msg->len);
}
mutex_exit(&xs_state.xs_lock);
- splx(s);
return err;
}
@@ -192,7 +190,7 @@
{
struct xsd_sockmsg msg;
unsigned int i;
Home |
Main Index |
Thread Index |
Old Index