svn commit: r188687 - in user/dfr/xenhvm/7/sys/dev/xen: blkfront
console netfront
Doug Rabson
dfr at FreeBSD.org
Mon Feb 16 09:45:31 PST 2009
Author: dfr
Date: Mon Feb 16 17:45:29 2009
New Revision: 188687
URL: http://svn.freebsd.org/changeset/base/188687
Log:
Diff reduction with user/dfr/xenhvm/6.
Modified:
user/dfr/xenhvm/7/sys/dev/xen/blkfront/blkfront.c
user/dfr/xenhvm/7/sys/dev/xen/console/console.c
user/dfr/xenhvm/7/sys/dev/xen/console/xencons_ring.c
user/dfr/xenhvm/7/sys/dev/xen/netfront/netfront.c
Modified: user/dfr/xenhvm/7/sys/dev/xen/blkfront/blkfront.c
==============================================================================
--- user/dfr/xenhvm/7/sys/dev/xen/blkfront/blkfront.c Mon Feb 16 17:43:45 2009 (r188686)
+++ user/dfr/xenhvm/7/sys/dev/xen/blkfront/blkfront.c Mon Feb 16 17:45:29 2009 (r188687)
@@ -40,17 +40,17 @@ __FBSDID("$FreeBSD$");
#include <machine/intr_machdep.h>
#include <machine/vmparam.h>
-#include <xen/hypervisor.h>
#include <machine/xen/xen-os.h>
+#include <machine/xen/xenfunc.h>
+#include <xen/hypervisor.h>
#include <xen/xen_intr.h>
#include <xen/evtchn.h>
+#include <xen/gnttab.h>
#include <xen/interface/grant_table.h>
#include <xen/interface/io/protocols.h>
#include <xen/xenbus/xenbusvar.h>
#include <geom/geom_disk.h>
-#include <machine/xen/xenfunc.h>
-#include <xen/gnttab.h>
#include <dev/xen/blkfront/block.h>
@@ -106,7 +106,7 @@ static char * blkif_status_name[] = {
#endif
#define WPRINTK(fmt, args...) printf("[XEN] " fmt, ##args)
#if 0
-#define DPRINTK(fmt, args...) printf("[XEN] %s:%d" fmt ".\n", __FUNCTION__, __LINE__,##args)
+#define DPRINTK(fmt, args...) printf("[XEN] %s:%d: " fmt ".\n", __func__, __LINE__, ##args)
#else
#define DPRINTK(fmt, args...)
#endif
@@ -138,7 +138,6 @@ pfn_to_mfn(vm_paddr_t pfn)
return (phystomach(pfn << PAGE_SHIFT) >> PAGE_SHIFT);
}
-
/*
* Translate Linux major/minor to an appropriate name and unit
* number. For HVM guests, this allows us to use the same drive names
@@ -323,17 +322,17 @@ blkfront_probe(device_t dev)
static int
blkfront_attach(device_t dev)
{
- int err, vdevice, i, unit;
+ int error, vdevice, i, unit;
struct blkfront_info *info;
const char *name;
/* FIXME: Use dynamic device id if this is not set. */
- err = xenbus_scanf(XBT_NIL, xenbus_get_node(dev),
+ error = xenbus_scanf(XBT_NIL, xenbus_get_node(dev),
"virtual-device", NULL, "%i", &vdevice);
- if (err) {
- xenbus_dev_fatal(dev, err, "reading virtual-device");
+ if (error) {
+ xenbus_dev_fatal(dev, error, "reading virtual-device");
printf("couldn't find virtual device");
- return (err);
+ return (error);
}
blkfront_vdevice_to_unit(vdevice, &unit, &name);
@@ -362,9 +361,22 @@ blkfront_attach(device_t dev)
/* Front end dir is a number, which is used as the id. */
info->handle = strtoul(strrchr(xenbus_get_node(dev),'/')+1, NULL, 0);
- err = talk_to_backend(dev, info);
- if (err)
- return (err);
+ error = talk_to_backend(dev, info);
+ if (error)
+ return (error);
+
+ return (0);
+}
+
+static int
+blkfront_suspend(device_t dev)
+{
+ struct blkfront_info *info = device_get_softc(dev);
+
+ /* Prevent new requests being issued until we fix things up. */
+ mtx_lock(&blkif_io_lock);
+ info->connected = BLKIF_STATE_SUSPENDED;
+ mtx_unlock(&blkif_io_lock);
return (0);
}
@@ -375,16 +387,14 @@ blkfront_resume(device_t dev)
struct blkfront_info *info = device_get_softc(dev);
int err;
- DPRINTK("blkfront_resume: %s\n", dev->nodename);
+ DPRINTK("blkfront_resume: %s\n", xenbus_get_node(dev));
blkif_free(info, 1);
-
err = talk_to_backend(dev, info);
-
if (info->connected == BLKIF_STATE_SUSPENDED && !err)
blkif_recover(info);
- return err;
+ return (err);
}
/* Common code used when first setting up, and when resuming. */
@@ -425,6 +435,7 @@ talk_to_backend(device_t dev, struct blk
message = "writing protocol";
goto abort_transaction;
}
+
err = xenbus_transaction_end(xbt, 0);
if (err) {
if (err == EAGAIN)
@@ -462,8 +473,8 @@ setup_blkring(device_t dev, struct blkfr
SHARED_RING_INIT(sring);
FRONT_RING_INIT(&info->ring, sring, PAGE_SIZE);
- error = xenbus_grant_ring(dev, (vtomach(info->ring.sring) >> PAGE_SHIFT),
- &info->ring_ref);
+ error = xenbus_grant_ring(dev,
+ (vtomach(info->ring.sring) >> PAGE_SHIFT), &info->ring_ref);
if (error) {
free(sring, M_DEVBUF);
info->ring.sring = NULL;
@@ -471,11 +482,11 @@ setup_blkring(device_t dev, struct blkfr
}
error = bind_listening_port_to_irqhandler(xenbus_get_otherend_id(dev),
- "xbd", (driver_intr_t *)blkif_int, info,
- INTR_TYPE_BIO | INTR_MPSAFE, &info->irq);
+ "xbd", (driver_intr_t *)blkif_int, info,
+ INTR_TYPE_BIO | INTR_MPSAFE, &info->irq);
if (error) {
xenbus_dev_fatal(dev, error,
- "bind_evtchn_to_irqhandler failed");
+ "bind_evtchn_to_irqhandler failed");
goto fail;
}
@@ -494,7 +505,7 @@ blkfront_backend_changed(device_t dev, X
{
struct blkfront_info *info = device_get_softc(dev);
- DPRINTK("blkfront:backend_changed.\n");
+ DPRINTK("backend_state=%d\n", backend_state);
switch (backend_state) {
case XenbusStateUnknown:
@@ -707,7 +718,7 @@ blkif_open(struct disk *dp)
struct xb_softc *sc = (struct xb_softc *)dp->d_drv1;
if (sc == NULL) {
- printk("xb%d: not found", sc->xb_unit);
+ printf("xb%d: not found", sc->xb_unit);
return (ENXIO);
}
@@ -1019,9 +1030,11 @@ blkif_recover(struct blkfront_info *info
blkif_request_t *req;
struct blk_shadow *copy;
+ if (!info->sc)
+ return;
+
/* Stage 1: Make a safe copy of the shadow state. */
copy = (struct blk_shadow *)malloc(sizeof(info->shadow), M_DEVBUF, M_NOWAIT|M_ZERO);
- PANIC_IF(copy == NULL);
memcpy(copy, info->shadow, sizeof(info->shadow));
/* Stage 2: Set up free list. */
@@ -1084,7 +1097,7 @@ static device_method_t blkfront_methods[
DEVMETHOD(device_attach, blkfront_attach),
DEVMETHOD(device_detach, blkfront_detach),
DEVMETHOD(device_shutdown, bus_generic_shutdown),
- DEVMETHOD(device_suspend, bus_generic_suspend),
+ DEVMETHOD(device_suspend, blkfront_suspend),
DEVMETHOD(device_resume, blkfront_resume),
/* Xenbus interface */
Modified: user/dfr/xenhvm/7/sys/dev/xen/console/console.c
==============================================================================
--- user/dfr/xenhvm/7/sys/dev/xen/console/console.c Mon Feb 16 17:43:45 2009 (r188686)
+++ user/dfr/xenhvm/7/sys/dev/xen/console/console.c Mon Feb 16 17:45:29 2009 (r188687)
@@ -5,6 +5,7 @@
#include <sys/module.h>
#include <sys/systm.h>
#include <sys/consio.h>
+#include <sys/priv.h>
#include <sys/proc.h>
#include <sys/uio.h>
#include <sys/tty.h>
@@ -19,7 +20,7 @@
#include <xen/xen_intr.h>
#include <sys/cons.h>
#include <sys/proc.h>
-#include <sys/priv.h>
+#include <sys/kdb.h>
#include <dev/xen/console/xencons_ring.h>
#include <xen/interface/io/console.h>
@@ -44,7 +45,7 @@ static void xc_shutdown(void *arg, int h
static int xc_mute;
static void xcons_force_flush(void);
-static int xencons_priv_interrupt(void *);
+static void xencons_priv_interrupt(void *);
static cn_probe_t xccnprobe;
static cn_init_t xccninit;
@@ -141,12 +142,17 @@ xccngetc(struct consdev *dev)
return 0;
do {
if ((c = xccncheckc(dev)) == -1) {
- /* polling without sleeping in Xen doesn't work well.
- * Sleeping gives other things like clock a chance to
- * run
- */
- tsleep(&cn_mtx, PWAIT | PCATCH, "console sleep",
- XC_POLLTIME);
+#ifdef KDB
+ if (!kdb_active)
+#endif
+ /*
+ * Polling without sleeping in Xen
+ * doesn't work well. Sleeping gives
+ * other things like clock a chance to
+ * run
+ */
+ tsleep(&cn_mtx, PWAIT | PCATCH,
+ "console sleep", XC_POLLTIME);
}
} while(c == -1);
return c;
@@ -156,11 +162,13 @@ int
xccncheckc(struct consdev *dev)
{
int ret = (xc_mute ? 0 : -1);
- if (xencons_has_input())
- xencons_handle_input(NULL);
+
+ if (xencons_has_input())
+ xencons_handle_input(NULL);
CN_LOCK(cn_mtx);
if ((rp - rc)) {
+ if (kdb_active) printf("%s:%d\n", __func__, __LINE__);
/* we need to return only one char */
ret = (int)rbuf[RBUF_MASK(rc)];
rc++;
@@ -237,7 +245,6 @@ xc_attach(device_t dev)
int error;
struct xc_softc *sc = (struct xc_softc *)device_get_softc(dev);
-
if (xen_start_info->flags & SIF_INITDOMAIN) {
xc_consdev.cn_putc = xccnputc_dom0;
}
@@ -265,13 +272,13 @@ xc_attach(device_t dev)
VIRQ_CONSOLE,
0,
"console",
+ NULL,
xencons_priv_interrupt,
- NULL, INTR_TYPE_TTY, NULL);
+ INTR_TYPE_TTY, NULL);
KASSERT(error >= 0, ("can't register console interrupt"));
}
-
/* register handler to flush console on shutdown */
if ((EVENTHANDLER_REGISTER(shutdown_post_sync, xc_shutdown,
NULL, SHUTDOWN_PRI_DEFAULT)) == NULL)
@@ -303,7 +310,11 @@ xencons_rx(char *buf, unsigned len)
HYPERVISOR_shared_info->evtchn_mask[0]);
#endif
for (i = 0; i < len; i++) {
- if (xen_console_up)
+ if (xen_console_up
+#ifdef DDB
+ && !kdb_active
+#endif
+ )
(*linesw[tp->t_line]->l_rint)(buf[i], tp);
else
rbuf[RBUF_MASK(rp++)] = buf[i];
@@ -348,7 +359,7 @@ xencons_tx(void)
__xencons_tx_flush();
}
-static int
+static void
xencons_priv_interrupt(void *arg)
{
@@ -359,7 +370,6 @@ xencons_priv_interrupt(void *arg)
xencons_rx(rbuf, l);
xencons_tx();
- return (FILTER_HANDLED);
}
int
@@ -387,7 +397,7 @@ xcopen(struct cdev *dev, int flag, int m
tp->t_ispeed = tp->t_ospeed = TTYDEF_SPEED;
xcparam(tp, &tp->t_termios);
ttsetwater(tp);
- } else if (tp->t_state & TS_XCLUDE && suser(td)) {
+ } else if (tp->t_state & TS_XCLUDE && priv_check(td, PRIV_TTY_EXCLUSIVE)) {
splx(s);
return (EBUSY);
}
@@ -558,12 +568,3 @@ xcons_force_flush(void)
}
DRIVER_MODULE(xc, nexus, xc_driver, xc_devclass, 0, 0);
-/*
- * Local variables:
- * mode: C
- * c-set-style: "BSD"
- * c-basic-offset: 8
- * tab-width: 4
- * indent-tabs-mode: t
- * End:
- */
Modified: user/dfr/xenhvm/7/sys/dev/xen/console/xencons_ring.c
==============================================================================
--- user/dfr/xenhvm/7/sys/dev/xen/console/xencons_ring.c Mon Feb 16 17:43:45 2009 (r188686)
+++ user/dfr/xenhvm/7/sys/dev/xen/console/xencons_ring.c Mon Feb 16 17:45:29 2009 (r188687)
@@ -13,19 +13,24 @@ __FBSDID("$FreeBSD$");
#include <sys/conf.h>
#include <sys/kernel.h>
#include <sys/bus.h>
+#include <sys/cons.h>
+
#include <machine/stdarg.h>
#include <machine/xen/xen-os.h>
#include <xen/hypervisor.h>
#include <xen/xen_intr.h>
#include <sys/cons.h>
+#include <xen/xen_intr.h>
+#include <xen/evtchn.h>
+#include <xen/interface/io/console.h>
#include <dev/xen/console/xencons_ring.h>
#include <xen/evtchn.h>
#include <xen/interface/io/console.h>
-
#define console_evtchn console.domU.evtchn
+static unsigned int console_irq;
extern char *console_page;
extern struct mtx cn_mtx;
@@ -60,7 +65,8 @@ xencons_ring_send(const char *data, unsi
sent = 0;
mb();
- PANIC_IF((prod - cons) > sizeof(intf->out));
+ KASSERT((prod - cons) <= sizeof(intf->out),
+ ("console send ring inconsistent"));
while ((sent < len) && ((prod - cons) < sizeof(intf->out)))
intf->out[MASK_XENCONS_IDX(prod++, intf->out)] = data[sent++];
@@ -119,15 +125,18 @@ xencons_ring_init(void)
return 0;
err = bind_caller_port_to_irqhandler(xen_start_info->console_evtchn,
- "xencons", xencons_handle_input, NULL,
- INTR_TYPE_MISC | INTR_MPSAFE, NULL);
+ "xencons", xencons_handle_input, NULL,
+ INTR_TYPE_MISC | INTR_MPSAFE, &console_irq);
if (err) {
return err;
}
return 0;
}
-#ifdef notyet
+
+extern void xencons_suspend(void);
+extern void xencons_resume(void);
+
void
xencons_suspend(void)
{
@@ -135,7 +144,7 @@ xencons_suspend(void)
if (!xen_start_info->console_evtchn)
return;
- unbind_evtchn_from_irqhandler(xen_start_info->console_evtchn, NULL);
+ unbind_from_irqhandler(console_irq);
}
void
@@ -144,7 +153,7 @@ xencons_resume(void)
(void)xencons_ring_init();
}
-#endif
+
/*
* Local variables:
* mode: C
Modified: user/dfr/xenhvm/7/sys/dev/xen/netfront/netfront.c
==============================================================================
--- user/dfr/xenhvm/7/sys/dev/xen/netfront/netfront.c Mon Feb 16 17:43:45 2009 (r188686)
+++ user/dfr/xenhvm/7/sys/dev/xen/netfront/netfront.c Mon Feb 16 17:45:29 2009 (r188687)
@@ -24,7 +24,6 @@ __FBSDID("$FreeBSD$");
#include <sys/systm.h>
#include <sys/sockio.h>
#include <sys/mbuf.h>
-#include <sys/lock.h>
#include <sys/malloc.h>
#include <sys/module.h>
#include <sys/kernel.h>
@@ -64,18 +63,21 @@ __FBSDID("$FreeBSD$");
#include <machine/intr_machdep.h>
#include <machine/xen/xen-os.h>
+#include <machine/xen/xenfunc.h>
#include <xen/hypervisor.h>
#include <xen/xen_intr.h>
#include <xen/evtchn.h>
#include <xen/gnttab.h>
#include <xen/interface/memory.h>
-#include <dev/xen/netfront/mbufq.h>
-#include <machine/xen/features.h>
#include <xen/interface/io/netif.h>
#include <xen/xenbus/xenbusvar.h>
+#include <dev/xen/netfront/mbufq.h>
+
#include "xenbus_if.h"
+#define XN_CSUM_FEATURES (CSUM_TCP | CSUM_UDP)
+
#define GRANT_INVALID_REF 0
#define NET_TX_RING_SIZE __RING_SIZE((netif_tx_sring_t *)0, PAGE_SIZE)
@@ -330,9 +332,12 @@ xennet_get_rx_ref(struct netfront_info *
printf("[XEN] " fmt, ##args)
#define WPRINTK(fmt, args...) \
printf("[XEN] " fmt, ##args)
+#if 0
#define DPRINTK(fmt, args...) \
printf("[XEN] %s: " fmt, __func__, ##args)
-
+#else
+#define DPRINTK(fmt, args...)
+#endif
static __inline struct mbuf*
makembuf (struct mbuf *buf)
@@ -352,7 +357,7 @@ makembuf (struct mbuf *buf)
m_copydata(buf, 0, buf->m_pkthdr.len, mtod(m,caddr_t) );
m->m_ext.ext_args = (caddr_t *)(uintptr_t)(vtophys(mtod(m,caddr_t)) >> PAGE_SHIFT);
-
+
return m;
}
@@ -490,11 +495,6 @@ talk_to_backend(device_t dev, struct net
message = "writing feature-rx-notify";
goto abort_transaction;
}
- err = xenbus_printf(xbt, node, "feature-no-csum-offload", "%d", 1);
- if (err) {
- message = "writing feature-no-csum-offload";
- goto abort_transaction;
- }
err = xenbus_printf(xbt, node, "feature-sg", "%d", 1);
if (err) {
message = "writing feature-sg";
@@ -570,7 +570,7 @@ setup_device(device_t dev, struct netfro
goto fail;
error = bind_listening_port_to_irqhandler(xenbus_get_otherend_id(dev),
- "xn", xn_intr, info, INTR_TYPE_NET | INTR_MPSAFE, &info->irq);
+ "xn", xn_intr, info, INTR_TYPE_NET | INTR_MPSAFE, &info->irq);
if (error) {
xenbus_dev_fatal(dev, error,
@@ -588,6 +588,24 @@ setup_device(device_t dev, struct netfro
}
/**
+ * If this interface has an ipv4 address, send an arp for it. This
+ * helps to get the network going again after migrating hosts.
+ */
+static void
+netfront_send_fake_arp(device_t dev, struct netfront_info *info)
+{
+ struct ifnet *ifp;
+ struct ifaddr *ifa;
+
+ ifp = info->xn_ifp;
+ TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
+ if (ifa->ifa_addr->sa_family == AF_INET) {
+ arp_ifinit(ifp, ifa);
+ }
+ }
+}
+
+/**
* Callback received when the backend's state changes.
*/
static void
@@ -612,9 +630,7 @@ netfront_backend_changed(device_t dev, X
if (network_connect(sc) != 0)
break;
xenbus_set_state(dev, XenbusStateConnected);
-#ifdef notyet
- (void)send_fake_arp(netdev);
-#endif
+ netfront_send_fake_arp(dev, sc);
break;
case XenbusStateClosing:
xenbus_set_state(dev, XenbusStateClosed);
@@ -1236,12 +1252,11 @@ xennet_get_responses(struct netfront_inf
gnttab_release_grant_reference(&np->gref_rx_head, ref);
next:
- if (m == NULL)
- break;
-
- m->m_len = rx->status;
- m->m_data += rx->offset;
- m0->m_pkthdr.len += rx->status;
+ if (m != NULL) {
+ m->m_len = rx->status;
+ m->m_data += rx->offset;
+ m0->m_pkthdr.len += rx->status;
+ }
if (!(rx->flags & NETRXF_more_data))
break;
@@ -1348,10 +1363,10 @@ xn_start_locked(struct ifnet *ifp)
mfn, GNTMAP_readonly);
tx->gref = sc->grant_tx_ref[id] = ref;
tx->size = new_m->m_pkthdr.len;
-#if 0
- tx->flags = (skb->ip_summed == CHECKSUM_HW) ? NETTXF_csum_blank : 0;
-#endif
- tx->flags = 0;
+ if (new_m->m_pkthdr.csum_flags & CSUM_DELAY_DATA)
+ tx->flags = NETTXF_csum_blank | NETTXF_data_validated;
+ else
+ tx->flags = 0;
new_m->m_next = NULL;
new_m->m_nextpkt = NULL;
@@ -1446,9 +1461,9 @@ xn_ioctl(struct ifnet *ifp, u_long cmd,
if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
xn_ifinit_locked(sc);
arp_ifinit(ifp, ifa);
- XN_UNLOCK(sc);
+ XN_UNLOCK(sc);
} else {
- XN_UNLOCK(sc);
+ XN_UNLOCK(sc);
error = ether_ioctl(ifp, cmd, data);
}
break;
@@ -1716,11 +1731,9 @@ create_netdev(device_t dev)
ifp->if_mtu = ETHERMTU;
ifp->if_snd.ifq_maxlen = NET_TX_RING_SIZE - 1;
-#ifdef notyet
ifp->if_hwassist = XN_CSUM_FEATURES;
ifp->if_capabilities = IFCAP_HWCSUM;
ifp->if_capenable = ifp->if_capabilities;
-#endif
ether_ifattach(ifp, np->mac);
callout_init(&np->xn_stat_ch, CALLOUT_MPSAFE);
More information about the svn-src-user
mailing list