From owner-svn-src-projects@FreeBSD.ORG Sun Dec 28 06:01:43 2008 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id B6E731065673; Sun, 28 Dec 2008 06:01:43 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id A24038FC12; Sun, 28 Dec 2008 06:01:43 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id mBS61hjr004789; Sun, 28 Dec 2008 06:01:43 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id mBS61g9U004769; Sun, 28 Dec 2008 06:01:42 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200812280601.mBS61g9U004769@svn.freebsd.org> From: Kip Macy Date: Sun, 28 Dec 2008 06:01:42 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r186535 - in projects/releng_7_xen/sys: dev/xen/blkfront dev/xen/console dev/xen/evtchn dev/xen/netfront i386/conf i386/i386 i386/include/xen i386/isa i386/xen xen xen/evtchn xen/xenbus X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 28 Dec 2008 06:01:43 -0000 Author: kmacy Date: Sun Dec 28 06:01:42 2008 New Revision: 186535 URL: http://svn.freebsd.org/changeset/base/186535 Log: - merge in latest xenbus from dfr's xenhvm - fix race condition in xs_read_reply by converting tsleep to mtx_sleep Added: projects/releng_7_xen/sys/xen/evtchn.h (contents, props changed) - copied, changed from r186315, projects/releng_7_xen/sys/i386/include/xen/evtchn.h projects/releng_7_xen/sys/xen/hypervisor.h (props changed) - copied unchanged from r186315, projects/releng_7_xen/sys/i386/include/xen/hypervisor.h projects/releng_7_xen/sys/xen/xen_intr.h (contents, props changed) - copied, changed from r186315, projects/releng_7_xen/sys/i386/include/xen/xen_intr.h Deleted: projects/releng_7_xen/sys/i386/include/xen/evtchn.h projects/releng_7_xen/sys/i386/include/xen/hypervisor.h projects/releng_7_xen/sys/i386/include/xen/xen_intr.h Modified: projects/releng_7_xen/sys/dev/xen/blkfront/blkfront.c projects/releng_7_xen/sys/dev/xen/console/console.c projects/releng_7_xen/sys/dev/xen/console/xencons_ring.c projects/releng_7_xen/sys/dev/xen/evtchn/evtchn_dev.c projects/releng_7_xen/sys/dev/xen/netfront/netfront.c projects/releng_7_xen/sys/i386/conf/XEN projects/releng_7_xen/sys/i386/i386/genassym.c projects/releng_7_xen/sys/i386/i386/machdep.c projects/releng_7_xen/sys/i386/i386/vm_machdep.c projects/releng_7_xen/sys/i386/include/xen/xenfunc.h projects/releng_7_xen/sys/i386/isa/npx.c projects/releng_7_xen/sys/i386/xen/clock.c projects/releng_7_xen/sys/i386/xen/mp_machdep.c projects/releng_7_xen/sys/i386/xen/mptable.c projects/releng_7_xen/sys/i386/xen/pmap.c projects/releng_7_xen/sys/i386/xen/xen_machdep.c projects/releng_7_xen/sys/xen/evtchn/evtchn.c projects/releng_7_xen/sys/xen/evtchn/evtchn_dev.c projects/releng_7_xen/sys/xen/features.c projects/releng_7_xen/sys/xen/gnttab.c projects/releng_7_xen/sys/xen/gnttab.h projects/releng_7_xen/sys/xen/xenbus/xenbus_client.c projects/releng_7_xen/sys/xen/xenbus/xenbus_comms.c projects/releng_7_xen/sys/xen/xenbus/xenbus_comms.h projects/releng_7_xen/sys/xen/xenbus/xenbus_dev.c projects/releng_7_xen/sys/xen/xenbus/xenbus_probe.c projects/releng_7_xen/sys/xen/xenbus/xenbus_probe_backend.c projects/releng_7_xen/sys/xen/xenbus/xenbus_xs.c projects/releng_7_xen/sys/xen/xenbus/xenbusvar.h Modified: projects/releng_7_xen/sys/dev/xen/blkfront/blkfront.c ============================================================================== --- projects/releng_7_xen/sys/dev/xen/blkfront/blkfront.c Sun Dec 28 05:38:49 2008 (r186534) +++ projects/releng_7_xen/sys/dev/xen/blkfront/blkfront.c Sun Dec 28 06:01:42 2008 (r186535) @@ -40,10 +40,10 @@ __FBSDID("$FreeBSD$"); #include #include -#include +#include #include -#include -#include +#include +#include #include #include #include @@ -214,7 +214,7 @@ xlvbd_add(device_t dev, blkif_sector_t c struct xb_softc *sc; int unit, error = 0; const char *name; - + blkfront_vdevice_to_unit(vdevice, &unit, &name); sc = (struct xb_softc *)malloc(sizeof(*sc), M_DEVBUF, M_WAITOK|M_ZERO); @@ -227,12 +227,12 @@ xlvbd_add(device_t dev, blkif_sector_t c memset(&sc->xb_disk, 0, sizeof(sc->xb_disk)); sc->xb_disk = disk_alloc(); - sc->xb_disk->d_unit = unit; + sc->xb_disk->d_unit = sc->xb_unit; sc->xb_disk->d_open = blkif_open; sc->xb_disk->d_close = blkif_close; sc->xb_disk->d_ioctl = blkif_ioctl; sc->xb_disk->d_strategy = xb_strategy; - sc->xb_disk->d_name = "xbd"; + sc->xb_disk->d_name = name; sc->xb_disk->d_drv1 = sc; sc->xb_disk->d_sectorsize = sector_size; @@ -329,8 +329,8 @@ blkfront_attach(device_t dev) /* FIXME: Use dynamic device id if this is not set. */ err = xenbus_scanf(XBT_NIL, xenbus_get_node(dev), - "virtual-device", "%i", &vdevice); - if (err != 1) { + "virtual-device", NULL, "%i", &vdevice); + if (err) { xenbus_dev_fatal(dev, err, "reading virtual-device"); printf("couldn't find virtual device"); return (err); @@ -363,9 +363,8 @@ blkfront_attach(device_t dev) info->handle = strtoul(strrchr(xenbus_get_node(dev),'/')+1, NULL, 0); err = talk_to_backend(dev, info); - if (err) { - return err; - } + if (err) + return (err); return (0); } @@ -381,7 +380,8 @@ blkfront_resume(device_t dev) blkif_free(info, 1); err = talk_to_backend(dev, info); - if (!err) + + if (info->connected == BLKIF_STATE_SUSPENDED && !err) blkif_recover(info); return err; @@ -427,7 +427,7 @@ talk_to_backend(device_t dev, struct blk } err = xenbus_transaction_end(xbt, 0); if (err) { - if (err == -EAGAIN) + if (err == EAGAIN) goto again; xenbus_dev_fatal(dev, err, "completing transaction"); goto destroy_blkring; @@ -450,7 +450,7 @@ static int setup_blkring(device_t dev, struct blkfront_info *info) { blkif_sring_t *sring; - int err; + int error; info->ring_ref = GRANT_INVALID_REF; @@ -462,28 +462,27 @@ setup_blkring(device_t dev, struct blkfr SHARED_RING_INIT(sring); FRONT_RING_INIT(&info->ring, sring, PAGE_SIZE); - err = xenbus_grant_ring(dev, (vtomach(info->ring.sring) >> PAGE_SHIFT)); - if (err < 0) { + error = xenbus_grant_ring(dev, (vtomach(info->ring.sring) >> PAGE_SHIFT), + &info->ring_ref); + if (error) { free(sring, M_DEVBUF); info->ring.sring = NULL; goto fail; } - info->ring_ref = err; - err = bind_listening_port_to_irqhandler(xenbus_get_otherend_id(dev), + error = bind_listening_port_to_irqhandler(xenbus_get_otherend_id(dev), "xbd", (driver_intr_t *)blkif_int, info, - INTR_TYPE_BIO | INTR_MPSAFE, NULL); - if (err <= 0) { - xenbus_dev_fatal(dev, err, + INTR_TYPE_BIO | INTR_MPSAFE, &info->irq); + if (error) { + xenbus_dev_fatal(dev, error, "bind_evtchn_to_irqhandler failed"); goto fail; } - info->irq = err; - return 0; + return (0); fail: blkif_free(info, 0); - return err; + return (error); } @@ -999,7 +998,7 @@ blkif_free(struct blkfront_info *info, i info->ring.sring = NULL; } if (info->irq) - unbind_from_irqhandler(info->irq, info); + unbind_from_irqhandler(info->irq); info->irq = 0; } Modified: projects/releng_7_xen/sys/dev/xen/console/console.c ============================================================================== --- projects/releng_7_xen/sys/dev/xen/console/console.c Sun Dec 28 05:38:49 2008 (r186534) +++ projects/releng_7_xen/sys/dev/xen/console/console.c Sun Dec 28 06:01:42 2008 (r186535) @@ -15,8 +15,8 @@ #include #include #include -#include -#include +#include +#include #include #include #include @@ -77,17 +77,17 @@ static unsigned int wc, wp; /* write_con #define XCUNIT(x) (minor(x)) #define ISTTYOPEN(tp) ((tp) && ((tp)->t_state & TS_ISOPEN)) #define CN_LOCK_INIT(x, _name) \ - mtx_init(&x, _name, NULL, MTX_SPIN|MTX_RECURSE) + mtx_init(&x, _name, NULL, MTX_DEF|MTX_RECURSE) #define CN_LOCK(l) \ do { \ if (panicstr == NULL) \ - mtx_lock_spin(&(l)); \ + mtx_lock(&(l)); \ } while (0) #define CN_UNLOCK(l) \ do { \ if (panicstr == NULL) \ - mtx_unlock_spin(&(l)); \ + mtx_unlock(&(l)); \ } while (0) #define CN_LOCK_ASSERT(x) mtx_assert(&x, MA_OWNED) #define CN_LOCK_DESTROY(x) mtx_destroy(&x) @@ -234,6 +234,7 @@ xc_probe(device_t dev) static int xc_attach(device_t dev) { + int error; struct xc_softc *sc = (struct xc_softc *)device_get_softc(dev); @@ -260,13 +261,14 @@ xc_attach(device_t dev) callout_reset(&xc_callout, XC_POLLTIME, xc_timeout, xccons); if (xen_start_info->flags & SIF_INITDOMAIN) { - PANIC_IF(bind_virq_to_irqhandler( + error = bind_virq_to_irqhandler( VIRQ_CONSOLE, 0, "console", xencons_priv_interrupt, - NULL, INTR_TYPE_TTY) < 0); + NULL, INTR_TYPE_TTY, NULL); + KASSERT(error >= 0, ("can't register console interrupt")); } Modified: projects/releng_7_xen/sys/dev/xen/console/xencons_ring.c ============================================================================== --- projects/releng_7_xen/sys/dev/xen/console/xencons_ring.c Sun Dec 28 05:38:49 2008 (r186534) +++ projects/releng_7_xen/sys/dev/xen/console/xencons_ring.c Sun Dec 28 06:01:42 2008 (r186535) @@ -15,19 +15,20 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include -#include +#include +#include #include #include -#include +#include #include #define console_evtchn console.domU.evtchn extern char *console_page; - +extern struct mtx cn_mtx; + static inline struct xencons_interface * xencons_interface(void) { @@ -82,6 +83,7 @@ xencons_handle_input(void *unused) struct xencons_interface *intf; XENCONS_RING_IDX cons, prod; + mtx_lock(&cn_mtx); intf = xencons_interface(); cons = intf->in_cons; @@ -99,6 +101,7 @@ xencons_handle_input(void *unused) notify_remote_via_evtchn(xen_start_info->console_evtchn); xencons_tx(); + mtx_unlock(&cn_mtx); } void Modified: projects/releng_7_xen/sys/dev/xen/evtchn/evtchn_dev.c ============================================================================== --- projects/releng_7_xen/sys/dev/xen/evtchn/evtchn_dev.c Sun Dec 28 05:38:49 2008 (r186534) +++ projects/releng_7_xen/sys/dev/xen/evtchn/evtchn_dev.c Sun Dec 28 06:01:42 2008 (r186535) @@ -26,13 +26,13 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include +#include #include #include #include #include -#include +#include typedef struct evtchn_sotfc { Modified: projects/releng_7_xen/sys/dev/xen/netfront/netfront.c ============================================================================== --- projects/releng_7_xen/sys/dev/xen/netfront/netfront.c Sun Dec 28 05:38:49 2008 (r186534) +++ projects/releng_7_xen/sys/dev/xen/netfront/netfront.c Sun Dec 28 06:01:42 2008 (r186535) @@ -63,9 +63,9 @@ __FBSDID("$FreeBSD$"); #include #include -#include -#include -#include +#include +#include +#include #include #include #include @@ -364,24 +364,25 @@ makembuf (struct mbuf *buf) static int xen_net_read_mac(device_t dev, uint8_t mac[]) { - char *s; - int i; - char *e; - char *macstr = xenbus_read(XBT_NIL, xenbus_get_node(dev), "mac", NULL); - if (IS_ERR(macstr)) { - return PTR_ERR(macstr); - } + int error, i; + char *s, *e, *macstr; + + error = xenbus_read(XBT_NIL, xenbus_get_node(dev), "mac", NULL, + (void **) &macstr); + if (error) + return (error); + s = macstr; for (i = 0; i < ETHER_ADDR_LEN; i++) { mac[i] = strtoul(s, &e, 16); if (s == e || (e[0] != ':' && e[0] != 0)) { free(macstr, M_DEVBUF); - return ENOENT; + return (ENOENT); } s = &e[1]; } free(macstr, M_DEVBUF); - return 0; + return (0); } /** @@ -423,13 +424,11 @@ netfront_attach(device_t dev) * leave the device-layer structures intact so that this is transparent to the * rest of the kernel. */ -static int +static int netfront_resume(device_t dev) { struct netfront_info *info = device_get_softc(dev); - - DPRINTK("%s\n", xenbus_get_node(dev)); - + netif_disconnect_backend(info); return (0); } @@ -533,7 +532,7 @@ setup_device(device_t dev, struct netfro { netif_tx_sring_t *txs; netif_rx_sring_t *rxs; - int err; + int error; struct ifnet *ifp; ifp = info->xn_ifp; @@ -546,51 +545,45 @@ setup_device(device_t dev, struct netfro txs = (netif_tx_sring_t *)malloc(PAGE_SIZE, M_DEVBUF, M_NOWAIT|M_ZERO); if (!txs) { - err = ENOMEM; - xenbus_dev_fatal(dev, err, "allocating tx ring page"); + error = ENOMEM; + xenbus_dev_fatal(dev, error, "allocating tx ring page"); goto fail; } SHARED_RING_INIT(txs); FRONT_RING_INIT(&info->tx, txs, PAGE_SIZE); - err = xenbus_grant_ring(dev, virt_to_mfn(txs)); - if (err < 0) + error = xenbus_grant_ring(dev, virt_to_mfn(txs), &info->tx_ring_ref); + if (error) goto fail; - info->tx_ring_ref = err; rxs = (netif_rx_sring_t *)malloc(PAGE_SIZE, M_DEVBUF, M_NOWAIT|M_ZERO); if (!rxs) { - err = ENOMEM; - xenbus_dev_fatal(dev, err, "allocating rx ring page"); + error = ENOMEM; + xenbus_dev_fatal(dev, error, "allocating rx ring page"); goto fail; } SHARED_RING_INIT(rxs); FRONT_RING_INIT(&info->rx, rxs, PAGE_SIZE); - err = xenbus_grant_ring(dev, virt_to_mfn(rxs)); - if (err < 0) + error = xenbus_grant_ring(dev, virt_to_mfn(rxs), &info->rx_ring_ref); + if (error) goto fail; - info->rx_ring_ref = err; -#if 0 - network_connect(info); -#endif - err = bind_listening_port_to_irqhandler(xenbus_get_otherend_id(dev), - "xn", xn_intr, info, INTR_TYPE_NET | INTR_MPSAFE, NULL); + error = bind_listening_port_to_irqhandler(xenbus_get_otherend_id(dev), + "xn", xn_intr, info, INTR_TYPE_NET | INTR_MPSAFE, &info->irq); - if (err <= 0) { - xenbus_dev_fatal(dev, err, + if (error) { + xenbus_dev_fatal(dev, error, "bind_evtchn_to_irqhandler failed"); goto fail; } - info->irq = err; - + show_device(info); - return 0; + return (0); fail: netif_free(info); - return err; + return (error); } /** @@ -1226,7 +1219,7 @@ xennet_get_responses(struct netfront_inf MULTI_update_va_mapping(mcl, (u_long)vaddr, (((vm_paddr_t)mfn) << PAGE_SHIFT) | PG_RW | PG_V | PG_M | PG_A, 0); - pfn = (uint32_t)m->m_ext.ext_args; + pfn = (uintptr_t)m->m_ext.ext_args; mmu->ptr = ((vm_paddr_t)mfn << PAGE_SHIFT) | MMU_MACHPHYS_UPDATE; mmu->val = pfn; @@ -1558,18 +1551,18 @@ xn_stop(struct netfront_info *sc) int network_connect(struct netfront_info *np) { - int i, requeue_idx, err; + int i, requeue_idx, error; grant_ref_t ref; netif_rx_request_t *req; u_int feature_rx_copy, feature_rx_flip; - err = xenbus_scanf(XBT_NIL, xenbus_get_otherend_path(np->xbdev), - "feature-rx-copy", "%u", &feature_rx_copy); - if (err != 1) + error = xenbus_scanf(XBT_NIL, xenbus_get_otherend_path(np->xbdev), + "feature-rx-copy", NULL, "%u", &feature_rx_copy); + if (error) feature_rx_copy = 0; - err = xenbus_scanf(XBT_NIL, xenbus_get_otherend_path(np->xbdev), - "feature-rx-flip", "%u", &feature_rx_flip); - if (err != 1) + error = xenbus_scanf(XBT_NIL, xenbus_get_otherend_path(np->xbdev), + "feature-rx-flip", NULL, "%u", &feature_rx_flip); + if (error) feature_rx_flip = 1; /* @@ -1582,9 +1575,9 @@ network_connect(struct netfront_info *np XN_LOCK(np); /* Recovery procedure: */ - err = talk_to_backend(np->xbdev, np); - if (err) - return (err); + error = talk_to_backend(np->xbdev, np); + if (error) + return (error); /* Step 1: Reinitialise variables. */ netif_release_tx_bufs(np); @@ -1592,6 +1585,7 @@ network_connect(struct netfront_info *np /* Step 2: Rebuild the RX buffer freelist and the RX ring itself. */ for (requeue_idx = 0, i = 0; i < NET_RX_RING_SIZE; i++) { struct mbuf *m; + u_long pfn; if (np->rx_mbufs[i] == NULL) continue; @@ -1599,15 +1593,16 @@ network_connect(struct netfront_info *np m = np->rx_mbufs[requeue_idx] = xennet_get_rx_mbuf(np, i); ref = np->grant_rx_ref[requeue_idx] = xennet_get_rx_ref(np, i); req = RING_GET_REQUEST(&np->rx, requeue_idx); + pfn = vtophys(mtod(m, vm_offset_t)) >> PAGE_SHIFT; if (!np->copying_receiver) { gnttab_grant_foreign_transfer_ref(ref, xenbus_get_otherend_id(np->xbdev), - vtophys(mtod(m, vm_offset_t))); + pfn); } else { gnttab_grant_foreign_access_ref(ref, xenbus_get_otherend_id(np->xbdev), - vtophys(mtod(m, vm_offset_t)), 0); + PFNTOMFN(pfn), 0); } req->gref = ref; req->id = requeue_idx; @@ -1708,7 +1703,7 @@ create_netdev(device_t dev) ifp = np->xn_ifp = if_alloc(IFT_ETHER); ifp->if_softc = np; if_initname(ifp, "xn", device_get_unit(dev)); - ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX; + ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; ifp->if_ioctl = xn_ioctl; ifp->if_output = ether_output; ifp->if_start = xn_start; @@ -1778,11 +1773,14 @@ static void netif_free(struct netfront_i #endif } - - static void netif_disconnect_backend(struct netfront_info *info) { - xn_stop(info); + XN_RX_LOCK(info); + XN_TX_LOCK(info); + netfront_carrier_off(info); + XN_TX_UNLOCK(info); + XN_RX_UNLOCK(info); + end_access(info->tx_ring_ref, info->tx.sring); end_access(info->rx_ring_ref, info->rx.sring); info->tx_ring_ref = GRANT_INVALID_REF; @@ -1790,12 +1788,9 @@ static void netif_disconnect_backend(str info->tx.sring = NULL; info->rx.sring = NULL; -#if 0 if (info->irq) - unbind_from_irqhandler(info->irq, info->netdev); -#else - panic("FIX ME"); -#endif + unbind_from_irqhandler(info->irq); + info->irq = 0; } Modified: projects/releng_7_xen/sys/i386/conf/XEN ============================================================================== --- projects/releng_7_xen/sys/i386/conf/XEN Sun Dec 28 05:38:49 2008 (r186534) +++ projects/releng_7_xen/sys/i386/conf/XEN Sun Dec 28 06:01:42 2008 (r186535) @@ -27,9 +27,9 @@ ident GENERIC makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols #makeoptions MODULES_OVERRIDE="" -#options SCHED_ULE # ULE scheduler -#options PREEMPTION # Enable kernel thread preemption -options SCHED_4BSD +options SCHED_ULE # ULE scheduler +options PREEMPTION # Enable kernel thread preemption +#options SCHED_4BSD options INET # InterNETworking options INET6 # IPv6 communications protocols Modified: projects/releng_7_xen/sys/i386/i386/genassym.c ============================================================================== --- projects/releng_7_xen/sys/i386/i386/genassym.c Sun Dec 28 05:38:49 2008 (r186534) +++ projects/releng_7_xen/sys/i386/i386/genassym.c Sun Dec 28 06:01:42 2008 (r186535) @@ -230,7 +230,7 @@ ASSYM(BUS_SPACE_HANDLE_IAT, offsetof(str #endif #ifdef XEN -#include +#include ASSYM(PC_CR3, offsetof(struct pcpu, pc_cr3)); ASSYM(HYPERVISOR_VIRT_START, __HYPERVISOR_VIRT_START); #endif Modified: projects/releng_7_xen/sys/i386/i386/machdep.c ============================================================================== --- projects/releng_7_xen/sys/i386/i386/machdep.c Sun Dec 28 05:38:49 2008 (r186534) +++ projects/releng_7_xen/sys/i386/i386/machdep.c Sun Dec 28 06:01:42 2008 (r186535) @@ -145,11 +145,11 @@ uint32_t arch_i386_xbox_memsize = 0; #ifdef XEN /* XEN includes */ #include -#include +#include #include #include #include -#include +#include void Xhypervisor_callback(void); void failsafe_callback(void); Modified: projects/releng_7_xen/sys/i386/i386/vm_machdep.c ============================================================================== --- projects/releng_7_xen/sys/i386/i386/vm_machdep.c Sun Dec 28 05:38:49 2008 (r186534) +++ projects/releng_7_xen/sys/i386/i386/vm_machdep.c Sun Dec 28 06:01:42 2008 (r186535) @@ -90,7 +90,7 @@ __FBSDID("$FreeBSD$"); #include #ifdef XEN -#include +#include #endif #ifdef PC98 #include Modified: projects/releng_7_xen/sys/i386/include/xen/xenfunc.h ============================================================================== --- projects/releng_7_xen/sys/i386/include/xen/xenfunc.h Sun Dec 28 05:38:49 2008 (r186534) +++ projects/releng_7_xen/sys/i386/include/xen/xenfunc.h Sun Dec 28 06:01:42 2008 (r186535) @@ -33,7 +33,7 @@ #define _XEN_XENFUNC_H_ #include -#include +#include #include #include #include Modified: projects/releng_7_xen/sys/i386/isa/npx.c ============================================================================== --- projects/releng_7_xen/sys/i386/isa/npx.c Sun Dec 28 05:38:49 2008 (r186534) +++ projects/releng_7_xen/sys/i386/isa/npx.c Sun Dec 28 06:01:42 2008 (r186535) @@ -70,7 +70,7 @@ __FBSDID("$FreeBSD$"); #include #ifdef XEN #include -#include +#include #endif #ifdef DEV_ISA Modified: projects/releng_7_xen/sys/i386/xen/clock.c ============================================================================== --- projects/releng_7_xen/sys/i386/xen/clock.c Sun Dec 28 05:38:49 2008 (r186534) +++ projects/releng_7_xen/sys/i386/xen/clock.c Sun Dec 28 06:01:42 2008 (r186535) @@ -78,11 +78,11 @@ __FBSDID("$FreeBSD$"); #include #include -#include +#include #include #include #include -#include +#include #include #include #include @@ -791,18 +791,20 @@ static struct vcpu_set_periodic_timer xe void cpu_initclocks(void) { - int time_irq; - + unsigned int time_irq; + int error; + xen_set_periodic_tick.period_ns = NS_PER_TICK; HYPERVISOR_vcpu_op(VCPUOP_set_periodic_timer, 0, &xen_set_periodic_tick); - - if ((time_irq = bind_virq_to_irqhandler(VIRQ_TIMER, 0, "clk", + + error = bind_virq_to_irqhandler(VIRQ_TIMER, 0, "clk", clkintr, NULL, - INTR_TYPE_CLK | INTR_FAST)) < 0) { + INTR_TYPE_CLK | INTR_FAST, &time_irq); + if (error) panic("failed to register clock interrupt\n"); - } + /* should fast clock be enabled ? */ @@ -811,18 +813,19 @@ cpu_initclocks(void) int ap_cpu_initclocks(int cpu) { - int time_irq; + unsigned int time_irq; + int error; xen_set_periodic_tick.period_ns = NS_PER_TICK; HYPERVISOR_vcpu_op(VCPUOP_set_periodic_timer, cpu, &xen_set_periodic_tick); - - if ((time_irq = bind_virq_to_irqhandler(VIRQ_TIMER, cpu, "clk", - clkintr2, NULL, - INTR_TYPE_CLK | INTR_FAST)) < 0) { + error = bind_virq_to_irqhandler(VIRQ_TIMER, 0, "clk", + clkintr, NULL, + INTR_TYPE_CLK | INTR_FAST, &time_irq); + if (error) panic("failed to register clock interrupt\n"); - } + return (0); } Modified: projects/releng_7_xen/sys/i386/xen/mp_machdep.c ============================================================================== --- projects/releng_7_xen/sys/i386/xen/mp_machdep.c Sun Dec 28 05:38:49 2008 (r186534) +++ projects/releng_7_xen/sys/i386/xen/mp_machdep.c Sun Dec 28 06:01:42 2008 (r186535) @@ -85,9 +85,9 @@ __FBSDID("$FreeBSD$"); #include -#include -#include -#include +#include +#include +#include #include #define stop_cpus_with_nmi 0 @@ -435,7 +435,8 @@ static int xen_smp_intr_init(unsigned int cpu) { int rc; - + unsigned int irq; + per_cpu(resched_irq, cpu) = per_cpu(callfunc_irq, cpu) = -1; sprintf(resched_name[cpu], "resched%u", cpu); @@ -443,22 +444,22 @@ xen_smp_intr_init(unsigned int cpu) cpu, resched_name[cpu], smp_reschedule_interrupt, - INTR_FAST|INTR_TYPE_TTY|INTR_MPSAFE); + INTR_FAST|INTR_TYPE_TTY|INTR_MPSAFE, &irq); printf("cpu=%d irq=%d vector=%d\n", cpu, rc, RESCHEDULE_VECTOR); - per_cpu(resched_irq, cpu) = rc; + per_cpu(resched_irq, cpu) = irq; sprintf(callfunc_name[cpu], "callfunc%u", cpu); rc = bind_ipi_to_irqhandler(CALL_FUNCTION_VECTOR, cpu, callfunc_name[cpu], smp_call_function_interrupt, - INTR_FAST|INTR_TYPE_TTY|INTR_MPSAFE); + INTR_FAST|INTR_TYPE_TTY|INTR_MPSAFE, &irq); if (rc < 0) goto fail; - per_cpu(callfunc_irq, cpu) = rc; + per_cpu(callfunc_irq, cpu) = irq; printf("cpu=%d irq=%d vector=%d\n", cpu, rc, CALL_FUNCTION_VECTOR); @@ -471,9 +472,9 @@ xen_smp_intr_init(unsigned int cpu) fail: if (per_cpu(resched_irq, cpu) >= 0) - unbind_from_irqhandler(per_cpu(resched_irq, cpu), NULL); + unbind_from_irqhandler(per_cpu(resched_irq, cpu)); if (per_cpu(callfunc_irq, cpu) >= 0) - unbind_from_irqhandler(per_cpu(callfunc_irq, cpu), NULL); + unbind_from_irqhandler(per_cpu(callfunc_irq, cpu)); return rc; } Modified: projects/releng_7_xen/sys/i386/xen/mptable.c ============================================================================== --- projects/releng_7_xen/sys/i386/xen/mptable.c Sun Dec 28 05:38:49 2008 (r186534) +++ projects/releng_7_xen/sys/i386/xen/mptable.c Sun Dec 28 06:01:42 2008 (r186535) @@ -45,7 +45,7 @@ __FBSDID("$FreeBSD$"); #include #include -#include +#include #include #include #include Modified: projects/releng_7_xen/sys/i386/xen/pmap.c ============================================================================== --- projects/releng_7_xen/sys/i386/xen/pmap.c Sun Dec 28 05:38:49 2008 (r186534) +++ projects/releng_7_xen/sys/i386/xen/pmap.c Sun Dec 28 06:01:42 2008 (r186535) @@ -154,7 +154,7 @@ __FBSDID("$FreeBSD$"); #endif #include -#include +#include #include #include #include Modified: projects/releng_7_xen/sys/i386/xen/xen_machdep.c ============================================================================== --- projects/releng_7_xen/sys/i386/xen/xen_machdep.c Sun Dec 28 05:38:49 2008 (r186534) +++ projects/releng_7_xen/sys/i386/xen/xen_machdep.c Sun Dec 28 06:01:42 2008 (r186535) @@ -59,7 +59,7 @@ __FBSDID("$FreeBSD$"); -#include +#include #include #include #include Copied and modified: projects/releng_7_xen/sys/xen/evtchn.h (from r186315, projects/releng_7_xen/sys/i386/include/xen/evtchn.h) ============================================================================== --- projects/releng_7_xen/sys/i386/include/xen/evtchn.h Fri Dec 19 06:50:15 2008 (r186315, copy source) +++ projects/releng_7_xen/sys/xen/evtchn.h Sun Dec 28 06:01:42 2008 (r186535) @@ -12,7 +12,7 @@ #ifndef __ASM_EVTCHN_H__ #define __ASM_EVTCHN_H__ #include -#include +#include #include #include Modified: projects/releng_7_xen/sys/xen/evtchn/evtchn.c ============================================================================== --- projects/releng_7_xen/sys/xen/evtchn/evtchn.c Sun Dec 28 05:38:49 2008 (r186534) +++ projects/releng_7_xen/sys/xen/evtchn/evtchn.c Sun Dec 28 06:01:42 2008 (r186535) @@ -23,10 +23,10 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include +#include #include -#include -#include +#include +#include #include @@ -76,6 +76,7 @@ static struct mtx irq_mapping_update_loc static struct xenpic *xp; struct xenpic_intsrc { struct intsrc xp_intsrc; + void *xp_cookie; uint8_t xp_vector; boolean_t xp_masked; }; @@ -295,6 +296,7 @@ bind_caller_port_to_irq(unsigned int cal } irq_bindcount[irq]++; + unmask_evtchn(caller_port); out: mtx_unlock_spin(&irq_mapping_update_lock); @@ -320,6 +322,7 @@ bind_local_port_to_irq(unsigned int loca evtchn_to_irq[local_port] = irq; irq_info[irq] = mk_irq_info(IRQT_LOCAL_PORT, 0, local_port); irq_bindcount[irq]++; + unmask_evtchn(local_port); out: mtx_unlock_spin(&irq_mapping_update_lock); @@ -465,20 +468,25 @@ bind_caller_port_to_irqhandler(unsigned driver_intr_t handler, void *arg, unsigned long irqflags, - void **cookiep) + unsigned int *irqp) { unsigned int irq; - int retval; + int error; irq = bind_caller_port_to_irq(caller_port); intr_register_source(&xp->xp_pins[irq].xp_intsrc); - retval = intr_add_handler(devname, irq, NULL, handler, arg, irqflags, cookiep); - if (retval != 0) { + error = intr_add_handler(devname, irq, NULL, handler, arg, irqflags, + &xp->xp_pins[irq].xp_cookie); + + if (error) { unbind_from_irq(irq); - return -retval; + return (error); } - return irq; + if (irqp) + *irqp = irq; + + return (0); } int @@ -488,43 +496,50 @@ bind_listening_port_to_irqhandler( driver_intr_t handler, void *arg, unsigned long irqflags, - void **cookiep) + unsigned int *irqp) { unsigned int irq; - int retval; + int error; irq = bind_listening_port_to_irq(remote_domain); intr_register_source(&xp->xp_pins[irq].xp_intsrc); - retval = intr_add_handler(devname, irq, NULL, handler, arg, irqflags, cookiep); - if (retval != 0) { + error = intr_add_handler(devname, irq, NULL, handler, arg, irqflags, + &xp->xp_pins[irq].xp_cookie); + if (error) { unbind_from_irq(irq); - return -retval; + return (error); } - - return irq; + if (irqp) + *irqp = irq; + + return (0); } int bind_interdomain_evtchn_to_irqhandler( - unsigned int remote_domain, - unsigned int remote_port, - const char *devname, - driver_filter_t filter, - driver_intr_t handler, - unsigned long irqflags) + unsigned int remote_domain, + unsigned int remote_port, + const char *devname, + driver_filter_t filter, + driver_intr_t handler, + unsigned long irqflags, + unsigned int *irqp) { unsigned int irq; - int retval; + int error; irq = bind_interdomain_evtchn_to_irq(remote_domain, remote_port); intr_register_source(&xp->xp_pins[irq].xp_intsrc); - retval = intr_add_handler(devname, irq, filter, handler, NULL, irqflags, NULL); - if (retval != 0) { + error = intr_add_handler(devname, irq, filter, handler, NULL, + irqflags, &xp->xp_pins[irq].xp_cookie); + if (error) { unbind_from_irq(irq); - return -retval; + return (error); } - return irq; + if (irqp) + *irqp = irq; + return (0); } int @@ -533,20 +548,24 @@ bind_virq_to_irqhandler(unsigned int vir const char *devname, driver_filter_t filter, driver_intr_t handler, - unsigned long irqflags) + unsigned long irqflags, + unsigned int *irqp) { unsigned int irq; - int retval; + int error; irq = bind_virq_to_irq(virq, cpu); intr_register_source(&xp->xp_pins[irq].xp_intsrc); - retval = intr_add_handler(devname, irq, filter, handler, NULL, irqflags, NULL); - if (retval != 0) { + error = intr_add_handler(devname, irq, filter, handler, + NULL, irqflags, &xp->xp_pins[irq].xp_cookie); + if (error) { unbind_from_irq(irq); - return -retval; + return (error); } - return irq; + if (irqp) + *irqp = irq; + return (0); } int @@ -554,27 +573,30 @@ bind_ipi_to_irqhandler(unsigned int ipi, unsigned int cpu, const char *devname, driver_filter_t filter, - unsigned long irqflags) + unsigned long irqflags, + unsigned int *irqp) { - int irq, retval; + unsigned int irq; + int error; irq = bind_ipi_to_irq(ipi, cpu); intr_register_source(&xp->xp_pins[irq].xp_intsrc); - retval = intr_add_handler(devname, irq, filter, NULL, - NULL, irqflags, NULL); - if (retval != 0) { + error = intr_add_handler(devname, irq, filter, NULL, + NULL, irqflags, &xp->xp_pins[irq].xp_cookie); + if (error) { unbind_from_irq(irq); - return -retval; + return (error); } - return irq; + if (irqp) + *irqp = irq; + return (0); } void -unbind_from_irqhandler(unsigned int irq, void *dev_id) +unbind_from_irqhandler(unsigned int irq) { - if (dev_id) - intr_remove_handler(dev_id); /* XXX */ + intr_remove_handler(xp->xp_pins[irq].xp_cookie); unbind_from_irq(irq); } Modified: projects/releng_7_xen/sys/xen/evtchn/evtchn_dev.c ============================================================================== --- projects/releng_7_xen/sys/xen/evtchn/evtchn_dev.c Sun Dec 28 05:38:49 2008 (r186534) +++ projects/releng_7_xen/sys/xen/evtchn/evtchn_dev.c Sun Dec 28 06:01:42 2008 (r186535) @@ -26,13 +26,13 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include +#include #include #include #include #include -#include -#include +#include +#include *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-src-projects@FreeBSD.ORG Sun Dec 28 06:16:36 2008 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 341321065670; Sun, 28 Dec 2008 06:16:36 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 23F178FC08; Sun, 28 Dec 2008 06:16:36 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id mBS6GavC005080; Sun, 28 Dec 2008 06:16:36 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id mBS6GaNi005079; Sun, 28 Dec 2008 06:16:36 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200812280616.mBS6GaNi005079@svn.freebsd.org> From: Kip Macy Date: Sun, 28 Dec 2008 06:16:36 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r186536 - projects/releng_7_xen/sys/i386/conf X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 28 Dec 2008 06:16:36 -0000 Author: kmacy Date: Sun Dec 28 06:16:35 2008 New Revision: 186536 URL: http://svn.freebsd.org/changeset/base/186536 Log: disable KSE and SSE Modified: projects/releng_7_xen/sys/i386/conf/XEN Modified: projects/releng_7_xen/sys/i386/conf/XEN ============================================================================== --- projects/releng_7_xen/sys/i386/conf/XEN Sun Dec 28 06:01:42 2008 (r186535) +++ projects/releng_7_xen/sys/i386/conf/XEN Sun Dec 28 06:16:35 2008 (r186536) @@ -81,6 +81,9 @@ nodevice atpic nodevice isa options MCLSHIFT=12 device genclock +nooption KSE +options CPU_DISABLE_SSE + # To make an SMP kernel, the next two lines are needed options SMP # Symmetric MultiProcessor Kernel From owner-svn-src-projects@FreeBSD.ORG Sun Dec 28 07:06:20 2008 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 980281065675; Sun, 28 Dec 2008 07:06:20 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 884318FC17; Sun, 28 Dec 2008 07:06:20 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id mBS76Krc006027; Sun, 28 Dec 2008 07:06:20 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id mBS76Klr006026; Sun, 28 Dec 2008 07:06:20 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200812280706.mBS76Klr006026@svn.freebsd.org> From: Kip Macy Date: Sun, 28 Dec 2008 07:06:20 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r186537 - projects/releng_7_xen/sys/xen/evtchn X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 28 Dec 2008 07:06:20 -0000 Author: kmacy Date: Sun Dec 28 07:06:20 2008 New Revision: 186537 URL: http://svn.freebsd.org/changeset/base/186537 Log: unmask evtchn in bind_{virq, ipi}_to_irq Modified: projects/releng_7_xen/sys/xen/evtchn/evtchn.c Modified: projects/releng_7_xen/sys/xen/evtchn/evtchn.c ============================================================================== --- projects/releng_7_xen/sys/xen/evtchn/evtchn.c Sun Dec 28 06:16:35 2008 (r186536) +++ projects/releng_7_xen/sys/xen/evtchn/evtchn.c Sun Dec 28 07:06:20 2008 (r186537) @@ -364,7 +364,7 @@ static int bind_virq_to_irq(unsigned int virq, unsigned int cpu) { struct evtchn_bind_virq bind_virq; - int evtchn, irq; + int evtchn = 0, irq; mtx_lock_spin(&irq_mapping_update_lock); @@ -388,6 +388,7 @@ bind_virq_to_irq(unsigned int virq, unsi } irq_bindcount[irq]++; + unmask_evtchn(evtchn); out: mtx_unlock_spin(&irq_mapping_update_lock); @@ -401,8 +402,9 @@ int bind_ipi_to_irq(unsigned int ipi, unsigned int cpu) { struct evtchn_bind_ipi bind_ipi; - int evtchn, irq; - + int irq; + int evtchn = 0; + mtx_lock_spin(&irq_mapping_update_lock); if ((irq = per_cpu(ipi_to_irq, cpu)[ipi]) == -1) { @@ -421,6 +423,7 @@ bind_ipi_to_irq(unsigned int ipi, unsign bind_evtchn_to_cpu(evtchn, cpu); } irq_bindcount[irq]++; + unmask_evtchn(evtchn); out: mtx_unlock_spin(&irq_mapping_update_lock); From owner-svn-src-projects@FreeBSD.ORG Sun Dec 28 07:09:00 2008 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 7FA721065674; Sun, 28 Dec 2008 07:09:00 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 6F0988FC16; Sun, 28 Dec 2008 07:09:00 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id mBS790qd006114; Sun, 28 Dec 2008 07:09:00 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id mBS790VL006111; Sun, 28 Dec 2008 07:09:00 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200812280709.mBS790VL006111@svn.freebsd.org> From: Kip Macy Date: Sun, 28 Dec 2008 07:09:00 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r186538 - projects/releng_7_xen/sys/xen/xenbus X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 28 Dec 2008 07:09:00 -0000 Author: kmacy Date: Sun Dec 28 07:09:00 2008 New Revision: 186538 URL: http://svn.freebsd.org/changeset/base/186538 Log: - remove code for handling case of not being able to sleep - eliminate tsleep - make sleeps atomic Modified: projects/releng_7_xen/sys/xen/xenbus/xenbus_comms.c projects/releng_7_xen/sys/xen/xenbus/xenbus_comms.h projects/releng_7_xen/sys/xen/xenbus/xenbus_xs.c Modified: projects/releng_7_xen/sys/xen/xenbus/xenbus_comms.c ============================================================================== --- projects/releng_7_xen/sys/xen/xenbus/xenbus_comms.c Sun Dec 28 07:06:20 2008 (r186537) +++ projects/releng_7_xen/sys/xen/xenbus/xenbus_comms.c Sun Dec 28 07:09:00 2008 (r186538) @@ -36,6 +36,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -94,7 +95,7 @@ xb_get_input_chunk(XENSTORE_RING_IDX con } int -xb_write(const void *tdata, unsigned len) +xb_write(const void *tdata, unsigned len, struct lock_object *lock) { struct xenstore_domain_interface *intf = xenstore_domain_interface(); XENSTORE_RING_IDX cons, prod; @@ -107,7 +108,9 @@ xb_write(const void *tdata, unsigned len while ((intf->req_prod - intf->req_cons) == XENSTORE_RING_SIZE) { - error = tsleep(intf, PCATCH, "xbwrite", hz/10); + error = _sleep(intf, + lock, + PCATCH, "xbwrite", hz/10); if (error && error != EWOULDBLOCK) return (error); } @@ -144,7 +147,7 @@ xb_write(const void *tdata, unsigned len } int -xb_read(void *tdata, unsigned len) +xb_read(void *tdata, unsigned len, struct lock_object *lock) { struct xenstore_domain_interface *intf = xenstore_domain_interface(); XENSTORE_RING_IDX cons, prod; @@ -156,7 +159,8 @@ xb_read(void *tdata, unsigned len) const char *src; while (intf->rsp_cons == intf->rsp_prod) { - error = tsleep(intf, PCATCH, "xbread", hz/10); + error = _sleep(intf, lock, + PCATCH, "xbread", hz/10); if (error && error != EWOULDBLOCK) return (error); } Modified: projects/releng_7_xen/sys/xen/xenbus/xenbus_comms.h ============================================================================== --- projects/releng_7_xen/sys/xen/xenbus/xenbus_comms.h Sun Dec 28 07:06:20 2008 (r186537) +++ projects/releng_7_xen/sys/xen/xenbus/xenbus_comms.h Sun Dec 28 07:09:00 2008 (r186538) @@ -30,6 +30,7 @@ #ifndef _XENBUS_COMMS_H #define _XENBUS_COMMS_H +struct sx; extern int xen_store_evtchn; extern char *xen_store; @@ -37,8 +38,8 @@ int xs_init(void); int xb_init_comms(void); /* Low level routines. */ -int xb_write(const void *data, unsigned len); -int xb_read(void *data, unsigned len); +int xb_write(const void *data, unsigned len, struct lock_object *); +int xb_read(void *data, unsigned len, struct lock_object *); extern int xenbus_running; char *kasprintf(const char *fmt, ...); Modified: projects/releng_7_xen/sys/xen/xenbus/xenbus_xs.c ============================================================================== --- projects/releng_7_xen/sys/xen/xenbus/xenbus_xs.c Sun Dec 28 07:06:20 2008 (r186537) +++ projects/releng_7_xen/sys/xen/xenbus/xenbus_xs.c Sun Dec 28 07:09:00 2008 (r186538) @@ -137,33 +137,11 @@ xs_read_reply(enum xsd_sockmsg_type *typ { struct xs_stored_msg *msg; char *body; - int i, error; - - if (xenbus_running == 0) { - /* - * Give other domain time to run :-/ - */ - for (i = 0; i < 1000000 && (xenbus_running == 0); i++) { - error = xs_process_msg(type); - - if (error == 0 && *type != XS_WATCH_EVENT) - break; - - HYPERVISOR_yield(); - } - - if (TAILQ_EMPTY(&xs_state.reply_list)) { - printf("giving up and returning an error type=%d\n", - *type); - kdb_backtrace(); - return (EIO); - } - - } + int error; mtx_lock(&xs_state.reply_lock); - if (xenbus_running) { - while (TAILQ_EMPTY(&xs_state.reply_list)) { + + while (TAILQ_EMPTY(&xs_state.reply_list)) { while (TAILQ_EMPTY(&xs_state.reply_list)) { error = mtx_sleep(&xs_state.reply_waitq, &xs_state.reply_lock, @@ -177,7 +155,7 @@ xs_read_reply(enum xsd_sockmsg_type *typ } - } + msg = TAILQ_FIRST(&xs_state.reply_list); TAILQ_REMOVE(&xs_state.reply_list, msg, list); @@ -224,7 +202,7 @@ xenbus_dev_request_and_reply(struct xsd_ sx_xlock(&xs_state.request_mutex); - error = xb_write(msg, sizeof(*msg) + msg->len); + error = xb_write(msg, sizeof(*msg) + msg->len, &xs_state.request_mutex.lock_object); if (error) { msg->type = XS_ERROR; } else { @@ -241,8 +219,6 @@ xenbus_dev_request_and_reply(struct xsd_ return (error); } -static int xenwatch_inline; - /* * Send message to xs. The reply is returned in *result and should be * fred with free(*result, M_DEVBUF). Return zero on success or an @@ -267,7 +243,7 @@ xs_talkv(struct xenbus_transaction t, en sx_xlock(&xs_state.request_mutex); - error = xb_write(&msg, sizeof(msg)); + error = xb_write(&msg, sizeof(msg), &xs_state.request_mutex.lock_object); if (error) { sx_xunlock(&xs_state.request_mutex); printf("xs_talkv failed %d\n", error); @@ -275,7 +251,7 @@ xs_talkv(struct xenbus_transaction t, en } for (i = 0; i < num_vecs; i++) { - error = xb_write(iovec[i].iov_base, iovec[i].iov_len);; + error = xb_write(iovec[i].iov_base, iovec[i].iov_len, &xs_state.request_mutex.lock_object); if (error) { sx_xunlock(&xs_state.request_mutex); printf("xs_talkv failed %d\n", error); @@ -776,18 +752,15 @@ xenwatch_thread(void *unused) { struct xs_stored_msg *msg; - DELAY(100000); - while (xenwatch_inline) { - printf("xenwatch inline still running\n"); - DELAY(100000); - } - for (;;) { + mtx_lock(&watch_events_lock); while (TAILQ_EMPTY(&watch_events)) - tsleep(&watch_events_waitq, + mtx_sleep(&watch_events_waitq, + &watch_events_lock, PWAIT | PCATCH, "waitev", hz/10); - + + mtx_unlock(&watch_events_lock); sx_xlock(&xenwatch_mutex); mtx_lock(&watch_events_lock); @@ -817,16 +790,18 @@ xs_process_msg(enum xsd_sockmsg_type *ty int error; msg = malloc(sizeof(*msg), M_DEVBUF, M_WAITOK); - - error = xb_read(&msg->hdr, sizeof(msg->hdr)); + mtx_lock(&xs_state.reply_lock); + error = xb_read(&msg->hdr, sizeof(msg->hdr), &xs_state.reply_lock.lock_object); + mtx_unlock(&xs_state.reply_lock); if (error) { free(msg, M_DEVBUF); return (error); } body = malloc(msg->hdr.len + 1, M_DEVBUF, M_WAITOK); - - error = xb_read(body, msg->hdr.len); + mtx_lock(&xs_state.reply_lock); + error = xb_read(body, msg->hdr.len, &xs_state.reply_lock.lock_object); + mtx_unlock(&xs_state.reply_lock); if (error) { free(body, M_DEVBUF); free(msg, M_DEVBUF); @@ -869,9 +844,7 @@ xenbus_thread(void *unused) int error; enum xsd_sockmsg_type type; - DELAY(10000); xenbus_running = 1; - tsleep(&lbolt, 0, "xenbus", hz/10); for (;;) { error = xs_process_msg(&type); From owner-svn-src-projects@FreeBSD.ORG Sun Dec 28 23:16:16 2008 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id D7A1E1065675 for ; Sun, 28 Dec 2008 23:16:16 +0000 (UTC) (envelope-from ivoras@gmail.com) Received: from mail-bw0-f19.google.com (mail-bw0-f19.google.com [209.85.218.19]) by mx1.freebsd.org (Postfix) with ESMTP id 6671C8FC12 for ; Sun, 28 Dec 2008 23:16:12 +0000 (UTC) (envelope-from ivoras@gmail.com) Received: by bwz12 with SMTP id 12so12211403bwz.19 for ; Sun, 28 Dec 2008 15:16:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:message-id:date:from:to :subject:cc:in-reply-to:mime-version:content-type :content-transfer-encoding:content-disposition:references; bh=v/XC2AG2Pof+mac3kg8ptr/taeprVxcrtnilAMxPimY=; b=kxQpmerGjzJigyv4pHtCzZiPFp7lW0zOg3SpLDp8C8pxtoJ1T7AoyYwBoMqbcIDlOX d5w+bTdyYMIgYFIjqCEo2HXPerfW+gkjyCUxy9NoGIj8RPyM/rVTmc+AwgiE80zuPQIJ TpztpghPbQUtz552jFIi8+gCW8gubzm0YJ1jg= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:to:subject:cc:in-reply-to:mime-version :content-type:content-transfer-encoding:content-disposition :references; b=LGCoyXdzBL35brD3p+btDA5FdqDlZNVFWC3yltMUcTwHB+koqvvdk1WuacVUj4b9mf RllHEdpnu/ZbhaeENiZh2hdDqzgBKom8GQpXtzCRJ+5BEp2zGGSzHqdWMBDOIsg/0+Zh Vn+jDe7VDNWpdtVgSjQIhn1eGjfPPTUUCuWuE= Received: by 10.181.198.10 with SMTP id a10mr4961949bkq.120.1230504204456; Sun, 28 Dec 2008 14:43:24 -0800 (PST) Received: by 10.181.20.7 with HTTP; Sun, 28 Dec 2008 14:43:24 -0800 (PST) Message-ID: <9bbcef730812281443h2c5a774ch881e15ec58d47eb8@mail.gmail.com> Date: Sun, 28 Dec 2008 23:43:24 +0100 From: ivoras@gmail.com To: "Kip Macy" In-Reply-To: <200812280616.mBS6GaNi005079@svn.freebsd.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Content-Disposition: inline References: <200812280616.mBS6GaNi005079@svn.freebsd.org> Cc: svn-src-projects@freebsd.org, src-committers@freebsd.org Subject: Re: svn commit: r186536 - projects/releng_7_xen/sys/i386/conf X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 28 Dec 2008 23:16:16 -0000 On 28/12/2008, Kip Macy wrote: > Author: kmacy > +options CPU_DISABLE_SSE Xen doesn't support SSE? Why should it care? From owner-svn-src-projects@FreeBSD.ORG Sun Dec 28 23:21:27 2008 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 966471065673; Sun, 28 Dec 2008 23:21:27 +0000 (UTC) (envelope-from mat.macy@gmail.com) Received: from rv-out-0506.google.com (rv-out-0506.google.com [209.85.198.224]) by mx1.freebsd.org (Postfix) with ESMTP id 642548FC08; Sun, 28 Dec 2008 23:21:25 +0000 (UTC) (envelope-from mat.macy@gmail.com) Received: by rv-out-0506.google.com with SMTP id b25so5734411rvf.43 for ; Sun, 28 Dec 2008 15:21:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:message-id:date:from:sender :to:subject:cc:in-reply-to:mime-version:content-type :content-transfer-encoding:content-disposition:references :x-google-sender-auth; bh=VqHbQMVJxIFkWGdfJUgljqdC8EhCiTj0jOZC6/AIKIs=; b=OQi8Hn2OBbPvOdvYeSgcEwq68e7dhWVWjdgft+HV4HR9klkienOTU9qvLVrxJ21QTb QRCWVViz12yhWXbjlwYoev8qN6ZRl3KdMlD8cCOt7bESk3krBaAWGn/Jtja4KGpT8lOS h7Zca8D8oRqmTrRLYby9NF+4F3qQBUcxAQFYE= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:sender:to:subject:cc:in-reply-to:mime-version :content-type:content-transfer-encoding:content-disposition :references:x-google-sender-auth; b=eHM7GFkfEIbiTfZICiru1mQ1QuOFjfP1tDmEdNeVm+vi0d11ejJgU27mx1u38sYGVq WukoMpJ9GCIXe8FSuZOcExCMeQPOfksaLF1QLiPH2l5jRH5Qrujs3IeWaCbfMeoPXOR/ wWG6ALhWCwuCquFBKM0ccMSETctnPykP5jaII= Received: by 10.141.171.3 with SMTP id y3mr6406211rvo.263.1230506485593; Sun, 28 Dec 2008 15:21:25 -0800 (PST) Received: by 10.141.37.17 with HTTP; Sun, 28 Dec 2008 15:21:25 -0800 (PST) Message-ID: <3c1674c90812281521w5b8785d7of7d3a9232e4b4edb@mail.gmail.com> Date: Sun, 28 Dec 2008 15:21:25 -0800 From: "Kip Macy" Sender: mat.macy@gmail.com To: ivoras@gmail.com In-Reply-To: <9bbcef730812281443h2c5a774ch881e15ec58d47eb8@mail.gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline References: <200812280616.mBS6GaNi005079@svn.freebsd.org> <9bbcef730812281443h2c5a774ch881e15ec58d47eb8@mail.gmail.com> X-Google-Sender-Auth: 62fa54ce7a4d96ac Cc: svn-src-projects@freebsd.org, src-committers@freebsd.org Subject: Re: svn commit: r186536 - projects/releng_7_xen/sys/i386/conf X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 28 Dec 2008 23:21:27 -0000 I saw a panic in this bit of code, it is easier to disable for now. -Kip On Sun, Dec 28, 2008 at 2:43 PM, wrote: > On 28/12/2008, Kip Macy wrote: >> Author: kmacy > >> +options CPU_DISABLE_SSE > > Xen doesn't support SSE? Why should it care? > -- Als die Nazis die Kommunisten holten, habe ich geschwiegen; ich war ja kein Kommunist. Als sie die Sozialdemokraten einsperrten, habe ich geschwiegen; ich war ja kein Sozialdemokrat. Als sie die Gewerkschafter holten, habe ich nicht protestiert; ich war ja kein Gewerkschafter. Als sie die Juden holten, habe ich geschwiegen; ich war ja kein Jude. Als sie mich holten, gab es keinen mehr, der protestieren konnte. From owner-svn-src-projects@FreeBSD.ORG Mon Dec 29 00:55:34 2008 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 69B761065670; Mon, 29 Dec 2008 00:55:34 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 5B8398FC13; Mon, 29 Dec 2008 00:55:34 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id mBT0tYmL032701; Mon, 29 Dec 2008 00:55:34 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id mBT0tXJu032690; Mon, 29 Dec 2008 00:55:33 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200812290055.mBT0tXJu032690@svn.freebsd.org> From: Kip Macy Date: Mon, 29 Dec 2008 00:55:33 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r186549 - in projects/releng_6_xen/sys: kern sys X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 29 Dec 2008 00:55:34 -0000 Author: kmacy Date: Mon Dec 29 00:55:33 2008 New Revision: 186549 URL: http://svn.freebsd.org/changeset/base/186549 Log: Log: integrate generic sleepq_add and _sleep Modified: projects/releng_6_xen/sys/kern/kern_condvar.c projects/releng_6_xen/sys/kern/kern_lock.c projects/releng_6_xen/sys/kern/kern_mutex.c projects/releng_6_xen/sys/kern/kern_rwlock.c projects/releng_6_xen/sys/kern/kern_sx.c projects/releng_6_xen/sys/kern/kern_synch.c projects/releng_6_xen/sys/kern/kern_timeout.c projects/releng_6_xen/sys/sys/lock.h projects/releng_6_xen/sys/sys/sleepqueue.h projects/releng_6_xen/sys/sys/sx.h projects/releng_6_xen/sys/sys/systm.h Modified: projects/releng_6_xen/sys/kern/kern_condvar.c ============================================================================== --- projects/releng_6_xen/sys/kern/kern_condvar.c Sun Dec 28 23:50:05 2008 (r186548) +++ projects/releng_6_xen/sys/kern/kern_condvar.c Mon Dec 29 00:55:33 2008 (r186549) @@ -124,8 +124,7 @@ cv_wait(struct cv *cvp, struct mtx *mp) DROP_GIANT(); mtx_unlock(mp); - sleepq_add(cvp, &mp->mtx_object, cvp->cv_description, SLEEPQ_CONDVAR, - 0); + sleepq_add(cvp, &mp->mtx_object, cvp->cv_description, SLEEPQ_CONDVAR, 0); sleepq_wait(cvp); #ifdef KTRACE @@ -232,8 +231,7 @@ cv_timedwait(struct cv *cvp, struct mtx DROP_GIANT(); mtx_unlock(mp); - sleepq_add(cvp, &mp->mtx_object, cvp->cv_description, SLEEPQ_CONDVAR, - 0); + sleepq_add(cvp, &mp->mtx_object, cvp->cv_description, SLEEPQ_CONDVAR, 0); sleepq_set_timeout(cvp, timo); rval = sleepq_timedwait(cvp); Modified: projects/releng_6_xen/sys/kern/kern_lock.c ============================================================================== --- projects/releng_6_xen/sys/kern/kern_lock.c Sun Dec 28 23:50:05 2008 (r186548) +++ projects/releng_6_xen/sys/kern/kern_lock.c Mon Dec 29 00:55:33 2008 (r186549) @@ -62,6 +62,43 @@ __FBSDID("$FreeBSD$"); #include #endif + +#ifdef DDB +#include +static void db_show_lockmgr(struct lock_object *lock); +#endif +static void lock_lockmgr(struct lock_object *lock, int how); +static int unlock_lockmgr(struct lock_object *lock); + +struct lock_class lock_class_lockmgr = { + .lc_name = "lockmgr", + .lc_flags = LC_SLEEPLOCK | LC_SLEEPABLE | LC_RECURSABLE | LC_UPGRADABLE, +#ifdef DDB + .lc_ddb_show = db_show_lockmgr, +#endif + .lc_lock = lock_lockmgr, + .lc_unlock = unlock_lockmgr, +}; + +/* + * Locking primitives implementation. + * Locks provide shared/exclusive sychronization. + */ + +void +lock_lockmgr(struct lock_object *lock, int how) +{ + + panic("lockmgr locks do not support sleep interlocking"); +} + +int +unlock_lockmgr(struct lock_object *lock) +{ + + panic("lockmgr locks do not support sleep interlocking"); +} + /* * Locking primitives implementation. * Locks provide shared/exclusive sychronization. @@ -639,14 +676,13 @@ ok: return (1); } -DB_SHOW_COMMAND(lockmgr, db_show_lockmgr) +void +db_show_lockmgr(struct lock_object *lock) { struct thread *td; struct lock *lkp; - if (!have_addr) - return; - lkp = (struct lock *)addr; + lkp = (struct lock *)lock; db_printf("lock type: %s\n", lkp->lk_wmesg); db_printf("state: "); Modified: projects/releng_6_xen/sys/kern/kern_mutex.c ============================================================================== --- projects/releng_6_xen/sys/kern/kern_mutex.c Sun Dec 28 23:50:05 2008 (r186548) +++ projects/releng_6_xen/sys/kern/kern_mutex.c Mon Dec 29 00:55:33 2008 (r186549) @@ -92,25 +92,66 @@ __FBSDID("$FreeBSD$"); #ifdef DDB static void db_show_mtx(struct lock_object *lock); #endif +static void lock_mtx(struct lock_object *lock, int how); +static void lock_spin(struct lock_object *lock, int how); +static int unlock_mtx(struct lock_object *lock); +static int unlock_spin(struct lock_object *lock); + /* * Lock classes for sleep and spin mutexes. */ struct lock_class lock_class_mtx_sleep = { - "sleep mutex", - LC_SLEEPLOCK | LC_RECURSABLE, + .lc_name = "sleep mutex", + .lc_flags = LC_SLEEPLOCK | LC_RECURSABLE, #ifdef DDB - db_show_mtx + .lc_ddb_show = db_show_mtx, #endif + .lc_lock = lock_mtx, + .lc_unlock = unlock_mtx, }; struct lock_class lock_class_mtx_spin = { - "spin mutex", - LC_SPINLOCK | LC_RECURSABLE, + .lc_name = "spin mutex", + .lc_flags = LC_SPINLOCK | LC_RECURSABLE, #ifdef DDB - db_show_mtx + .lc_ddb_show = db_show_mtx, #endif + .lc_lock = lock_spin, + .lc_unlock = unlock_spin, }; +void +lock_mtx(struct lock_object *lock, int how) +{ + + mtx_lock((struct mtx *)lock); +} + +void +lock_spin(struct lock_object *lock, int how) +{ + + panic("spin locks can only use msleep_spin"); +} + +int +unlock_mtx(struct lock_object *lock) +{ + struct mtx *m; + + m = (struct mtx *)lock; + mtx_assert(m, MA_OWNED | MA_NOTRECURSED); + mtx_unlock(m); + return (0); +} + +int +unlock_spin(struct lock_object *lock) +{ + + panic("spin locks can only use msleep_spin"); +} + /* * System-wide mutexes */ Modified: projects/releng_6_xen/sys/kern/kern_rwlock.c ============================================================================== --- projects/releng_6_xen/sys/kern/kern_rwlock.c Sun Dec 28 23:50:05 2008 (r186548) +++ projects/releng_6_xen/sys/kern/kern_rwlock.c Mon Dec 29 00:55:33 2008 (r186549) @@ -60,13 +60,19 @@ CTASSERT((RW_RECURSE & LO_CLASSFLAGS) == static void db_show_rwlock(struct lock_object *lock); #endif +static void lock_rw(struct lock_object *lock, int how); +static int unlock_rw(struct lock_object *lock); + struct lock_class lock_class_rw = { .lc_name = "rw", .lc_flags = LC_SLEEPLOCK | LC_RECURSABLE | LC_UPGRADABLE, #ifdef DDB .lc_ddb_show = db_show_rwlock, #endif + .lc_lock = lock_rw, + .lc_unlock = unlock_rw }; + /* * Return a pointer to the owning thread if the lock is write-locked or @@ -99,6 +105,34 @@ struct lock_class lock_class_rw = { #endif void +lock_rw(struct lock_object *lock, int how) +{ + struct rwlock *rw; + + rw = (struct rwlock *)lock; + if (how) + rw_wlock(rw); + else + rw_rlock(rw); +} + +int +unlock_rw(struct lock_object *lock) +{ + struct rwlock *rw; + + rw = (struct rwlock *)lock; + rw_assert(rw, RA_LOCKED | LA_NOTRECURSED); + if (rw->rw_lock & RW_LOCK_READ) { + rw_runlock(rw); + return (0); + } else { + rw_wunlock(rw); + return (1); + } +} + +void rw_init_flags(struct rwlock *rw, const char *name, int opts) { int flags; Modified: projects/releng_6_xen/sys/kern/kern_sx.c ============================================================================== --- projects/releng_6_xen/sys/kern/kern_sx.c Sun Dec 28 23:50:05 2008 (r186548) +++ projects/releng_6_xen/sys/kern/kern_sx.c Mon Dec 29 00:55:33 2008 (r186549) @@ -108,12 +108,17 @@ CTASSERT(((SX_ADAPTIVESPIN | SX_RECURSE) static void db_show_sx(struct lock_object *lock); #endif +static void lock_sx(struct lock_object *lock, int how); +static int unlock_sx(struct lock_object *lock); + struct lock_class lock_class_sx = { .lc_name = "sx", .lc_flags = LC_SLEEPLOCK | LC_SLEEPABLE | LC_RECURSABLE | LC_UPGRADABLE, #ifdef DDB .lc_ddb_show = db_show_sx, #endif + .lc_lock = lock_sx, + .lc_unlock = unlock_sx, }; #ifndef INVARIANTS @@ -121,6 +126,34 @@ struct lock_class lock_class_sx = { #endif void +lock_sx(struct lock_object *lock, int how) +{ + struct sx *sx; + + sx = (struct sx *)lock; + if (how) + sx_xlock(sx); + else + sx_slock(sx); +} + +int +unlock_sx(struct lock_object *lock) +{ + struct sx *sx; + + sx = (struct sx *)lock; + sx_assert(sx, SA_LOCKED | SA_NOTRECURSED); + if (sx_xlocked(sx)) { + sx_xunlock(sx); + return (1); + } else { + sx_sunlock(sx); + return (0); + } +} + +void sx_sysinit(void *arg) { struct sx_args *sargs = arg; @@ -845,6 +878,7 @@ _sx_sunlock_hard(struct sx *sx, const ch } } +#if 0 /* * Atomically drop an sx lock while going to sleep. This is just a hack * for 6.x. In 7.0 and later this is done more cleanly. @@ -961,6 +995,7 @@ sx_sleep(void *ident, struct sx *sx, int } return (rval); } +#endif #ifdef INVARIANT_SUPPORT #ifndef INVARIANTS Modified: projects/releng_6_xen/sys/kern/kern_synch.c ============================================================================== --- projects/releng_6_xen/sys/kern/kern_synch.c Sun Dec 28 23:50:05 2008 (r186548) +++ projects/releng_6_xen/sys/kern/kern_synch.c Mon Dec 29 00:55:33 2008 (r186549) @@ -75,6 +75,7 @@ SYSINIT(synch_setup, SI_SUB_KICK_SCHEDUL int hogticks; int lbolt; +static int pause_wchan; static struct callout loadav_callout; static struct callout lbolt_callout; @@ -106,6 +107,143 @@ sleepinit(void) init_sleepqueues(); } + +/* + * General sleep call. Suspends the current thread until a wakeup is + * performed on the specified identifier. The thread will then be made + * runnable with the specified priority. Sleeps at most timo/hz seconds + * (0 means no timeout). If pri includes PCATCH flag, signals are checked + * before and after sleeping, else signals are not checked. Returns 0 if + * awakened, EWOULDBLOCK if the timeout expires. If PCATCH is set and a + * signal needs to be delivered, ERESTART is returned if the current system + * call should be restarted if possible, and EINTR is returned if the system + * call should be interrupted by the signal (return EINTR). + * + * The lock argument is unlocked before the caller is suspended, and + * re-locked before _sleep() returns. If priority includes the PDROP + * flag the lock is not re-locked before returning. + */ +int +_sleep(void *ident, struct lock_object *lock, int priority, + const char *wmesg, int timo) +{ + struct thread *td; + struct proc *p; + struct lock_class *class; + int catch, flags, lock_state, pri, rval; + WITNESS_SAVE_DECL(lock_witness); + + td = curthread; + p = td->td_proc; +#ifdef KTRACE + if (KTRPOINT(td, KTR_CSW)) + ktrcsw(1, 0); +#endif + WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, lock, + "Sleeping on \"%s\"", wmesg); + KASSERT(timo != 0 || mtx_owned(&Giant) || lock != NULL || + ident == &lbolt, ("sleeping without a lock")); + KASSERT(p != NULL, ("msleep1")); + KASSERT(ident != NULL && TD_IS_RUNNING(td), ("msleep")); + if (lock != NULL) + class = LOCK_CLASS(lock); + else + class = NULL; + + if (cold) { + /* + * During autoconfiguration, just return; + * don't run any other threads or panic below, + * in case this is the idle thread and already asleep. + * XXX: this used to do "s = splhigh(); splx(safepri); + * splx(s);" to give interrupts a chance, but there is + * no way to give interrupts a chance now. + */ + if (lock != NULL && priority & PDROP) + class->lc_unlock(lock); + return (0); + } + catch = priority & PCATCH; + rval = 0; + + /* + * If we are already on a sleep queue, then remove us from that + * sleep queue first. We have to do this to handle recursive + * sleeps. + */ + if (TD_ON_SLEEPQ(td)) + sleepq_remove(td, td->td_wchan); + + if (ident == &pause_wchan) + flags = SLEEPQ_PAUSE; + else + flags = SLEEPQ_SLEEP; + if (catch) + flags |= SLEEPQ_INTERRUPTIBLE; + + sleepq_lock(ident); + CTR5(KTR_PROC, "sleep: thread %ld (pid %ld, %s) on %s (%p)", + td->td_tid, p->p_pid, p->p_comm, wmesg, ident); + + DROP_GIANT(); + if (lock != NULL && !(class->lc_flags & LC_SLEEPABLE)) { + WITNESS_SAVE(lock, lock_witness); + lock_state = class->lc_unlock(lock); + } else + /* GCC needs to follow the Yellow Brick Road */ + lock_state = -1; + + /* + * We put ourselves on the sleep queue and start our timeout + * before calling thread_suspend_check, as we could stop there, + * and a wakeup or a SIGCONT (or both) could occur while we were + * stopped without resuming us. Thus, we must be ready for sleep + * when cursig() is called. If the wakeup happens while we're + * stopped, then td will no longer be on a sleep queue upon + * return from cursig(). + */ + sleepq_add(ident, ident == &lbolt ? NULL : lock, wmesg, flags, 0); + if (timo) + sleepq_set_timeout(ident, timo); + if (lock != NULL && class->lc_flags & LC_SLEEPABLE) { + sleepq_release(ident); + WITNESS_SAVE(lock, lock_witness); + lock_state = class->lc_unlock(lock); + sleepq_lock(ident); + } + + /* + * Adjust this thread's priority, if necessary. + */ + pri = priority & PRIMASK; + if (pri != 0 && pri != td->td_priority) { + mtx_lock_spin(&sched_lock); + sched_prio(td, pri); + mtx_unlock_spin(&sched_lock); + } + + if (timo && catch) + rval = sleepq_timedwait_sig(ident); + else if (timo) + rval = sleepq_timedwait(ident); + else if (catch) + rval = sleepq_wait_sig(ident); + else { + sleepq_wait(ident); + rval = 0; + } +#ifdef KTRACE + if (KTRPOINT(td, KTR_CSW)) + ktrcsw(0, 0); +#endif + PICKUP_GIANT(); + if (lock != NULL && !(priority & PDROP)) { + class->lc_lock(lock, lock_state); + WITNESS_RESTORE(lock, lock_witness); + } + return (rval); +} + /* * General sleep call. Suspends the current process until a wakeup is * performed on the specified identifier. The process will then be made @@ -170,7 +308,7 @@ msleep(ident, mtx, priority, wmesg, timo if (TD_ON_SLEEPQ(td)) sleepq_remove(td, td->td_wchan); - flags = SLEEPQ_MSLEEP; + flags = SLEEPQ_SLEEP; if (catch) flags |= SLEEPQ_INTERRUPTIBLE; @@ -271,7 +409,7 @@ msleep_spin(ident, mtx, wmesg, timo) /* * We put ourselves on the sleep queue and start our timeout. */ - sleepq_add(ident, &mtx->mtx_object, wmesg, SLEEPQ_MSLEEP, 0); + sleepq_add(ident, &mtx->mtx_object, wmesg, SLEEPQ_SLEEP, 0); if (timo) sleepq_set_timeout(ident, timo); @@ -320,7 +458,7 @@ wakeup(ident) { sleepq_lock(ident); - sleepq_broadcast(ident, SLEEPQ_MSLEEP, -1, 0); + sleepq_broadcast(ident, SLEEPQ_SLEEP, -1, 0); } /* @@ -334,7 +472,7 @@ wakeup_one(ident) { sleepq_lock(ident); - sleepq_signal(ident, SLEEPQ_MSLEEP, -1, 0); + sleepq_signal(ident, SLEEPQ_SLEEP, -1, 0); } /* Modified: projects/releng_6_xen/sys/kern/kern_timeout.c ============================================================================== --- projects/releng_6_xen/sys/kern/kern_timeout.c Sun Dec 28 23:50:05 2008 (r186548) +++ projects/releng_6_xen/sys/kern/kern_timeout.c Mon Dec 29 00:55:33 2008 (r186549) @@ -557,7 +557,7 @@ again: mtx_unlock_spin(&callout_lock); sleepq_add(&callout_wait, &callout_lock.mtx_object, "codrain", - SLEEPQ_MSLEEP, 0); + SLEEPQ_SLEEP, 0); sleepq_wait(&callout_wait); sq_locked = 0; Modified: projects/releng_6_xen/sys/sys/lock.h ============================================================================== --- projects/releng_6_xen/sys/sys/lock.h Sun Dec 28 23:50:05 2008 (r186548) +++ projects/releng_6_xen/sys/sys/lock.h Mon Dec 29 00:55:33 2008 (r186549) @@ -51,6 +51,8 @@ struct lock_class { const char *lc_name; u_int lc_flags; void (*lc_ddb_show)(struct lock_object *lock); + void (*lc_lock)(struct lock_object *lock, int how); + int (*lc_unlock)(struct lock_object *lock); }; #define LC_SLEEPLOCK 0x00000001 /* Sleep lock. */ Modified: projects/releng_6_xen/sys/sys/sleepqueue.h ============================================================================== --- projects/releng_6_xen/sys/sys/sleepqueue.h Sun Dec 28 23:50:05 2008 (r186548) +++ projects/releng_6_xen/sys/sys/sleepqueue.h Mon Dec 29 00:55:33 2008 (r186549) @@ -83,11 +83,13 @@ struct thread; #ifdef _KERNEL #define SLEEPQ_TYPE 0x0ff /* Mask of sleep queue types. */ -#define SLEEPQ_MSLEEP 0x00 /* Used by msleep/wakeup. */ +#define SLEEPQ_SLEEP 0x00 /* Used by msleep/wakeup. */ #define SLEEPQ_CONDVAR 0x01 /* Used for a cv. */ +#define SLEEPQ_PAUSE 0x02 /* Used by pause. */ #define SLEEPQ_SX 0x03 /* Used by an sx lock. */ #define SLEEPQ_INTERRUPTIBLE 0x100 /* Sleep is interruptible. */ + void init_sleepqueues(void); void sleepq_abort(struct thread *td, int intrval); void sleepq_add(void *, struct lock_object *, const char *, int, int); Modified: projects/releng_6_xen/sys/sys/sx.h ============================================================================== --- projects/releng_6_xen/sys/sys/sx.h Sun Dec 28 23:50:05 2008 (r186548) +++ projects/releng_6_xen/sys/sys/sx.h Mon Dec 29 00:55:33 2008 (r186549) @@ -257,6 +257,9 @@ __sx_sunlock(struct sx *sx, const char * sx_sunlock(sx); \ } while (0) +#define sx_sleep(chan, sx, pri, wmesg, timo) \ + _sleep((chan), &(sx)->lock_object, (pri), (wmesg), (timo)) + /* * Options passed to sx_init_flags(). */ Modified: projects/releng_6_xen/sys/sys/systm.h ============================================================================== --- projects/releng_6_xen/sys/sys/systm.h Sun Dec 28 23:50:05 2008 (r186548) +++ projects/releng_6_xen/sys/sys/systm.h Mon Dec 29 00:55:33 2008 (r186549) @@ -113,6 +113,7 @@ extern char **kenvp; * General function declarations. */ +struct lock_object; struct clockframe; struct malloc_type; struct mtx; @@ -295,6 +296,8 @@ static __inline void splx(intrmask_t ip * Common `proc' functions are declared here so that proc.h can be included * less often. */ +int _sleep(void *chan, struct lock_object *lock, int pri, const char *wmesg, + int timo) __nonnull(1); int msleep(void *chan, struct mtx *mtx, int pri, const char *wmesg, int timo); int msleep_spin(void *chan, struct mtx *mtx, const char *wmesg, int timo); From owner-svn-src-projects@FreeBSD.ORG Mon Dec 29 01:35:58 2008 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 11F421065670; Mon, 29 Dec 2008 01:35:58 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 021F28FC08; Mon, 29 Dec 2008 01:35:58 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id mBT1ZvBA035957; Mon, 29 Dec 2008 01:35:57 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id mBT1Zvn6035937; Mon, 29 Dec 2008 01:35:57 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200812290135.mBT1Zvn6035937@svn.freebsd.org> From: Kip Macy Date: Mon, 29 Dec 2008 01:35:57 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r186553 - in projects/releng_6_xen/sys: conf dev/xen/blkfront dev/xen/console dev/xen/evtchn dev/xen/netfront i386/i386 i386/include/xen i386/isa i386/xen sys xen xen/evtchn xen/interfa... X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 29 Dec 2008 01:35:58 -0000 Author: kmacy Date: Mon Dec 29 01:35:56 2008 New Revision: 186553 URL: http://svn.freebsd.org/changeset/base/186553 Log: Integrate 186535 from releng_7_xen - merge in latest xenbus from dfr's xenhvm - fix race condition in xs_read_reply by converting tsleep to mtx_sleep Added: projects/releng_6_xen/sys/xen/evtchn.h (contents, props changed) projects/releng_6_xen/sys/xen/hypervisor.h (contents, props changed) projects/releng_6_xen/sys/xen/xen_intr.h (contents, props changed) Modified: projects/releng_6_xen/sys/conf/kern.pre.mk projects/releng_6_xen/sys/dev/xen/blkfront/blkfront.c projects/releng_6_xen/sys/dev/xen/console/console.c projects/releng_6_xen/sys/dev/xen/console/xencons_ring.c projects/releng_6_xen/sys/dev/xen/evtchn/evtchn_dev.c projects/releng_6_xen/sys/dev/xen/netfront/netfront.c projects/releng_6_xen/sys/i386/i386/genassym.c projects/releng_6_xen/sys/i386/i386/machdep.c projects/releng_6_xen/sys/i386/i386/vm_machdep.c projects/releng_6_xen/sys/i386/include/xen/xenfunc.h projects/releng_6_xen/sys/i386/isa/npx.c projects/releng_6_xen/sys/i386/xen/clock.c projects/releng_6_xen/sys/i386/xen/mp_machdep.c projects/releng_6_xen/sys/i386/xen/mptable.c projects/releng_6_xen/sys/i386/xen/pmap.c projects/releng_6_xen/sys/i386/xen/xen_bus.c projects/releng_6_xen/sys/i386/xen/xen_machdep.c projects/releng_6_xen/sys/sys/mutex.h projects/releng_6_xen/sys/xen/evtchn/evtchn.c projects/releng_6_xen/sys/xen/evtchn/evtchn_dev.c projects/releng_6_xen/sys/xen/features.c projects/releng_6_xen/sys/xen/gnttab.c projects/releng_6_xen/sys/xen/gnttab.h projects/releng_6_xen/sys/xen/interface/arch-x86/xen.h projects/releng_6_xen/sys/xen/xenbus/xenbus_client.c projects/releng_6_xen/sys/xen/xenbus/xenbus_comms.c projects/releng_6_xen/sys/xen/xenbus/xenbus_comms.h projects/releng_6_xen/sys/xen/xenbus/xenbus_dev.c projects/releng_6_xen/sys/xen/xenbus/xenbus_probe.c projects/releng_6_xen/sys/xen/xenbus/xenbus_probe_backend.c projects/releng_6_xen/sys/xen/xenbus/xenbus_xs.c projects/releng_6_xen/sys/xen/xenbus/xenbusvar.h Modified: projects/releng_6_xen/sys/conf/kern.pre.mk ============================================================================== --- projects/releng_6_xen/sys/conf/kern.pre.mk Mon Dec 29 01:09:40 2008 (r186552) +++ projects/releng_6_xen/sys/conf/kern.pre.mk Mon Dec 29 01:35:56 2008 (r186553) @@ -70,7 +70,7 @@ INCLUDES+= -I$S/dev/twa # .. and the same for em INCLUDES+= -I$S/dev/em -INCLUDES+= -I$S/xen/interface -I$S/xen/interface/io +INCLUDES+= -I$S/xen/interface -I$S/xen/interface/io -I$S/xen/interface/hvm CFLAGS= ${COPTFLAGS} ${CWARNFLAGS} ${DEBUG} Modified: projects/releng_6_xen/sys/dev/xen/blkfront/blkfront.c ============================================================================== --- projects/releng_6_xen/sys/dev/xen/blkfront/blkfront.c Mon Dec 29 01:09:40 2008 (r186552) +++ projects/releng_6_xen/sys/dev/xen/blkfront/blkfront.c Mon Dec 29 01:35:56 2008 (r186553) @@ -40,10 +40,10 @@ __FBSDID("$FreeBSD$"); #include #include -#include +#include #include -#include -#include +#include +#include #include #include #include @@ -214,7 +214,7 @@ xlvbd_add(device_t dev, blkif_sector_t c struct xb_softc *sc; int unit, error = 0; const char *name; - + blkfront_vdevice_to_unit(vdevice, &unit, &name); sc = (struct xb_softc *)malloc(sizeof(*sc), M_DEVBUF, M_WAITOK|M_ZERO); @@ -227,12 +227,12 @@ xlvbd_add(device_t dev, blkif_sector_t c memset(&sc->xb_disk, 0, sizeof(sc->xb_disk)); sc->xb_disk = disk_alloc(); - sc->xb_disk->d_unit = unit; + sc->xb_disk->d_unit = sc->xb_unit; sc->xb_disk->d_open = blkif_open; sc->xb_disk->d_close = blkif_close; sc->xb_disk->d_ioctl = blkif_ioctl; sc->xb_disk->d_strategy = xb_strategy; - sc->xb_disk->d_name = "xbd"; + sc->xb_disk->d_name = name; sc->xb_disk->d_drv1 = sc; sc->xb_disk->d_sectorsize = sector_size; @@ -329,8 +329,8 @@ blkfront_attach(device_t dev) /* FIXME: Use dynamic device id if this is not set. */ err = xenbus_scanf(XBT_NIL, xenbus_get_node(dev), - "virtual-device", "%i", &vdevice); - if (err != 1) { + "virtual-device", NULL, "%i", &vdevice); + if (err) { xenbus_dev_fatal(dev, err, "reading virtual-device"); printf("couldn't find virtual device"); return (err); @@ -363,9 +363,8 @@ blkfront_attach(device_t dev) info->handle = strtoul(strrchr(xenbus_get_node(dev),'/')+1, NULL, 0); err = talk_to_backend(dev, info); - if (err) { - return err; - } + if (err) + return (err); return (0); } @@ -381,7 +380,8 @@ blkfront_resume(device_t dev) blkif_free(info, 1); err = talk_to_backend(dev, info); - if (!err) + + if (info->connected == BLKIF_STATE_SUSPENDED && !err) blkif_recover(info); return err; @@ -427,7 +427,7 @@ talk_to_backend(device_t dev, struct blk } err = xenbus_transaction_end(xbt, 0); if (err) { - if (err == -EAGAIN) + if (err == EAGAIN) goto again; xenbus_dev_fatal(dev, err, "completing transaction"); goto destroy_blkring; @@ -450,7 +450,7 @@ static int setup_blkring(device_t dev, struct blkfront_info *info) { blkif_sring_t *sring; - int err; + int error; info->ring_ref = GRANT_INVALID_REF; @@ -462,28 +462,27 @@ setup_blkring(device_t dev, struct blkfr SHARED_RING_INIT(sring); FRONT_RING_INIT(&info->ring, sring, PAGE_SIZE); - err = xenbus_grant_ring(dev, (vtomach(info->ring.sring) >> PAGE_SHIFT)); - if (err < 0) { + error = xenbus_grant_ring(dev, (vtomach(info->ring.sring) >> PAGE_SHIFT), + &info->ring_ref); + if (error) { free(sring, M_DEVBUF); info->ring.sring = NULL; goto fail; } - info->ring_ref = err; - err = bind_listening_port_to_irqhandler(xenbus_get_otherend_id(dev), + error = bind_listening_port_to_irqhandler(xenbus_get_otherend_id(dev), "xbd", (driver_intr_t *)blkif_int, info, - INTR_TYPE_BIO | INTR_MPSAFE, NULL); - if (err <= 0) { - xenbus_dev_fatal(dev, err, + INTR_TYPE_BIO | INTR_MPSAFE, &info->irq); + if (error) { + xenbus_dev_fatal(dev, error, "bind_evtchn_to_irqhandler failed"); goto fail; } - info->irq = err; - return 0; + return (0); fail: blkif_free(info, 0); - return err; + return (error); } @@ -999,7 +998,7 @@ blkif_free(struct blkfront_info *info, i info->ring.sring = NULL; } if (info->irq) - unbind_from_irqhandler(info->irq, info); + unbind_from_irqhandler(info->irq); info->irq = 0; } Modified: projects/releng_6_xen/sys/dev/xen/console/console.c ============================================================================== --- projects/releng_6_xen/sys/dev/xen/console/console.c Mon Dec 29 01:09:40 2008 (r186552) +++ projects/releng_6_xen/sys/dev/xen/console/console.c Mon Dec 29 01:35:56 2008 (r186553) @@ -15,8 +15,8 @@ #include #include #include -#include -#include +#include +#include #include #include @@ -76,17 +76,17 @@ static unsigned int wc, wp; /* write_con #define XCUNIT(x) (minor(x)) #define ISTTYOPEN(tp) ((tp) && ((tp)->t_state & TS_ISOPEN)) #define CN_LOCK_INIT(x, _name) \ - mtx_init(&x, _name, NULL, MTX_SPIN|MTX_RECURSE) + mtx_init(&x, _name, NULL, MTX_DEF|MTX_RECURSE) #define CN_LOCK(l) \ do { \ if (panicstr == NULL) \ - mtx_lock_spin(&(l)); \ + mtx_lock(&(l)); \ } while (0) #define CN_UNLOCK(l) \ do { \ if (panicstr == NULL) \ - mtx_unlock_spin(&(l)); \ + mtx_unlock(&(l)); \ } while (0) #define CN_LOCK_ASSERT(x) mtx_assert(&x, MA_OWNED) #define CN_LOCK_DESTROY(x) mtx_destroy(&x) @@ -233,6 +233,7 @@ xc_probe(device_t dev) static int xc_attach(device_t dev) { + int error; struct xc_softc *sc = (struct xc_softc *)device_get_softc(dev); @@ -259,13 +260,14 @@ xc_attach(device_t dev) callout_reset(&xc_callout, XC_POLLTIME, xc_timeout, xccons); if (xen_start_info->flags & SIF_INITDOMAIN) { - PANIC_IF(bind_virq_to_irqhandler( + error = bind_virq_to_irqhandler( VIRQ_CONSOLE, 0, "console", xencons_priv_interrupt, - INTR_TYPE_TTY) < 0); + INTR_TYPE_TTY, NULL); + KASSERT(error >= 0, ("can't register console interrupt")); } Modified: projects/releng_6_xen/sys/dev/xen/console/xencons_ring.c ============================================================================== --- projects/releng_6_xen/sys/dev/xen/console/xencons_ring.c Mon Dec 29 01:09:40 2008 (r186552) +++ projects/releng_6_xen/sys/dev/xen/console/xencons_ring.c Mon Dec 29 01:35:56 2008 (r186553) @@ -15,19 +15,20 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include -#include +#include +#include #include #include -#include +#include #include #define console_evtchn console.domU.evtchn extern char *console_page; - +extern struct mtx cn_mtx; + static inline struct xencons_interface * xencons_interface(void) { @@ -82,6 +83,7 @@ xencons_handle_input(void *unused) struct xencons_interface *intf; XENCONS_RING_IDX cons, prod; + mtx_lock(&cn_mtx); intf = xencons_interface(); cons = intf->in_cons; @@ -99,6 +101,7 @@ xencons_handle_input(void *unused) notify_remote_via_evtchn(xen_start_info->console_evtchn); xencons_tx(); + mtx_unlock(&cn_mtx); } void Modified: projects/releng_6_xen/sys/dev/xen/evtchn/evtchn_dev.c ============================================================================== --- projects/releng_6_xen/sys/dev/xen/evtchn/evtchn_dev.c Mon Dec 29 01:09:40 2008 (r186552) +++ projects/releng_6_xen/sys/dev/xen/evtchn/evtchn_dev.c Mon Dec 29 01:35:56 2008 (r186553) @@ -26,13 +26,13 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include +#include #include #include #include #include -#include +#include typedef struct evtchn_sotfc { Modified: projects/releng_6_xen/sys/dev/xen/netfront/netfront.c ============================================================================== --- projects/releng_6_xen/sys/dev/xen/netfront/netfront.c Mon Dec 29 01:09:40 2008 (r186552) +++ projects/releng_6_xen/sys/dev/xen/netfront/netfront.c Mon Dec 29 01:35:56 2008 (r186553) @@ -63,9 +63,9 @@ __FBSDID("$FreeBSD$"); #include #include -#include -#include -#include +#include +#include +#include #include #include #include @@ -364,24 +364,25 @@ makembuf (struct mbuf *buf) static int xen_net_read_mac(device_t dev, uint8_t mac[]) { - char *s; - int i; - char *e; - char *macstr = xenbus_read(XBT_NIL, xenbus_get_node(dev), "mac", NULL); - if (IS_ERR(macstr)) { - return PTR_ERR(macstr); - } + int error, i; + char *s, *e, *macstr; + + error = xenbus_read(XBT_NIL, xenbus_get_node(dev), "mac", NULL, + (void **) &macstr); + if (error) + return (error); + s = macstr; for (i = 0; i < ETHER_ADDR_LEN; i++) { mac[i] = strtoul(s, &e, 16); if (s == e || (e[0] != ':' && e[0] != 0)) { free(macstr, M_DEVBUF); - return ENOENT; + return (ENOENT); } s = &e[1]; } free(macstr, M_DEVBUF); - return 0; + return (0); } /** @@ -423,13 +424,11 @@ netfront_attach(device_t dev) * leave the device-layer structures intact so that this is transparent to the * rest of the kernel. */ -static int +static int netfront_resume(device_t dev) { struct netfront_info *info = device_get_softc(dev); - - DPRINTK("%s\n", xenbus_get_node(dev)); - + netif_disconnect_backend(info); return (0); } @@ -533,7 +532,7 @@ setup_device(device_t dev, struct netfro { netif_tx_sring_t *txs; netif_rx_sring_t *rxs; - int err; + int error; struct ifnet *ifp; ifp = info->xn_ifp; @@ -546,51 +545,45 @@ setup_device(device_t dev, struct netfro txs = (netif_tx_sring_t *)malloc(PAGE_SIZE, M_DEVBUF, M_NOWAIT|M_ZERO); if (!txs) { - err = ENOMEM; - xenbus_dev_fatal(dev, err, "allocating tx ring page"); + error = ENOMEM; + xenbus_dev_fatal(dev, error, "allocating tx ring page"); goto fail; } SHARED_RING_INIT(txs); FRONT_RING_INIT(&info->tx, txs, PAGE_SIZE); - err = xenbus_grant_ring(dev, virt_to_mfn(txs)); - if (err < 0) + error = xenbus_grant_ring(dev, virt_to_mfn(txs), &info->tx_ring_ref); + if (error) goto fail; - info->tx_ring_ref = err; rxs = (netif_rx_sring_t *)malloc(PAGE_SIZE, M_DEVBUF, M_NOWAIT|M_ZERO); if (!rxs) { - err = ENOMEM; - xenbus_dev_fatal(dev, err, "allocating rx ring page"); + error = ENOMEM; + xenbus_dev_fatal(dev, error, "allocating rx ring page"); goto fail; } SHARED_RING_INIT(rxs); FRONT_RING_INIT(&info->rx, rxs, PAGE_SIZE); - err = xenbus_grant_ring(dev, virt_to_mfn(rxs)); - if (err < 0) + error = xenbus_grant_ring(dev, virt_to_mfn(rxs), &info->rx_ring_ref); + if (error) goto fail; - info->rx_ring_ref = err; -#if 0 - network_connect(info); -#endif - err = bind_listening_port_to_irqhandler(xenbus_get_otherend_id(dev), - "xn", xn_intr, info, INTR_TYPE_NET | INTR_MPSAFE, NULL); + error = bind_listening_port_to_irqhandler(xenbus_get_otherend_id(dev), + "xn", xn_intr, info, INTR_TYPE_NET | INTR_MPSAFE, &info->irq); - if (err <= 0) { - xenbus_dev_fatal(dev, err, + if (error) { + xenbus_dev_fatal(dev, error, "bind_evtchn_to_irqhandler failed"); goto fail; } - info->irq = err; - + show_device(info); - return 0; + return (0); fail: netif_free(info); - return err; + return (error); } /** @@ -1224,7 +1217,7 @@ xennet_get_responses(struct netfront_inf MULTI_update_va_mapping(mcl, (u_long)vaddr, (((vm_paddr_t)mfn) << PAGE_SHIFT) | PG_RW | PG_V | PG_M | PG_A, 0); - pfn = (uint32_t)m->m_ext.ext_args; + pfn = (uintptr_t)m->m_ext.ext_args; mmu->ptr = ((vm_paddr_t)mfn << PAGE_SHIFT) | MMU_MACHPHYS_UPDATE; mmu->val = pfn; @@ -1449,9 +1442,11 @@ xn_ioctl(struct ifnet *ifp, u_long cmd, if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) xn_ifinit_locked(sc); arp_ifinit(ifp, ifa); - } else + XN_UNLOCK(sc); + } else { + XN_UNLOCK(sc); error = ether_ioctl(ifp, cmd, data); - XN_UNLOCK(sc); + } break; case SIOCSIFMTU: /* XXX can we alter the MTU on a VN ?*/ @@ -1554,18 +1549,18 @@ xn_stop(struct netfront_info *sc) int network_connect(struct netfront_info *np) { - int i, requeue_idx, err; + int i, requeue_idx, error; grant_ref_t ref; netif_rx_request_t *req; u_int feature_rx_copy, feature_rx_flip; - err = xenbus_scanf(XBT_NIL, xenbus_get_otherend_path(np->xbdev), - "feature-rx-copy", "%u", &feature_rx_copy); - if (err != 1) + error = xenbus_scanf(XBT_NIL, xenbus_get_otherend_path(np->xbdev), + "feature-rx-copy", NULL, "%u", &feature_rx_copy); + if (error) feature_rx_copy = 0; - err = xenbus_scanf(XBT_NIL, xenbus_get_otherend_path(np->xbdev), - "feature-rx-flip", "%u", &feature_rx_flip); - if (err != 1) + error = xenbus_scanf(XBT_NIL, xenbus_get_otherend_path(np->xbdev), + "feature-rx-flip", NULL, "%u", &feature_rx_flip); + if (error) feature_rx_flip = 1; /* @@ -1578,9 +1573,9 @@ network_connect(struct netfront_info *np XN_LOCK(np); /* Recovery procedure: */ - err = talk_to_backend(np->xbdev, np); - if (err) - return (err); + error = talk_to_backend(np->xbdev, np); + if (error) + return (error); /* Step 1: Reinitialise variables. */ netif_release_tx_bufs(np); @@ -1588,6 +1583,7 @@ network_connect(struct netfront_info *np /* Step 2: Rebuild the RX buffer freelist and the RX ring itself. */ for (requeue_idx = 0, i = 0; i < NET_RX_RING_SIZE; i++) { struct mbuf *m; + u_long pfn; if (np->rx_mbufs[i] == NULL) continue; @@ -1595,15 +1591,16 @@ network_connect(struct netfront_info *np m = np->rx_mbufs[requeue_idx] = xennet_get_rx_mbuf(np, i); ref = np->grant_rx_ref[requeue_idx] = xennet_get_rx_ref(np, i); req = RING_GET_REQUEST(&np->rx, requeue_idx); + pfn = vtophys(mtod(m, vm_offset_t)) >> PAGE_SHIFT; if (!np->copying_receiver) { gnttab_grant_foreign_transfer_ref(ref, xenbus_get_otherend_id(np->xbdev), - vtophys(mtod(m, vm_offset_t))); + pfn); } else { gnttab_grant_foreign_access_ref(ref, xenbus_get_otherend_id(np->xbdev), - vtophys(mtod(m, vm_offset_t)), 0); + PFNTOMFN(pfn), 0); } req->gref = ref; req->id = requeue_idx; @@ -1704,7 +1701,7 @@ create_netdev(device_t dev) ifp = np->xn_ifp = if_alloc(IFT_ETHER); ifp->if_softc = np; if_initname(ifp, "xn", device_get_unit(dev)); - ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX; + ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; ifp->if_ioctl = xn_ioctl; ifp->if_output = ether_output; ifp->if_start = xn_start; @@ -1774,11 +1771,14 @@ static void netif_free(struct netfront_i #endif } - - static void netif_disconnect_backend(struct netfront_info *info) { - xn_stop(info); + XN_RX_LOCK(info); + XN_TX_LOCK(info); + netfront_carrier_off(info); + XN_TX_UNLOCK(info); + XN_RX_UNLOCK(info); + end_access(info->tx_ring_ref, info->tx.sring); end_access(info->rx_ring_ref, info->rx.sring); info->tx_ring_ref = GRANT_INVALID_REF; @@ -1786,12 +1786,9 @@ static void netif_disconnect_backend(str info->tx.sring = NULL; info->rx.sring = NULL; -#if 0 if (info->irq) - unbind_from_irqhandler(info->irq, info->netdev); -#else - panic("FIX ME"); -#endif + unbind_from_irqhandler(info->irq); + info->irq = 0; } Modified: projects/releng_6_xen/sys/i386/i386/genassym.c ============================================================================== --- projects/releng_6_xen/sys/i386/i386/genassym.c Mon Dec 29 01:09:40 2008 (r186552) +++ projects/releng_6_xen/sys/i386/i386/genassym.c Mon Dec 29 01:35:56 2008 (r186553) @@ -229,7 +229,7 @@ ASSYM(BUS_SPACE_HANDLE_IAT, offsetof(str #endif #ifdef XEN -#include +#include ASSYM(PC_CR3, offsetof(struct pcpu, pc_cr3)); ASSYM(HYPERVISOR_VIRT_START, __HYPERVISOR_VIRT_START); #endif Modified: projects/releng_6_xen/sys/i386/i386/machdep.c ============================================================================== --- projects/releng_6_xen/sys/i386/i386/machdep.c Mon Dec 29 01:09:40 2008 (r186552) +++ projects/releng_6_xen/sys/i386/i386/machdep.c Mon Dec 29 01:35:56 2008 (r186553) @@ -143,11 +143,11 @@ uint32_t arch_i386_xbox_memsize = 0; #ifdef XEN /* XEN includes */ -#include +#include #include #include #include -#include +#include void Xhypervisor_callback(void); void failsafe_callback(void); Modified: projects/releng_6_xen/sys/i386/i386/vm_machdep.c ============================================================================== --- projects/releng_6_xen/sys/i386/i386/vm_machdep.c Mon Dec 29 01:09:40 2008 (r186552) +++ projects/releng_6_xen/sys/i386/i386/vm_machdep.c Mon Dec 29 01:35:56 2008 (r186553) @@ -90,7 +90,7 @@ __FBSDID("$FreeBSD$"); #include #ifdef XEN -#include +#include #endif #ifdef PC98 #include Modified: projects/releng_6_xen/sys/i386/include/xen/xenfunc.h ============================================================================== --- projects/releng_6_xen/sys/i386/include/xen/xenfunc.h Mon Dec 29 01:09:40 2008 (r186552) +++ projects/releng_6_xen/sys/i386/include/xen/xenfunc.h Mon Dec 29 01:35:56 2008 (r186553) @@ -31,7 +31,7 @@ #define _XEN_XENFUNC_H_ #include -#include +#include #include #include #include Modified: projects/releng_6_xen/sys/i386/isa/npx.c ============================================================================== --- projects/releng_6_xen/sys/i386/isa/npx.c Mon Dec 29 01:09:40 2008 (r186552) +++ projects/releng_6_xen/sys/i386/isa/npx.c Mon Dec 29 01:35:56 2008 (r186553) @@ -69,8 +69,9 @@ __FBSDID("$FreeBSD$"); #include #include +#include #ifdef XEN -#include +#include #endif #ifdef DEV_ISA #include Modified: projects/releng_6_xen/sys/i386/xen/clock.c ============================================================================== --- projects/releng_6_xen/sys/i386/xen/clock.c Mon Dec 29 01:09:40 2008 (r186552) +++ projects/releng_6_xen/sys/i386/xen/clock.c Mon Dec 29 01:35:56 2008 (r186553) @@ -78,11 +78,11 @@ __FBSDID("$FreeBSD$"); #include #include -#include +#include #include #include #include -#include +#include #include #include #include @@ -295,12 +295,13 @@ static struct timecounter xen_timecounte }; static void -clkintr(struct clockframe *frame) +clkintr(void *arg) { int64_t delta_cpu, delta; int cpu = smp_processor_id(); struct shadow_time_info *shadow = &per_cpu(shadow_time, cpu); - + struct clockframe *frame = (struct clockframe *)arg; + do { __get_time_values_from_xen(); @@ -840,17 +841,20 @@ static struct vcpu_set_periodic_timer xe void cpu_initclocks(void) { - int time_irq; - + unsigned int time_irq; + int error; + xen_set_periodic_tick.period_ns = NS_PER_TICK; HYPERVISOR_vcpu_op(VCPUOP_set_periodic_timer, 0, &xen_set_periodic_tick); - - if ((time_irq = bind_virq_to_irqhandler(VIRQ_TIMER, 0, "clk", - (driver_intr_t *)clkintr, INTR_TYPE_CLK | INTR_FAST)) < 0) { + + error = bind_virq_to_irqhandler(VIRQ_TIMER, 0, "clk", + clkintr, + INTR_TYPE_CLK | INTR_FAST, &time_irq); + if (error) panic("failed to register clock interrupt\n"); - } + /* should fast clock be enabled ? */ } @@ -859,18 +863,19 @@ cpu_initclocks(void) int ap_cpu_initclocks(int cpu) { - int time_irq; + unsigned int time_irq; + int error; xen_set_periodic_tick.period_ns = NS_PER_TICK; HYPERVISOR_vcpu_op(VCPUOP_set_periodic_timer, cpu, &xen_set_periodic_tick); - - if ((time_irq = bind_virq_to_irqhandler(VIRQ_TIMER, cpu, "clk", - (driver_intr_t *)clkintr, - INTR_TYPE_CLK | INTR_FAST)) < 0) { + error = bind_virq_to_irqhandler(VIRQ_TIMER, 0, "clk", + clkintr, + INTR_TYPE_CLK | INTR_FAST, &time_irq); + if (error) panic("failed to register clock interrupt\n"); - } + return (0); } Modified: projects/releng_6_xen/sys/i386/xen/mp_machdep.c ============================================================================== --- projects/releng_6_xen/sys/i386/xen/mp_machdep.c Mon Dec 29 01:09:40 2008 (r186552) +++ projects/releng_6_xen/sys/i386/xen/mp_machdep.c Mon Dec 29 01:35:56 2008 (r186553) @@ -82,9 +82,11 @@ __FBSDID("$FreeBSD$"); #include /** COUNT_XINVLTLB_HITS */ #include -#include -#include -#include +#include +#include +#include +#include +#include #include #define WARMBOOT_TARGET 0 @@ -556,7 +558,8 @@ static int xen_smp_intr_init(unsigned int cpu) { int rc; - + unsigned int irq; + per_cpu(resched_irq, cpu) = per_cpu(callfunc_irq, cpu) = -1; sprintf(resched_name[cpu], "resched%u", cpu); @@ -564,22 +567,22 @@ xen_smp_intr_init(unsigned int cpu) cpu, resched_name[cpu], smp_reschedule_interrupt, - INTR_FAST|INTR_TYPE_TTY|INTR_MPSAFE); + INTR_FAST|INTR_TYPE_TTY|INTR_MPSAFE, &irq); printf("cpu=%d irq=%d vector=%d\n", cpu, rc, RESCHEDULE_VECTOR); - per_cpu(resched_irq, cpu) = rc; + per_cpu(resched_irq, cpu) = irq; sprintf(callfunc_name[cpu], "callfunc%u", cpu); rc = bind_ipi_to_irqhandler(CALL_FUNCTION_VECTOR, cpu, callfunc_name[cpu], smp_call_function_interrupt, - INTR_FAST|INTR_TYPE_TTY|INTR_MPSAFE); + INTR_FAST|INTR_TYPE_TTY|INTR_MPSAFE, &irq); if (rc < 0) goto fail; - per_cpu(callfunc_irq, cpu) = rc; + per_cpu(callfunc_irq, cpu) = irq; printf("cpu=%d irq=%d vector=%d\n", cpu, rc, CALL_FUNCTION_VECTOR); @@ -592,9 +595,9 @@ xen_smp_intr_init(unsigned int cpu) fail: if (per_cpu(resched_irq, cpu) >= 0) - unbind_from_irqhandler(per_cpu(resched_irq, cpu), NULL); + unbind_from_irqhandler(per_cpu(resched_irq, cpu)); if (per_cpu(callfunc_irq, cpu) >= 0) - unbind_from_irqhandler(per_cpu(callfunc_irq, cpu), NULL); + unbind_from_irqhandler(per_cpu(callfunc_irq, cpu)); return rc; } Modified: projects/releng_6_xen/sys/i386/xen/mptable.c ============================================================================== --- projects/releng_6_xen/sys/i386/xen/mptable.c Mon Dec 29 01:09:40 2008 (r186552) +++ projects/releng_6_xen/sys/i386/xen/mptable.c Mon Dec 29 01:35:56 2008 (r186553) @@ -45,7 +45,7 @@ __FBSDID("$FreeBSD$"); #include #include -#include +#include #include #include #include Modified: projects/releng_6_xen/sys/i386/xen/pmap.c ============================================================================== --- projects/releng_6_xen/sys/i386/xen/pmap.c Mon Dec 29 01:09:40 2008 (r186552) +++ projects/releng_6_xen/sys/i386/xen/pmap.c Mon Dec 29 01:35:56 2008 (r186553) @@ -144,7 +144,7 @@ __FBSDID("$FreeBSD$"); #ifdef XEN #include -#include +#include #include #include #include @@ -159,6 +159,16 @@ __FBSDID("$FreeBSD$"); #include #endif +#ifdef XBOX +#include +#endif + +#include +#include +#include +#include +#include + #if !defined(CPU_DISABLE_SSE) && defined(I686_CPU) #define CPU_ENABLE_SSE #endif Modified: projects/releng_6_xen/sys/i386/xen/xen_bus.c ============================================================================== --- projects/releng_6_xen/sys/i386/xen/xen_bus.c Mon Dec 29 01:09:40 2008 (r186552) +++ projects/releng_6_xen/sys/i386/xen/xen_bus.c Mon Dec 29 01:35:56 2008 (r186553) @@ -15,8 +15,8 @@ #include #include -#include -#include +#include +#include static MALLOC_DEFINE(M_XENDEV, "xenintrdrv", "xen system device"); Modified: projects/releng_6_xen/sys/i386/xen/xen_machdep.c ============================================================================== --- projects/releng_6_xen/sys/i386/xen/xen_machdep.c Mon Dec 29 01:09:40 2008 (r186552) +++ projects/releng_6_xen/sys/i386/xen/xen_machdep.c Mon Dec 29 01:35:56 2008 (r186553) @@ -57,7 +57,7 @@ __FBSDID("$FreeBSD$"); -#include +#include #include #include #include Modified: projects/releng_6_xen/sys/sys/mutex.h ============================================================================== --- projects/releng_6_xen/sys/sys/mutex.h Mon Dec 29 01:09:40 2008 (r186552) +++ projects/releng_6_xen/sys/sys/mutex.h Mon Dec 29 01:35:56 2008 (r186553) @@ -325,6 +325,9 @@ extern struct mtx_pool *mtxpool_sleep; #define mtx_trylock_flags(m, opts) \ _mtx_trylock((m), (opts), LOCK_FILE, LOCK_LINE) +#define mtx_sleep(chan, mtx, pri, wmesg, timo) \ + _sleep((chan), &(mtx)->mtx_object, (pri), (wmesg), (timo)) + #define mtx_initialized(m) lock_initalized(&(m)->mtx_object) #define mtx_owned(m) (((m)->mtx_lock & MTX_FLAGMASK) == (uintptr_t)curthread) Added: projects/releng_6_xen/sys/xen/evtchn.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/releng_6_xen/sys/xen/evtchn.h Mon Dec 29 01:35:56 2008 (r186553) @@ -0,0 +1,188 @@ +/****************************************************************************** + * evtchn.h + * + * Communication via Xen event channels. + * Also definitions for the device that demuxes notifications to userspace. + * + * Copyright (c) 2004, K A Fraser + * + * $FreeBSD$ + */ + +#ifndef __ASM_EVTCHN_H__ +#define __ASM_EVTCHN_H__ +#include +#include +#include +#include + +/* + * LOW-LEVEL DEFINITIONS + */ + +/* + * Unlike notify_remote_via_evtchn(), this is safe to use across + * save/restore. Notifications on a broken connection are silently dropped. + */ +void notify_remote_via_irq(int irq); + + +/* Entry point for notifications into Linux subsystems. */ +void evtchn_do_upcall(struct intrframe *frame); + +/* Entry point for notifications into the userland character device. */ +void evtchn_device_upcall(int port); + +void mask_evtchn(int port); + +void unmask_evtchn(int port); + +#ifdef SMP +void rebind_evtchn_to_cpu(int port, unsigned int cpu); +#else +#define rebind_evtchn_to_cpu(port, cpu) ((void)0) +#endif + +static inline +int test_and_set_evtchn_mask(int port) +{ + shared_info_t *s = HYPERVISOR_shared_info; + return synch_test_and_set_bit(port, s->evtchn_mask); +} + +static inline void +clear_evtchn(int port) +{ + shared_info_t *s = HYPERVISOR_shared_info; + synch_clear_bit(port, &s->evtchn_pending[0]); +} + +static inline void +notify_remote_via_evtchn(int port) +{ + struct evtchn_send send = { .port = port }; + (void)HYPERVISOR_event_channel_op(EVTCHNOP_send, &send); +} + +/* + * Use these to access the event channel underlying the IRQ handle returned + * by bind_*_to_irqhandler(). + */ +int irq_to_evtchn_port(int irq); + +void ipi_pcpu(unsigned int cpu, int vector); + +/* + * CHARACTER-DEVICE DEFINITIONS + */ + +#define PORT_NORMAL 0x0000 +#define PORT_EXCEPTION 0x8000 +#define PORTIDX_MASK 0x7fff + +/* /dev/xen/evtchn resides at device number major=10, minor=200 */ +#define EVTCHN_MINOR 200 + +/* /dev/xen/evtchn ioctls: */ +/* EVTCHN_RESET: Clear and reinit the event buffer. Clear error condition. */ +#define EVTCHN_RESET _IO('E', 1) +/* EVTCHN_BIND: Bind to the specified event-channel port. */ +#define EVTCHN_BIND _IO('E', 2) +/* EVTCHN_UNBIND: Unbind from the specified event-channel port. */ +#define EVTCHN_UNBIND _IO('E', 3) + +#endif /* __ASM_EVTCHN_H__ */ +/****************************************************************************** + * evtchn.h + * + * Communication via Xen event channels. + * Also definitions for the device that demuxes notifications to userspace. + * + * Copyright (c) 2004, K A Fraser + * + * $FreeBSD$ + */ + +#ifndef __ASM_EVTCHN_H__ +#define __ASM_EVTCHN_H__ +#include +#include +#include +#include + +/* + * LOW-LEVEL DEFINITIONS + */ + +/* + * Unlike notify_remote_via_evtchn(), this is safe to use across + * save/restore. Notifications on a broken connection are silently dropped. + */ +void notify_remote_via_irq(int irq); + + +/* Entry point for notifications into Linux subsystems. */ +void evtchn_do_upcall(struct trapframe *frame); + +/* Entry point for notifications into the userland character device. */ +void evtchn_device_upcall(int port); + +void mask_evtchn(int port); + +void unmask_evtchn(int port); + +#ifdef SMP +void rebind_evtchn_to_cpu(int port, unsigned int cpu); +#else +#define rebind_evtchn_to_cpu(port, cpu) ((void)0) +#endif + +static inline +int test_and_set_evtchn_mask(int port) +{ + shared_info_t *s = HYPERVISOR_shared_info; + return synch_test_and_set_bit(port, s->evtchn_mask); +} + +static inline void +clear_evtchn(int port) +{ + shared_info_t *s = HYPERVISOR_shared_info; + synch_clear_bit(port, &s->evtchn_pending[0]); +} + +static inline void +notify_remote_via_evtchn(int port) +{ + struct evtchn_send send = { .port = port }; + (void)HYPERVISOR_event_channel_op(EVTCHNOP_send, &send); +} + +/* + * Use these to access the event channel underlying the IRQ handle returned + * by bind_*_to_irqhandler(). + */ +int irq_to_evtchn_port(int irq); + +void ipi_pcpu(unsigned int cpu, int vector); *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-src-projects@FreeBSD.ORG Mon Dec 29 01:40:10 2008 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 384791065670; Mon, 29 Dec 2008 01:40:10 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 2ADF08FC17; Mon, 29 Dec 2008 01:40:10 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id mBT1e9CA036301; Mon, 29 Dec 2008 01:40:09 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id mBT1e94f036297; Mon, 29 Dec 2008 01:40:09 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200812290140.mBT1e94f036297@svn.freebsd.org> From: Kip Macy Date: Mon, 29 Dec 2008 01:40:09 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r186554 - in projects/releng_6_xen/sys/xen: evtchn xenbus X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 29 Dec 2008 01:40:10 -0000 Author: kmacy Date: Mon Dec 29 01:40:09 2008 New Revision: 186554 URL: http://svn.freebsd.org/changeset/base/186554 Log: merge 186537 and 186538 from releng_7_xen Log: unmask evtchn in bind_{virq, ipi}_to_irq Log: - remove code for handling case of not being able to sleep - eliminate tsleep - make sleeps atomic Modified: projects/releng_6_xen/sys/xen/evtchn/evtchn.c projects/releng_6_xen/sys/xen/xenbus/xenbus_comms.c projects/releng_6_xen/sys/xen/xenbus/xenbus_comms.h projects/releng_6_xen/sys/xen/xenbus/xenbus_xs.c Modified: projects/releng_6_xen/sys/xen/evtchn/evtchn.c ============================================================================== --- projects/releng_6_xen/sys/xen/evtchn/evtchn.c Mon Dec 29 01:35:56 2008 (r186553) +++ projects/releng_6_xen/sys/xen/evtchn/evtchn.c Mon Dec 29 01:40:09 2008 (r186554) @@ -366,7 +366,7 @@ static int bind_virq_to_irq(unsigned int virq, unsigned int cpu) { struct evtchn_bind_virq bind_virq; - int evtchn, irq; + int evtchn = 0, irq; mtx_lock_spin(&irq_mapping_update_lock); @@ -390,6 +390,7 @@ bind_virq_to_irq(unsigned int virq, unsi } irq_bindcount[irq]++; + unmask_evtchn(evtchn); out: mtx_unlock_spin(&irq_mapping_update_lock); @@ -403,8 +404,9 @@ int bind_ipi_to_irq(unsigned int ipi, unsigned int cpu) { struct evtchn_bind_ipi bind_ipi; - int evtchn, irq; - + int irq; + int evtchn = 0; + mtx_lock_spin(&irq_mapping_update_lock); if ((irq = per_cpu(ipi_to_irq, cpu)[ipi]) == -1) { @@ -423,6 +425,7 @@ bind_ipi_to_irq(unsigned int ipi, unsign bind_evtchn_to_cpu(evtchn, cpu); } irq_bindcount[irq]++; + unmask_evtchn(evtchn); out: mtx_unlock_spin(&irq_mapping_update_lock); Modified: projects/releng_6_xen/sys/xen/xenbus/xenbus_comms.c ============================================================================== --- projects/releng_6_xen/sys/xen/xenbus/xenbus_comms.c Mon Dec 29 01:35:56 2008 (r186553) +++ projects/releng_6_xen/sys/xen/xenbus/xenbus_comms.c Mon Dec 29 01:40:09 2008 (r186554) @@ -36,6 +36,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -94,7 +95,7 @@ xb_get_input_chunk(XENSTORE_RING_IDX con } int -xb_write(const void *tdata, unsigned len) +xb_write(const void *tdata, unsigned len, struct lock_object *lock) { struct xenstore_domain_interface *intf = xenstore_domain_interface(); XENSTORE_RING_IDX cons, prod; @@ -107,7 +108,9 @@ xb_write(const void *tdata, unsigned len while ((intf->req_prod - intf->req_cons) == XENSTORE_RING_SIZE) { - error = tsleep(intf, PCATCH, "xbwrite", hz/10); + error = _sleep(intf, + lock, + PCATCH, "xbwrite", hz/10); if (error && error != EWOULDBLOCK) return (error); } @@ -144,7 +147,7 @@ xb_write(const void *tdata, unsigned len } int -xb_read(void *tdata, unsigned len) +xb_read(void *tdata, unsigned len, struct lock_object *lock) { struct xenstore_domain_interface *intf = xenstore_domain_interface(); XENSTORE_RING_IDX cons, prod; @@ -156,7 +159,8 @@ xb_read(void *tdata, unsigned len) const char *src; while (intf->rsp_cons == intf->rsp_prod) { - error = tsleep(intf, PCATCH, "xbread", hz/10); + error = _sleep(intf, lock, + PCATCH, "xbread", hz/10); if (error && error != EWOULDBLOCK) return (error); } Modified: projects/releng_6_xen/sys/xen/xenbus/xenbus_comms.h ============================================================================== --- projects/releng_6_xen/sys/xen/xenbus/xenbus_comms.h Mon Dec 29 01:35:56 2008 (r186553) +++ projects/releng_6_xen/sys/xen/xenbus/xenbus_comms.h Mon Dec 29 01:40:09 2008 (r186554) @@ -30,6 +30,7 @@ #ifndef _XENBUS_COMMS_H #define _XENBUS_COMMS_H +struct sx; extern int xen_store_evtchn; extern char *xen_store; @@ -37,8 +38,8 @@ int xs_init(void); int xb_init_comms(void); /* Low level routines. */ -int xb_write(const void *data, unsigned len); -int xb_read(void *data, unsigned len); +int xb_write(const void *data, unsigned len, struct lock_object *); +int xb_read(void *data, unsigned len, struct lock_object *); extern int xenbus_running; char *kasprintf(const char *fmt, ...); Modified: projects/releng_6_xen/sys/xen/xenbus/xenbus_xs.c ============================================================================== --- projects/releng_6_xen/sys/xen/xenbus/xenbus_xs.c Mon Dec 29 01:35:56 2008 (r186553) +++ projects/releng_6_xen/sys/xen/xenbus/xenbus_xs.c Mon Dec 29 01:40:09 2008 (r186554) @@ -137,33 +137,11 @@ xs_read_reply(enum xsd_sockmsg_type *typ { struct xs_stored_msg *msg; char *body; - int i, error; - - if (xenbus_running == 0) { - /* - * Give other domain time to run :-/ - */ - for (i = 0; i < 1000000 && (xenbus_running == 0); i++) { - error = xs_process_msg(type); - - if (error == 0 && *type != XS_WATCH_EVENT) - break; - - HYPERVISOR_yield(); - } - - if (TAILQ_EMPTY(&xs_state.reply_list)) { - printf("giving up and returning an error type=%d\n", - *type); - kdb_backtrace(); - return (EIO); - } - - } + int error; mtx_lock(&xs_state.reply_lock); - if (xenbus_running) { - while (TAILQ_EMPTY(&xs_state.reply_list)) { + + while (TAILQ_EMPTY(&xs_state.reply_list)) { while (TAILQ_EMPTY(&xs_state.reply_list)) { error = mtx_sleep(&xs_state.reply_waitq, &xs_state.reply_lock, @@ -177,7 +155,7 @@ xs_read_reply(enum xsd_sockmsg_type *typ } - } + msg = TAILQ_FIRST(&xs_state.reply_list); TAILQ_REMOVE(&xs_state.reply_list, msg, list); @@ -224,7 +202,7 @@ xenbus_dev_request_and_reply(struct xsd_ sx_xlock(&xs_state.request_mutex); - error = xb_write(msg, sizeof(*msg) + msg->len); + error = xb_write(msg, sizeof(*msg) + msg->len, &xs_state.request_mutex.lock_object); if (error) { msg->type = XS_ERROR; } else { @@ -241,8 +219,6 @@ xenbus_dev_request_and_reply(struct xsd_ return (error); } -static int xenwatch_inline; - /* * Send message to xs. The reply is returned in *result and should be * fred with free(*result, M_DEVBUF). Return zero on success or an @@ -267,7 +243,7 @@ xs_talkv(struct xenbus_transaction t, en sx_xlock(&xs_state.request_mutex); - error = xb_write(&msg, sizeof(msg)); + error = xb_write(&msg, sizeof(msg), &xs_state.request_mutex.lock_object); if (error) { sx_xunlock(&xs_state.request_mutex); printf("xs_talkv failed %d\n", error); @@ -275,7 +251,7 @@ xs_talkv(struct xenbus_transaction t, en } for (i = 0; i < num_vecs; i++) { - error = xb_write(iovec[i].iov_base, iovec[i].iov_len);; + error = xb_write(iovec[i].iov_base, iovec[i].iov_len, &xs_state.request_mutex.lock_object); if (error) { sx_xunlock(&xs_state.request_mutex); printf("xs_talkv failed %d\n", error); @@ -776,18 +752,15 @@ xenwatch_thread(void *unused) { struct xs_stored_msg *msg; - DELAY(100000); - while (xenwatch_inline) { - printf("xenwatch inline still running\n"); - DELAY(100000); - } - for (;;) { + mtx_lock(&watch_events_lock); while (TAILQ_EMPTY(&watch_events)) - tsleep(&watch_events_waitq, + mtx_sleep(&watch_events_waitq, + &watch_events_lock, PWAIT | PCATCH, "waitev", hz/10); - + + mtx_unlock(&watch_events_lock); sx_xlock(&xenwatch_mutex); mtx_lock(&watch_events_lock); @@ -817,16 +790,18 @@ xs_process_msg(enum xsd_sockmsg_type *ty int error; msg = malloc(sizeof(*msg), M_DEVBUF, M_WAITOK); - - error = xb_read(&msg->hdr, sizeof(msg->hdr)); + mtx_lock(&xs_state.reply_lock); + error = xb_read(&msg->hdr, sizeof(msg->hdr), &xs_state.reply_lock.mtx_object); + mtx_unlock(&xs_state.reply_lock); if (error) { free(msg, M_DEVBUF); return (error); } body = malloc(msg->hdr.len + 1, M_DEVBUF, M_WAITOK); - - error = xb_read(body, msg->hdr.len); + mtx_lock(&xs_state.reply_lock); + error = xb_read(body, msg->hdr.len, &xs_state.reply_lock.mtx_object); + mtx_unlock(&xs_state.reply_lock); if (error) { free(body, M_DEVBUF); free(msg, M_DEVBUF); @@ -869,9 +844,7 @@ xenbus_thread(void *unused) int error; enum xsd_sockmsg_type type; - DELAY(10000); xenbus_running = 1; - tsleep(&lbolt, 0, "xenbus", hz/10); for (;;) { error = xs_process_msg(&type); From owner-svn-src-projects@FreeBSD.ORG Mon Dec 29 04:36:35 2008 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 2BD0D1065670; Mon, 29 Dec 2008 04:36:35 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 1E3198FC17; Mon, 29 Dec 2008 04:36:35 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id mBT4aYRE044116; Mon, 29 Dec 2008 04:36:35 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id mBT4aYgE044096; Mon, 29 Dec 2008 04:36:34 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200812290436.mBT4aYgE044096@svn.freebsd.org> From: Kip Macy Date: Mon, 29 Dec 2008 04:36:34 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r186555 - in projects/release_6_3_xen/sys: conf dev/xen/blkfront dev/xen/console dev/xen/evtchn dev/xen/netfront i386/conf i386/i386 i386/include/xen i386/isa i386/xen sys xen xen/evtch... X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 29 Dec 2008 04:36:35 -0000 Author: kmacy Date: Mon Dec 29 04:36:33 2008 New Revision: 186555 URL: http://svn.freebsd.org/changeset/base/186555 Log: merge 186553 from releng_6_xen Log: Integrate 186535 from releng_7_xen - merge in latest xenbus from dfr's xenhvm - fix race condition in xs_read_reply by converting tsleep to mtx_sleep Added: projects/release_6_3_xen/sys/xen/evtchn.h projects/release_6_3_xen/sys/xen/hypervisor.h projects/release_6_3_xen/sys/xen/xen_intr.h Deleted: projects/release_6_3_xen/sys/i386/include/xen/evtchn.h projects/release_6_3_xen/sys/i386/include/xen/hypervisor.h projects/release_6_3_xen/sys/i386/include/xen/xen_intr.h Modified: projects/release_6_3_xen/sys/conf/kern.pre.mk projects/release_6_3_xen/sys/dev/xen/blkfront/blkfront.c projects/release_6_3_xen/sys/dev/xen/console/console.c projects/release_6_3_xen/sys/dev/xen/console/xencons_ring.c projects/release_6_3_xen/sys/dev/xen/evtchn/evtchn_dev.c projects/release_6_3_xen/sys/dev/xen/netfront/netfront.c projects/release_6_3_xen/sys/i386/conf/XEN projects/release_6_3_xen/sys/i386/i386/genassym.c projects/release_6_3_xen/sys/i386/i386/machdep.c projects/release_6_3_xen/sys/i386/i386/vm_machdep.c projects/release_6_3_xen/sys/i386/include/xen/xenfunc.h projects/release_6_3_xen/sys/i386/isa/npx.c projects/release_6_3_xen/sys/i386/xen/clock.c projects/release_6_3_xen/sys/i386/xen/mp_machdep.c projects/release_6_3_xen/sys/i386/xen/mptable.c projects/release_6_3_xen/sys/i386/xen/pmap.c projects/release_6_3_xen/sys/i386/xen/xen_bus.c projects/release_6_3_xen/sys/i386/xen/xen_machdep.c projects/release_6_3_xen/sys/sys/mutex.h projects/release_6_3_xen/sys/xen/evtchn/evtchn.c projects/release_6_3_xen/sys/xen/evtchn/evtchn_dev.c projects/release_6_3_xen/sys/xen/features.c projects/release_6_3_xen/sys/xen/gnttab.c projects/release_6_3_xen/sys/xen/gnttab.h projects/release_6_3_xen/sys/xen/interface/arch-x86/xen.h projects/release_6_3_xen/sys/xen/xenbus/xenbus_client.c projects/release_6_3_xen/sys/xen/xenbus/xenbus_comms.c projects/release_6_3_xen/sys/xen/xenbus/xenbus_comms.h projects/release_6_3_xen/sys/xen/xenbus/xenbus_dev.c projects/release_6_3_xen/sys/xen/xenbus/xenbus_probe.c projects/release_6_3_xen/sys/xen/xenbus/xenbus_probe_backend.c projects/release_6_3_xen/sys/xen/xenbus/xenbus_xs.c projects/release_6_3_xen/sys/xen/xenbus/xenbusvar.h Modified: projects/release_6_3_xen/sys/conf/kern.pre.mk ============================================================================== --- projects/release_6_3_xen/sys/conf/kern.pre.mk Mon Dec 29 01:40:09 2008 (r186554) +++ projects/release_6_3_xen/sys/conf/kern.pre.mk Mon Dec 29 04:36:33 2008 (r186555) @@ -70,7 +70,7 @@ INCLUDES+= -I$S/dev/twa # .. and the same for em INCLUDES+= -I$S/dev/em -INCLUDES+= -I$S/xen/interface -I$S/xen/interface/io +INCLUDES+= -I$S/xen/interface -I$S/xen/interface/io -I$S/xen/interface/hvm CFLAGS= ${COPTFLAGS} ${CWARNFLAGS} ${DEBUG} Modified: projects/release_6_3_xen/sys/dev/xen/blkfront/blkfront.c ============================================================================== --- projects/release_6_3_xen/sys/dev/xen/blkfront/blkfront.c Mon Dec 29 01:40:09 2008 (r186554) +++ projects/release_6_3_xen/sys/dev/xen/blkfront/blkfront.c Mon Dec 29 04:36:33 2008 (r186555) @@ -40,10 +40,10 @@ __FBSDID("$FreeBSD$"); #include #include -#include +#include #include -#include -#include +#include +#include #include #include #include @@ -214,7 +214,7 @@ xlvbd_add(device_t dev, blkif_sector_t c struct xb_softc *sc; int unit, error = 0; const char *name; - + blkfront_vdevice_to_unit(vdevice, &unit, &name); sc = (struct xb_softc *)malloc(sizeof(*sc), M_DEVBUF, M_WAITOK|M_ZERO); @@ -227,12 +227,12 @@ xlvbd_add(device_t dev, blkif_sector_t c memset(&sc->xb_disk, 0, sizeof(sc->xb_disk)); sc->xb_disk = disk_alloc(); - sc->xb_disk->d_unit = unit; + sc->xb_disk->d_unit = sc->xb_unit; sc->xb_disk->d_open = blkif_open; sc->xb_disk->d_close = blkif_close; sc->xb_disk->d_ioctl = blkif_ioctl; sc->xb_disk->d_strategy = xb_strategy; - sc->xb_disk->d_name = "xbd"; + sc->xb_disk->d_name = name; sc->xb_disk->d_drv1 = sc; sc->xb_disk->d_sectorsize = sector_size; @@ -329,8 +329,8 @@ blkfront_attach(device_t dev) /* FIXME: Use dynamic device id if this is not set. */ err = xenbus_scanf(XBT_NIL, xenbus_get_node(dev), - "virtual-device", "%i", &vdevice); - if (err != 1) { + "virtual-device", NULL, "%i", &vdevice); + if (err) { xenbus_dev_fatal(dev, err, "reading virtual-device"); printf("couldn't find virtual device"); return (err); @@ -363,9 +363,8 @@ blkfront_attach(device_t dev) info->handle = strtoul(strrchr(xenbus_get_node(dev),'/')+1, NULL, 0); err = talk_to_backend(dev, info); - if (err) { - return err; - } + if (err) + return (err); return (0); } @@ -381,7 +380,8 @@ blkfront_resume(device_t dev) blkif_free(info, 1); err = talk_to_backend(dev, info); - if (!err) + + if (info->connected == BLKIF_STATE_SUSPENDED && !err) blkif_recover(info); return err; @@ -427,7 +427,7 @@ talk_to_backend(device_t dev, struct blk } err = xenbus_transaction_end(xbt, 0); if (err) { - if (err == -EAGAIN) + if (err == EAGAIN) goto again; xenbus_dev_fatal(dev, err, "completing transaction"); goto destroy_blkring; @@ -450,7 +450,7 @@ static int setup_blkring(device_t dev, struct blkfront_info *info) { blkif_sring_t *sring; - int err; + int error; info->ring_ref = GRANT_INVALID_REF; @@ -462,28 +462,27 @@ setup_blkring(device_t dev, struct blkfr SHARED_RING_INIT(sring); FRONT_RING_INIT(&info->ring, sring, PAGE_SIZE); - err = xenbus_grant_ring(dev, (vtomach(info->ring.sring) >> PAGE_SHIFT)); - if (err < 0) { + error = xenbus_grant_ring(dev, (vtomach(info->ring.sring) >> PAGE_SHIFT), + &info->ring_ref); + if (error) { free(sring, M_DEVBUF); info->ring.sring = NULL; goto fail; } - info->ring_ref = err; - err = bind_listening_port_to_irqhandler(xenbus_get_otherend_id(dev), + error = bind_listening_port_to_irqhandler(xenbus_get_otherend_id(dev), "xbd", (driver_intr_t *)blkif_int, info, - INTR_TYPE_BIO | INTR_MPSAFE, NULL); - if (err <= 0) { - xenbus_dev_fatal(dev, err, + INTR_TYPE_BIO | INTR_MPSAFE, &info->irq); + if (error) { + xenbus_dev_fatal(dev, error, "bind_evtchn_to_irqhandler failed"); goto fail; } - info->irq = err; - return 0; + return (0); fail: blkif_free(info, 0); - return err; + return (error); } @@ -999,7 +998,7 @@ blkif_free(struct blkfront_info *info, i info->ring.sring = NULL; } if (info->irq) - unbind_from_irqhandler(info->irq, info); + unbind_from_irqhandler(info->irq); info->irq = 0; } Modified: projects/release_6_3_xen/sys/dev/xen/console/console.c ============================================================================== --- projects/release_6_3_xen/sys/dev/xen/console/console.c Mon Dec 29 01:40:09 2008 (r186554) +++ projects/release_6_3_xen/sys/dev/xen/console/console.c Mon Dec 29 04:36:33 2008 (r186555) @@ -15,8 +15,8 @@ #include #include #include -#include -#include +#include +#include #include #include @@ -76,17 +76,17 @@ static unsigned int wc, wp; /* write_con #define XCUNIT(x) (minor(x)) #define ISTTYOPEN(tp) ((tp) && ((tp)->t_state & TS_ISOPEN)) #define CN_LOCK_INIT(x, _name) \ - mtx_init(&x, _name, NULL, MTX_SPIN|MTX_RECURSE) + mtx_init(&x, _name, NULL, MTX_DEF|MTX_RECURSE) #define CN_LOCK(l) \ do { \ if (panicstr == NULL) \ - mtx_lock_spin(&(l)); \ + mtx_lock(&(l)); \ } while (0) #define CN_UNLOCK(l) \ do { \ if (panicstr == NULL) \ - mtx_unlock_spin(&(l)); \ + mtx_unlock(&(l)); \ } while (0) #define CN_LOCK_ASSERT(x) mtx_assert(&x, MA_OWNED) #define CN_LOCK_DESTROY(x) mtx_destroy(&x) @@ -233,6 +233,7 @@ xc_probe(device_t dev) static int xc_attach(device_t dev) { + int error; struct xc_softc *sc = (struct xc_softc *)device_get_softc(dev); @@ -259,13 +260,14 @@ xc_attach(device_t dev) callout_reset(&xc_callout, XC_POLLTIME, xc_timeout, xccons); if (xen_start_info->flags & SIF_INITDOMAIN) { - PANIC_IF(bind_virq_to_irqhandler( + error = bind_virq_to_irqhandler( VIRQ_CONSOLE, 0, "console", xencons_priv_interrupt, - INTR_TYPE_TTY) < 0); + INTR_TYPE_TTY, NULL); + KASSERT(error >= 0, ("can't register console interrupt")); } Modified: projects/release_6_3_xen/sys/dev/xen/console/xencons_ring.c ============================================================================== --- projects/release_6_3_xen/sys/dev/xen/console/xencons_ring.c Mon Dec 29 01:40:09 2008 (r186554) +++ projects/release_6_3_xen/sys/dev/xen/console/xencons_ring.c Mon Dec 29 04:36:33 2008 (r186555) @@ -15,19 +15,20 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include -#include +#include +#include #include #include -#include +#include #include #define console_evtchn console.domU.evtchn extern char *console_page; - +extern struct mtx cn_mtx; + static inline struct xencons_interface * xencons_interface(void) { @@ -82,6 +83,7 @@ xencons_handle_input(void *unused) struct xencons_interface *intf; XENCONS_RING_IDX cons, prod; + mtx_lock(&cn_mtx); intf = xencons_interface(); cons = intf->in_cons; @@ -99,6 +101,7 @@ xencons_handle_input(void *unused) notify_remote_via_evtchn(xen_start_info->console_evtchn); xencons_tx(); + mtx_unlock(&cn_mtx); } void Modified: projects/release_6_3_xen/sys/dev/xen/evtchn/evtchn_dev.c ============================================================================== --- projects/release_6_3_xen/sys/dev/xen/evtchn/evtchn_dev.c Mon Dec 29 01:40:09 2008 (r186554) +++ projects/release_6_3_xen/sys/dev/xen/evtchn/evtchn_dev.c Mon Dec 29 04:36:33 2008 (r186555) @@ -26,13 +26,13 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include +#include #include #include #include #include -#include +#include typedef struct evtchn_sotfc { Modified: projects/release_6_3_xen/sys/dev/xen/netfront/netfront.c ============================================================================== --- projects/release_6_3_xen/sys/dev/xen/netfront/netfront.c Mon Dec 29 01:40:09 2008 (r186554) +++ projects/release_6_3_xen/sys/dev/xen/netfront/netfront.c Mon Dec 29 04:36:33 2008 (r186555) @@ -63,9 +63,9 @@ __FBSDID("$FreeBSD$"); #include #include -#include -#include -#include +#include +#include +#include #include #include #include @@ -364,24 +364,25 @@ makembuf (struct mbuf *buf) static int xen_net_read_mac(device_t dev, uint8_t mac[]) { - char *s; - int i; - char *e; - char *macstr = xenbus_read(XBT_NIL, xenbus_get_node(dev), "mac", NULL); - if (IS_ERR(macstr)) { - return PTR_ERR(macstr); - } + int error, i; + char *s, *e, *macstr; + + error = xenbus_read(XBT_NIL, xenbus_get_node(dev), "mac", NULL, + (void **) &macstr); + if (error) + return (error); + s = macstr; for (i = 0; i < ETHER_ADDR_LEN; i++) { mac[i] = strtoul(s, &e, 16); if (s == e || (e[0] != ':' && e[0] != 0)) { free(macstr, M_DEVBUF); - return ENOENT; + return (ENOENT); } s = &e[1]; } free(macstr, M_DEVBUF); - return 0; + return (0); } /** @@ -423,13 +424,11 @@ netfront_attach(device_t dev) * leave the device-layer structures intact so that this is transparent to the * rest of the kernel. */ -static int +static int netfront_resume(device_t dev) { struct netfront_info *info = device_get_softc(dev); - - DPRINTK("%s\n", xenbus_get_node(dev)); - + netif_disconnect_backend(info); return (0); } @@ -533,7 +532,7 @@ setup_device(device_t dev, struct netfro { netif_tx_sring_t *txs; netif_rx_sring_t *rxs; - int err; + int error; struct ifnet *ifp; ifp = info->xn_ifp; @@ -546,51 +545,45 @@ setup_device(device_t dev, struct netfro txs = (netif_tx_sring_t *)malloc(PAGE_SIZE, M_DEVBUF, M_NOWAIT|M_ZERO); if (!txs) { - err = ENOMEM; - xenbus_dev_fatal(dev, err, "allocating tx ring page"); + error = ENOMEM; + xenbus_dev_fatal(dev, error, "allocating tx ring page"); goto fail; } SHARED_RING_INIT(txs); FRONT_RING_INIT(&info->tx, txs, PAGE_SIZE); - err = xenbus_grant_ring(dev, virt_to_mfn(txs)); - if (err < 0) + error = xenbus_grant_ring(dev, virt_to_mfn(txs), &info->tx_ring_ref); + if (error) goto fail; - info->tx_ring_ref = err; rxs = (netif_rx_sring_t *)malloc(PAGE_SIZE, M_DEVBUF, M_NOWAIT|M_ZERO); if (!rxs) { - err = ENOMEM; - xenbus_dev_fatal(dev, err, "allocating rx ring page"); + error = ENOMEM; + xenbus_dev_fatal(dev, error, "allocating rx ring page"); goto fail; } SHARED_RING_INIT(rxs); FRONT_RING_INIT(&info->rx, rxs, PAGE_SIZE); - err = xenbus_grant_ring(dev, virt_to_mfn(rxs)); - if (err < 0) + error = xenbus_grant_ring(dev, virt_to_mfn(rxs), &info->rx_ring_ref); + if (error) goto fail; - info->rx_ring_ref = err; -#if 0 - network_connect(info); -#endif - err = bind_listening_port_to_irqhandler(xenbus_get_otherend_id(dev), - "xn", xn_intr, info, INTR_TYPE_NET | INTR_MPSAFE, NULL); + error = bind_listening_port_to_irqhandler(xenbus_get_otherend_id(dev), + "xn", xn_intr, info, INTR_TYPE_NET | INTR_MPSAFE, &info->irq); - if (err <= 0) { - xenbus_dev_fatal(dev, err, + if (error) { + xenbus_dev_fatal(dev, error, "bind_evtchn_to_irqhandler failed"); goto fail; } - info->irq = err; - + show_device(info); - return 0; + return (0); fail: netif_free(info); - return err; + return (error); } /** @@ -1224,7 +1217,7 @@ xennet_get_responses(struct netfront_inf MULTI_update_va_mapping(mcl, (u_long)vaddr, (((vm_paddr_t)mfn) << PAGE_SHIFT) | PG_RW | PG_V | PG_M | PG_A, 0); - pfn = (uint32_t)m->m_ext.ext_args; + pfn = (uintptr_t)m->m_ext.ext_args; mmu->ptr = ((vm_paddr_t)mfn << PAGE_SHIFT) | MMU_MACHPHYS_UPDATE; mmu->val = pfn; @@ -1449,9 +1442,11 @@ xn_ioctl(struct ifnet *ifp, u_long cmd, if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) xn_ifinit_locked(sc); arp_ifinit(ifp, ifa); - } else + XN_UNLOCK(sc); + } else { + XN_UNLOCK(sc); error = ether_ioctl(ifp, cmd, data); - XN_UNLOCK(sc); + } break; case SIOCSIFMTU: /* XXX can we alter the MTU on a VN ?*/ @@ -1554,18 +1549,18 @@ xn_stop(struct netfront_info *sc) int network_connect(struct netfront_info *np) { - int i, requeue_idx, err; + int i, requeue_idx, error; grant_ref_t ref; netif_rx_request_t *req; u_int feature_rx_copy, feature_rx_flip; - err = xenbus_scanf(XBT_NIL, xenbus_get_otherend_path(np->xbdev), - "feature-rx-copy", "%u", &feature_rx_copy); - if (err != 1) + error = xenbus_scanf(XBT_NIL, xenbus_get_otherend_path(np->xbdev), + "feature-rx-copy", NULL, "%u", &feature_rx_copy); + if (error) feature_rx_copy = 0; - err = xenbus_scanf(XBT_NIL, xenbus_get_otherend_path(np->xbdev), - "feature-rx-flip", "%u", &feature_rx_flip); - if (err != 1) + error = xenbus_scanf(XBT_NIL, xenbus_get_otherend_path(np->xbdev), + "feature-rx-flip", NULL, "%u", &feature_rx_flip); + if (error) feature_rx_flip = 1; /* @@ -1578,9 +1573,9 @@ network_connect(struct netfront_info *np XN_LOCK(np); /* Recovery procedure: */ - err = talk_to_backend(np->xbdev, np); - if (err) - return (err); + error = talk_to_backend(np->xbdev, np); + if (error) + return (error); /* Step 1: Reinitialise variables. */ netif_release_tx_bufs(np); @@ -1588,6 +1583,7 @@ network_connect(struct netfront_info *np /* Step 2: Rebuild the RX buffer freelist and the RX ring itself. */ for (requeue_idx = 0, i = 0; i < NET_RX_RING_SIZE; i++) { struct mbuf *m; + u_long pfn; if (np->rx_mbufs[i] == NULL) continue; @@ -1595,15 +1591,16 @@ network_connect(struct netfront_info *np m = np->rx_mbufs[requeue_idx] = xennet_get_rx_mbuf(np, i); ref = np->grant_rx_ref[requeue_idx] = xennet_get_rx_ref(np, i); req = RING_GET_REQUEST(&np->rx, requeue_idx); + pfn = vtophys(mtod(m, vm_offset_t)) >> PAGE_SHIFT; if (!np->copying_receiver) { gnttab_grant_foreign_transfer_ref(ref, xenbus_get_otherend_id(np->xbdev), - vtophys(mtod(m, vm_offset_t))); + pfn); } else { gnttab_grant_foreign_access_ref(ref, xenbus_get_otherend_id(np->xbdev), - vtophys(mtod(m, vm_offset_t)), 0); + PFNTOMFN(pfn), 0); } req->gref = ref; req->id = requeue_idx; @@ -1704,7 +1701,7 @@ create_netdev(device_t dev) ifp = np->xn_ifp = if_alloc(IFT_ETHER); ifp->if_softc = np; if_initname(ifp, "xn", device_get_unit(dev)); - ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX; + ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; ifp->if_ioctl = xn_ioctl; ifp->if_output = ether_output; ifp->if_start = xn_start; @@ -1774,11 +1771,14 @@ static void netif_free(struct netfront_i #endif } - - static void netif_disconnect_backend(struct netfront_info *info) { - xn_stop(info); + XN_RX_LOCK(info); + XN_TX_LOCK(info); + netfront_carrier_off(info); + XN_TX_UNLOCK(info); + XN_RX_UNLOCK(info); + end_access(info->tx_ring_ref, info->tx.sring); end_access(info->rx_ring_ref, info->rx.sring); info->tx_ring_ref = GRANT_INVALID_REF; @@ -1786,12 +1786,9 @@ static void netif_disconnect_backend(str info->tx.sring = NULL; info->rx.sring = NULL; -#if 0 if (info->irq) - unbind_from_irqhandler(info->irq, info->netdev); -#else - panic("FIX ME"); -#endif + unbind_from_irqhandler(info->irq); + info->irq = 0; } Modified: projects/release_6_3_xen/sys/i386/conf/XEN ============================================================================== --- projects/release_6_3_xen/sys/i386/conf/XEN Mon Dec 29 01:40:09 2008 (r186554) +++ projects/release_6_3_xen/sys/i386/conf/XEN Mon Dec 29 04:36:33 2008 (r186555) @@ -154,4 +154,5 @@ options KTR_CPUMASK=0xff options KTR_ENTRIES=131072 options KTR_MASK=(KTR_PMAP) -options KVA_PAGES=1600 +#options KVA_PAGES=1600 + Modified: projects/release_6_3_xen/sys/i386/i386/genassym.c ============================================================================== --- projects/release_6_3_xen/sys/i386/i386/genassym.c Mon Dec 29 01:40:09 2008 (r186554) +++ projects/release_6_3_xen/sys/i386/i386/genassym.c Mon Dec 29 04:36:33 2008 (r186555) @@ -229,7 +229,7 @@ ASSYM(BUS_SPACE_HANDLE_IAT, offsetof(str #endif #ifdef XEN -#include +#include ASSYM(PC_CR3, offsetof(struct pcpu, pc_cr3)); ASSYM(HYPERVISOR_VIRT_START, __HYPERVISOR_VIRT_START); #endif Modified: projects/release_6_3_xen/sys/i386/i386/machdep.c ============================================================================== --- projects/release_6_3_xen/sys/i386/i386/machdep.c Mon Dec 29 01:40:09 2008 (r186554) +++ projects/release_6_3_xen/sys/i386/i386/machdep.c Mon Dec 29 04:36:33 2008 (r186555) @@ -145,11 +145,11 @@ uint32_t arch_i386_xbox_memsize = 0; #ifdef XEN /* XEN includes */ -#include +#include #include #include #include -#include +#include void Xhypervisor_callback(void); void failsafe_callback(void); Modified: projects/release_6_3_xen/sys/i386/i386/vm_machdep.c ============================================================================== --- projects/release_6_3_xen/sys/i386/i386/vm_machdep.c Mon Dec 29 01:40:09 2008 (r186554) +++ projects/release_6_3_xen/sys/i386/i386/vm_machdep.c Mon Dec 29 04:36:33 2008 (r186555) @@ -90,7 +90,7 @@ __FBSDID("$FreeBSD$"); #include #ifdef XEN -#include +#include #endif #ifdef PC98 #include Modified: projects/release_6_3_xen/sys/i386/include/xen/xenfunc.h ============================================================================== --- projects/release_6_3_xen/sys/i386/include/xen/xenfunc.h Mon Dec 29 01:40:09 2008 (r186554) +++ projects/release_6_3_xen/sys/i386/include/xen/xenfunc.h Mon Dec 29 04:36:33 2008 (r186555) @@ -31,7 +31,7 @@ #define _XEN_XENFUNC_H_ #include -#include +#include #include #include #include Modified: projects/release_6_3_xen/sys/i386/isa/npx.c ============================================================================== --- projects/release_6_3_xen/sys/i386/isa/npx.c Mon Dec 29 01:40:09 2008 (r186554) +++ projects/release_6_3_xen/sys/i386/isa/npx.c Mon Dec 29 04:36:33 2008 (r186555) @@ -69,8 +69,9 @@ __FBSDID("$FreeBSD$"); #include #include +#include #ifdef XEN -#include +#include #endif #ifdef DEV_ISA #include Modified: projects/release_6_3_xen/sys/i386/xen/clock.c ============================================================================== --- projects/release_6_3_xen/sys/i386/xen/clock.c Mon Dec 29 01:40:09 2008 (r186554) +++ projects/release_6_3_xen/sys/i386/xen/clock.c Mon Dec 29 04:36:33 2008 (r186555) @@ -78,11 +78,11 @@ __FBSDID("$FreeBSD$"); #include #include -#include +#include #include #include #include -#include +#include #include #include #include @@ -295,12 +295,13 @@ static struct timecounter xen_timecounte }; static void -clkintr(struct clockframe *frame) +clkintr(void *arg) { int64_t delta_cpu, delta; int cpu = smp_processor_id(); struct shadow_time_info *shadow = &per_cpu(shadow_time, cpu); - + struct clockframe *frame = (struct clockframe *)arg; + do { __get_time_values_from_xen(); @@ -840,17 +841,20 @@ static struct vcpu_set_periodic_timer xe void cpu_initclocks(void) { - int time_irq; - + unsigned int time_irq; + int error; + xen_set_periodic_tick.period_ns = NS_PER_TICK; HYPERVISOR_vcpu_op(VCPUOP_set_periodic_timer, 0, &xen_set_periodic_tick); - - if ((time_irq = bind_virq_to_irqhandler(VIRQ_TIMER, 0, "clk", - (driver_intr_t *)clkintr, INTR_TYPE_CLK | INTR_FAST)) < 0) { + + error = bind_virq_to_irqhandler(VIRQ_TIMER, 0, "clk", + clkintr, + INTR_TYPE_CLK | INTR_FAST, &time_irq); + if (error) panic("failed to register clock interrupt\n"); - } + /* should fast clock be enabled ? */ } @@ -859,18 +863,19 @@ cpu_initclocks(void) int ap_cpu_initclocks(int cpu) { - int time_irq; + unsigned int time_irq; + int error; xen_set_periodic_tick.period_ns = NS_PER_TICK; HYPERVISOR_vcpu_op(VCPUOP_set_periodic_timer, cpu, &xen_set_periodic_tick); - - if ((time_irq = bind_virq_to_irqhandler(VIRQ_TIMER, cpu, "clk", - (driver_intr_t *)clkintr, - INTR_TYPE_CLK | INTR_FAST)) < 0) { + error = bind_virq_to_irqhandler(VIRQ_TIMER, 0, "clk", + clkintr, + INTR_TYPE_CLK | INTR_FAST, &time_irq); + if (error) panic("failed to register clock interrupt\n"); - } + return (0); } Modified: projects/release_6_3_xen/sys/i386/xen/mp_machdep.c ============================================================================== --- projects/release_6_3_xen/sys/i386/xen/mp_machdep.c Mon Dec 29 01:40:09 2008 (r186554) +++ projects/release_6_3_xen/sys/i386/xen/mp_machdep.c Mon Dec 29 04:36:33 2008 (r186555) @@ -82,9 +82,11 @@ __FBSDID("$FreeBSD$"); #include /** COUNT_XINVLTLB_HITS */ #include -#include -#include -#include +#include +#include +#include +#include +#include #include /* @@ -511,7 +513,8 @@ static int xen_smp_intr_init(unsigned int cpu) { int rc; - + unsigned int irq; + per_cpu(resched_irq, cpu) = per_cpu(callfunc_irq, cpu) = -1; sprintf(resched_name[cpu], "resched%u", cpu); @@ -519,22 +522,22 @@ xen_smp_intr_init(unsigned int cpu) cpu, resched_name[cpu], smp_reschedule_interrupt, - INTR_FAST|INTR_TYPE_TTY|INTR_MPSAFE); + INTR_FAST|INTR_TYPE_TTY|INTR_MPSAFE, &irq); printf("cpu=%d irq=%d vector=%d\n", cpu, rc, RESCHEDULE_VECTOR); - per_cpu(resched_irq, cpu) = rc; + per_cpu(resched_irq, cpu) = irq; sprintf(callfunc_name[cpu], "callfunc%u", cpu); rc = bind_ipi_to_irqhandler(CALL_FUNCTION_VECTOR, cpu, callfunc_name[cpu], smp_call_function_interrupt, - INTR_FAST|INTR_TYPE_TTY|INTR_MPSAFE); + INTR_FAST|INTR_TYPE_TTY|INTR_MPSAFE, &irq); if (rc < 0) goto fail; - per_cpu(callfunc_irq, cpu) = rc; + per_cpu(callfunc_irq, cpu) = irq; printf("cpu=%d irq=%d vector=%d\n", cpu, rc, CALL_FUNCTION_VECTOR); @@ -547,9 +550,9 @@ xen_smp_intr_init(unsigned int cpu) fail: if (per_cpu(resched_irq, cpu) >= 0) - unbind_from_irqhandler(per_cpu(resched_irq, cpu), NULL); + unbind_from_irqhandler(per_cpu(resched_irq, cpu)); if (per_cpu(callfunc_irq, cpu) >= 0) - unbind_from_irqhandler(per_cpu(callfunc_irq, cpu), NULL); + unbind_from_irqhandler(per_cpu(callfunc_irq, cpu)); return rc; } Modified: projects/release_6_3_xen/sys/i386/xen/mptable.c ============================================================================== --- projects/release_6_3_xen/sys/i386/xen/mptable.c Mon Dec 29 01:40:09 2008 (r186554) +++ projects/release_6_3_xen/sys/i386/xen/mptable.c Mon Dec 29 04:36:33 2008 (r186555) @@ -45,7 +45,7 @@ __FBSDID("$FreeBSD$"); #include #include -#include +#include #include #include #include Modified: projects/release_6_3_xen/sys/i386/xen/pmap.c ============================================================================== --- projects/release_6_3_xen/sys/i386/xen/pmap.c Mon Dec 29 01:40:09 2008 (r186554) +++ projects/release_6_3_xen/sys/i386/xen/pmap.c Mon Dec 29 04:36:33 2008 (r186555) @@ -144,7 +144,7 @@ __FBSDID("$FreeBSD$"); #ifdef XEN #include -#include +#include #include #include #include @@ -159,6 +159,16 @@ __FBSDID("$FreeBSD$"); #include #endif +#ifdef XBOX +#include +#endif + +#include +#include +#include +#include +#include + #if !defined(CPU_DISABLE_SSE) && defined(I686_CPU) #define CPU_ENABLE_SSE #endif Modified: projects/release_6_3_xen/sys/i386/xen/xen_bus.c ============================================================================== --- projects/release_6_3_xen/sys/i386/xen/xen_bus.c Mon Dec 29 01:40:09 2008 (r186554) +++ projects/release_6_3_xen/sys/i386/xen/xen_bus.c Mon Dec 29 04:36:33 2008 (r186555) @@ -15,8 +15,8 @@ #include #include -#include -#include +#include +#include static MALLOC_DEFINE(M_XENDEV, "xenintrdrv", "xen system device"); Modified: projects/release_6_3_xen/sys/i386/xen/xen_machdep.c ============================================================================== --- projects/release_6_3_xen/sys/i386/xen/xen_machdep.c Mon Dec 29 01:40:09 2008 (r186554) +++ projects/release_6_3_xen/sys/i386/xen/xen_machdep.c Mon Dec 29 04:36:33 2008 (r186555) @@ -57,7 +57,7 @@ __FBSDID("$FreeBSD$"); -#include +#include #include #include #include Modified: projects/release_6_3_xen/sys/sys/mutex.h ============================================================================== --- projects/release_6_3_xen/sys/sys/mutex.h Mon Dec 29 01:40:09 2008 (r186554) +++ projects/release_6_3_xen/sys/sys/mutex.h Mon Dec 29 04:36:33 2008 (r186555) @@ -325,6 +325,9 @@ extern struct mtx_pool *mtxpool_sleep; #define mtx_trylock_flags(m, opts) \ _mtx_trylock((m), (opts), LOCK_FILE, LOCK_LINE) +#define mtx_sleep(chan, mtx, pri, wmesg, timo) \ + _sleep((chan), &(mtx)->mtx_object, (pri), (wmesg), (timo)) + #define mtx_initialized(m) lock_initalized(&(m)->mtx_object) #define mtx_owned(m) (((m)->mtx_lock & MTX_FLAGMASK) == (uintptr_t)curthread) Added: projects/release_6_3_xen/sys/xen/evtchn.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/release_6_3_xen/sys/xen/evtchn.h Mon Dec 29 04:36:33 2008 (r186555) @@ -0,0 +1,188 @@ +/****************************************************************************** + * evtchn.h + * + * Communication via Xen event channels. + * Also definitions for the device that demuxes notifications to userspace. + * + * Copyright (c) 2004, K A Fraser + * + * $FreeBSD$ + */ + +#ifndef __ASM_EVTCHN_H__ +#define __ASM_EVTCHN_H__ +#include +#include +#include +#include + +/* + * LOW-LEVEL DEFINITIONS + */ + +/* + * Unlike notify_remote_via_evtchn(), this is safe to use across + * save/restore. Notifications on a broken connection are silently dropped. + */ +void notify_remote_via_irq(int irq); + + +/* Entry point for notifications into Linux subsystems. */ +void evtchn_do_upcall(struct intrframe *frame); + +/* Entry point for notifications into the userland character device. */ +void evtchn_device_upcall(int port); + +void mask_evtchn(int port); + +void unmask_evtchn(int port); + +#ifdef SMP +void rebind_evtchn_to_cpu(int port, unsigned int cpu); +#else +#define rebind_evtchn_to_cpu(port, cpu) ((void)0) +#endif + +static inline +int test_and_set_evtchn_mask(int port) +{ + shared_info_t *s = HYPERVISOR_shared_info; + return synch_test_and_set_bit(port, s->evtchn_mask); +} + +static inline void +clear_evtchn(int port) +{ + shared_info_t *s = HYPERVISOR_shared_info; + synch_clear_bit(port, &s->evtchn_pending[0]); +} + +static inline void +notify_remote_via_evtchn(int port) +{ + struct evtchn_send send = { .port = port }; + (void)HYPERVISOR_event_channel_op(EVTCHNOP_send, &send); +} + +/* + * Use these to access the event channel underlying the IRQ handle returned + * by bind_*_to_irqhandler(). + */ +int irq_to_evtchn_port(int irq); + +void ipi_pcpu(unsigned int cpu, int vector); + +/* + * CHARACTER-DEVICE DEFINITIONS + */ + +#define PORT_NORMAL 0x0000 +#define PORT_EXCEPTION 0x8000 +#define PORTIDX_MASK 0x7fff + +/* /dev/xen/evtchn resides at device number major=10, minor=200 */ +#define EVTCHN_MINOR 200 + +/* /dev/xen/evtchn ioctls: */ +/* EVTCHN_RESET: Clear and reinit the event buffer. Clear error condition. */ +#define EVTCHN_RESET _IO('E', 1) +/* EVTCHN_BIND: Bind to the specified event-channel port. */ +#define EVTCHN_BIND _IO('E', 2) +/* EVTCHN_UNBIND: Unbind from the specified event-channel port. */ +#define EVTCHN_UNBIND _IO('E', 3) + +#endif /* __ASM_EVTCHN_H__ */ +/****************************************************************************** + * evtchn.h + * + * Communication via Xen event channels. + * Also definitions for the device that demuxes notifications to userspace. + * + * Copyright (c) 2004, K A Fraser + * + * $FreeBSD$ + */ + +#ifndef __ASM_EVTCHN_H__ +#define __ASM_EVTCHN_H__ +#include +#include +#include +#include + +/* + * LOW-LEVEL DEFINITIONS + */ + +/* + * Unlike notify_remote_via_evtchn(), this is safe to use across + * save/restore. Notifications on a broken connection are silently dropped. + */ +void notify_remote_via_irq(int irq); + + +/* Entry point for notifications into Linux subsystems. */ +void evtchn_do_upcall(struct trapframe *frame); + +/* Entry point for notifications into the userland character device. */ +void evtchn_device_upcall(int port); + +void mask_evtchn(int port); + +void unmask_evtchn(int port); + +#ifdef SMP +void rebind_evtchn_to_cpu(int port, unsigned int cpu); +#else +#define rebind_evtchn_to_cpu(port, cpu) ((void)0) +#endif + +static inline +int test_and_set_evtchn_mask(int port) +{ + shared_info_t *s = HYPERVISOR_shared_info; + return synch_test_and_set_bit(port, s->evtchn_mask); +} + +static inline void +clear_evtchn(int port) +{ + shared_info_t *s = HYPERVISOR_shared_info; + synch_clear_bit(port, &s->evtchn_pending[0]); +} + +static inline void +notify_remote_via_evtchn(int port) +{ + struct evtchn_send send = { .port = port }; + (void)HYPERVISOR_event_channel_op(EVTCHNOP_send, &send); *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-src-projects@FreeBSD.ORG Mon Dec 29 04:40:53 2008 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 5F1231065673; Mon, 29 Dec 2008 04:40:53 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 5451A8FC14; Mon, 29 Dec 2008 04:40:53 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id mBT4eqML044228; Mon, 29 Dec 2008 04:40:52 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id mBT4eqhG044224; Mon, 29 Dec 2008 04:40:52 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200812290440.mBT4eqhG044224@svn.freebsd.org> From: Kip Macy Date: Mon, 29 Dec 2008 04:40:52 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r186556 - in projects/release_6_3_xen/sys/xen: evtchn xenbus X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 29 Dec 2008 04:40:53 -0000 Author: kmacy Date: Mon Dec 29 04:40:52 2008 New Revision: 186556 URL: http://svn.freebsd.org/changeset/base/186556 Log: merge 186554 from releng_7_xen Log: unmask evtchn in bind_{virq, ipi}_to_irq Log: - remove code for handling case of not being able to sleep - eliminate tsleep - make sleeps atomic Modified: projects/release_6_3_xen/sys/xen/evtchn/evtchn.c projects/release_6_3_xen/sys/xen/xenbus/xenbus_comms.c projects/release_6_3_xen/sys/xen/xenbus/xenbus_comms.h projects/release_6_3_xen/sys/xen/xenbus/xenbus_xs.c Modified: projects/release_6_3_xen/sys/xen/evtchn/evtchn.c ============================================================================== --- projects/release_6_3_xen/sys/xen/evtchn/evtchn.c Mon Dec 29 04:36:33 2008 (r186555) +++ projects/release_6_3_xen/sys/xen/evtchn/evtchn.c Mon Dec 29 04:40:52 2008 (r186556) @@ -366,7 +366,7 @@ static int bind_virq_to_irq(unsigned int virq, unsigned int cpu) { struct evtchn_bind_virq bind_virq; - int evtchn, irq; + int evtchn = 0, irq; mtx_lock_spin(&irq_mapping_update_lock); @@ -390,6 +390,7 @@ bind_virq_to_irq(unsigned int virq, unsi } irq_bindcount[irq]++; + unmask_evtchn(evtchn); out: mtx_unlock_spin(&irq_mapping_update_lock); @@ -403,8 +404,9 @@ int bind_ipi_to_irq(unsigned int ipi, unsigned int cpu) { struct evtchn_bind_ipi bind_ipi; - int evtchn, irq; - + int irq; + int evtchn = 0; + mtx_lock_spin(&irq_mapping_update_lock); if ((irq = per_cpu(ipi_to_irq, cpu)[ipi]) == -1) { @@ -423,6 +425,7 @@ bind_ipi_to_irq(unsigned int ipi, unsign bind_evtchn_to_cpu(evtchn, cpu); } irq_bindcount[irq]++; + unmask_evtchn(evtchn); out: mtx_unlock_spin(&irq_mapping_update_lock); Modified: projects/release_6_3_xen/sys/xen/xenbus/xenbus_comms.c ============================================================================== --- projects/release_6_3_xen/sys/xen/xenbus/xenbus_comms.c Mon Dec 29 04:36:33 2008 (r186555) +++ projects/release_6_3_xen/sys/xen/xenbus/xenbus_comms.c Mon Dec 29 04:40:52 2008 (r186556) @@ -36,6 +36,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -94,7 +95,7 @@ xb_get_input_chunk(XENSTORE_RING_IDX con } int -xb_write(const void *tdata, unsigned len) +xb_write(const void *tdata, unsigned len, struct lock_object *lock) { struct xenstore_domain_interface *intf = xenstore_domain_interface(); XENSTORE_RING_IDX cons, prod; @@ -107,7 +108,9 @@ xb_write(const void *tdata, unsigned len while ((intf->req_prod - intf->req_cons) == XENSTORE_RING_SIZE) { - error = tsleep(intf, PCATCH, "xbwrite", hz/10); + error = _sleep(intf, + lock, + PCATCH, "xbwrite", hz/10); if (error && error != EWOULDBLOCK) return (error); } @@ -144,7 +147,7 @@ xb_write(const void *tdata, unsigned len } int -xb_read(void *tdata, unsigned len) +xb_read(void *tdata, unsigned len, struct lock_object *lock) { struct xenstore_domain_interface *intf = xenstore_domain_interface(); XENSTORE_RING_IDX cons, prod; @@ -156,7 +159,8 @@ xb_read(void *tdata, unsigned len) const char *src; while (intf->rsp_cons == intf->rsp_prod) { - error = tsleep(intf, PCATCH, "xbread", hz/10); + error = _sleep(intf, lock, + PCATCH, "xbread", hz/10); if (error && error != EWOULDBLOCK) return (error); } Modified: projects/release_6_3_xen/sys/xen/xenbus/xenbus_comms.h ============================================================================== --- projects/release_6_3_xen/sys/xen/xenbus/xenbus_comms.h Mon Dec 29 04:36:33 2008 (r186555) +++ projects/release_6_3_xen/sys/xen/xenbus/xenbus_comms.h Mon Dec 29 04:40:52 2008 (r186556) @@ -30,6 +30,7 @@ #ifndef _XENBUS_COMMS_H #define _XENBUS_COMMS_H +struct sx; extern int xen_store_evtchn; extern char *xen_store; @@ -37,8 +38,8 @@ int xs_init(void); int xb_init_comms(void); /* Low level routines. */ -int xb_write(const void *data, unsigned len); -int xb_read(void *data, unsigned len); +int xb_write(const void *data, unsigned len, struct lock_object *); +int xb_read(void *data, unsigned len, struct lock_object *); extern int xenbus_running; char *kasprintf(const char *fmt, ...); Modified: projects/release_6_3_xen/sys/xen/xenbus/xenbus_xs.c ============================================================================== --- projects/release_6_3_xen/sys/xen/xenbus/xenbus_xs.c Mon Dec 29 04:36:33 2008 (r186555) +++ projects/release_6_3_xen/sys/xen/xenbus/xenbus_xs.c Mon Dec 29 04:40:52 2008 (r186556) @@ -137,33 +137,11 @@ xs_read_reply(enum xsd_sockmsg_type *typ { struct xs_stored_msg *msg; char *body; - int i, error; - - if (xenbus_running == 0) { - /* - * Give other domain time to run :-/ - */ - for (i = 0; i < 1000000 && (xenbus_running == 0); i++) { - error = xs_process_msg(type); - - if (error == 0 && *type != XS_WATCH_EVENT) - break; - - HYPERVISOR_yield(); - } - - if (TAILQ_EMPTY(&xs_state.reply_list)) { - printf("giving up and returning an error type=%d\n", - *type); - kdb_backtrace(); - return (EIO); - } - - } + int error; mtx_lock(&xs_state.reply_lock); - if (xenbus_running) { - while (TAILQ_EMPTY(&xs_state.reply_list)) { + + while (TAILQ_EMPTY(&xs_state.reply_list)) { while (TAILQ_EMPTY(&xs_state.reply_list)) { error = mtx_sleep(&xs_state.reply_waitq, &xs_state.reply_lock, @@ -177,7 +155,7 @@ xs_read_reply(enum xsd_sockmsg_type *typ } - } + msg = TAILQ_FIRST(&xs_state.reply_list); TAILQ_REMOVE(&xs_state.reply_list, msg, list); @@ -224,7 +202,7 @@ xenbus_dev_request_and_reply(struct xsd_ sx_xlock(&xs_state.request_mutex); - error = xb_write(msg, sizeof(*msg) + msg->len); + error = xb_write(msg, sizeof(*msg) + msg->len, &xs_state.request_mutex.lock_object); if (error) { msg->type = XS_ERROR; } else { @@ -241,8 +219,6 @@ xenbus_dev_request_and_reply(struct xsd_ return (error); } -static int xenwatch_inline; - /* * Send message to xs. The reply is returned in *result and should be * fred with free(*result, M_DEVBUF). Return zero on success or an @@ -267,7 +243,7 @@ xs_talkv(struct xenbus_transaction t, en sx_xlock(&xs_state.request_mutex); - error = xb_write(&msg, sizeof(msg)); + error = xb_write(&msg, sizeof(msg), &xs_state.request_mutex.lock_object); if (error) { sx_xunlock(&xs_state.request_mutex); printf("xs_talkv failed %d\n", error); @@ -275,7 +251,7 @@ xs_talkv(struct xenbus_transaction t, en } for (i = 0; i < num_vecs; i++) { - error = xb_write(iovec[i].iov_base, iovec[i].iov_len);; + error = xb_write(iovec[i].iov_base, iovec[i].iov_len, &xs_state.request_mutex.lock_object); if (error) { sx_xunlock(&xs_state.request_mutex); printf("xs_talkv failed %d\n", error); @@ -776,18 +752,15 @@ xenwatch_thread(void *unused) { struct xs_stored_msg *msg; - DELAY(100000); - while (xenwatch_inline) { - printf("xenwatch inline still running\n"); - DELAY(100000); - } - for (;;) { + mtx_lock(&watch_events_lock); while (TAILQ_EMPTY(&watch_events)) - tsleep(&watch_events_waitq, + mtx_sleep(&watch_events_waitq, + &watch_events_lock, PWAIT | PCATCH, "waitev", hz/10); - + + mtx_unlock(&watch_events_lock); sx_xlock(&xenwatch_mutex); mtx_lock(&watch_events_lock); @@ -817,16 +790,18 @@ xs_process_msg(enum xsd_sockmsg_type *ty int error; msg = malloc(sizeof(*msg), M_DEVBUF, M_WAITOK); - - error = xb_read(&msg->hdr, sizeof(msg->hdr)); + mtx_lock(&xs_state.reply_lock); + error = xb_read(&msg->hdr, sizeof(msg->hdr), &xs_state.reply_lock.mtx_object); + mtx_unlock(&xs_state.reply_lock); if (error) { free(msg, M_DEVBUF); return (error); } body = malloc(msg->hdr.len + 1, M_DEVBUF, M_WAITOK); - - error = xb_read(body, msg->hdr.len); + mtx_lock(&xs_state.reply_lock); + error = xb_read(body, msg->hdr.len, &xs_state.reply_lock.mtx_object); + mtx_unlock(&xs_state.reply_lock); if (error) { free(body, M_DEVBUF); free(msg, M_DEVBUF); @@ -869,9 +844,7 @@ xenbus_thread(void *unused) int error; enum xsd_sockmsg_type type; - DELAY(10000); xenbus_running = 1; - tsleep(&lbolt, 0, "xenbus", hz/10); for (;;) { error = xs_process_msg(&type); From owner-svn-src-projects@FreeBSD.ORG Mon Dec 29 21:49:09 2008 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A38191065670; Mon, 29 Dec 2008 21:49:09 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 770838FC13; Mon, 29 Dec 2008 21:49:09 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id mBTLn9pI067643; Mon, 29 Dec 2008 21:49:09 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id mBTLn9sP067642; Mon, 29 Dec 2008 21:49:09 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200812292149.mBTLn9sP067642@svn.freebsd.org> From: Kip Macy Date: Mon, 29 Dec 2008 21:49:09 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r186571 - projects/HEAD_fast_net X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 29 Dec 2008 21:49:09 -0000 Author: kmacy Date: Mon Dec 29 21:49:09 2008 New Revision: 186571 URL: http://svn.freebsd.org/changeset/base/186571 Log: create new branch for updated flowtable and route caching Added: projects/HEAD_fast_net/ (props changed) - copied from r186570, head/ From owner-svn-src-projects@FreeBSD.ORG Mon Dec 29 21:50:51 2008 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 756951065694; Mon, 29 Dec 2008 21:50:51 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 4882F8FC18; Mon, 29 Dec 2008 21:50:51 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id mBTLopMZ067719; Mon, 29 Dec 2008 21:50:51 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id mBTLoppe067718; Mon, 29 Dec 2008 21:50:51 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200812292150.mBTLoppe067718@svn.freebsd.org> From: Kip Macy Date: Mon, 29 Dec 2008 21:50:51 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r186572 - projects/HEAD_fast_net user/kmacy/HEAD_fast_net X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 29 Dec 2008 21:50:51 -0000 Author: kmacy Date: Mon Dec 29 21:50:50 2008 New Revision: 186572 URL: http://svn.freebsd.org/changeset/base/186572 Log: move repo to personal directory Deleted: projects/HEAD_fast_net/ Changes in other areas also in this revision: Added: user/kmacy/HEAD_fast_net/ (props changed) - copied from r186571, projects/HEAD_fast_net/ From owner-svn-src-projects@FreeBSD.ORG Tue Dec 30 08:06:04 2008 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 069B3106564A; Tue, 30 Dec 2008 08:06:04 +0000 (UTC) (envelope-from jb@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id CFE668FC08; Tue, 30 Dec 2008 08:06:03 +0000 (UTC) (envelope-from jb@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id mBU863Jn081326; Tue, 30 Dec 2008 08:06:03 GMT (envelope-from jb@svn.freebsd.org) Received: (from jb@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id mBU863Ra081325; Tue, 30 Dec 2008 08:06:03 GMT (envelope-from jb@svn.freebsd.org) Message-Id: <200812300806.mBU863Ra081325@svn.freebsd.org> From: John Birrell Date: Tue, 30 Dec 2008 08:06:03 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r186597 - projects/jbuild X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 30 Dec 2008 08:06:04 -0000 Author: jb Date: Tue Dec 30 08:06:03 2008 New Revision: 186597 URL: http://svn.freebsd.org/changeset/base/186597 Log: Create a jbuild branch for head Added: projects/jbuild/ (props changed) - copied from r186596, head/