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);