diff options
| author | mrj <none@none> | 2007-12-21 14:13:23 -0800 |
|---|---|---|
| committer | mrj <none@none> | 2007-12-21 14:13:23 -0800 |
| commit | 551bc2a66868b5cb5be6b70ab9f55515e77a39a9 (patch) | |
| tree | a01e761c9864ea9483c468ced858a0f67edcbf93 /usr/src/uts/common/xen/io/xdf.c | |
| parent | 71a79fe7afa36dcf0de6902c2c6ef432980534d3 (diff) | |
| download | illumos-joyent-551bc2a66868b5cb5be6b70ab9f55515e77a39a9.tar.gz | |
PSARC 2007/664 Paravirtualized Drivers for Fully Virtualized xVM Domains
6525093 xnb/xnf should use hypervisor based copy for xnb->xnf data path
6608917 members of struct xnf and xnb need unique names
6609324 deadlock trying to own the HAT migrate lock
6609805 still missing XPV_DISALLOW_MIGRATE/XPV_ALLOW_MIGRATE bracketing in hat_i86.c
6616384 xnb's grant ref unmapping is inefficient
6619947 Solaris should provide a PV network driver for xVM HVM environments
6632774 panic setting up xen console
--HG--
rename : usr/src/uts/i86xpv/os/gnttab.c => usr/src/uts/common/xen/os/gnttab.c
rename : usr/src/uts/i86xpv/os/hypercall.c => usr/src/uts/common/xen/os/hypercall.c
rename : usr/src/uts/i86xpv/sys/gnttab.h => usr/src/uts/common/xen/sys/gnttab.h
rename : usr/src/uts/i86xpv/ml/hypersubr.s => usr/src/uts/intel/ia32/ml/hypersubr.s
rename : usr/src/uts/i86xpv/sys/hypervisor.h => usr/src/uts/intel/sys/hypervisor.h
rename : usr/src/uts/i86xpv/sys/xen_errno.h => usr/src/uts/intel/sys/xen_errno.h
Diffstat (limited to 'usr/src/uts/common/xen/io/xdf.c')
| -rw-r--r-- | usr/src/uts/common/xen/io/xdf.c | 58 |
1 files changed, 55 insertions, 3 deletions
diff --git a/usr/src/uts/common/xen/io/xdf.c b/usr/src/uts/common/xen/io/xdf.c index c820bb27c5..4d695ec992 100644 --- a/usr/src/uts/common/xen/io/xdf.c +++ b/usr/src/uts/common/xen/io/xdf.c @@ -33,7 +33,30 @@ #pragma ident "%Z%%M% %I% %E% SMI" -#include "xdf.h" +#include <sys/types.h> +#include <sys/conf.h> +#include <sys/ddi.h> +#include <sys/dditypes.h> +#include <sys/sunddi.h> +#include <sys/list.h> +#include <sys/cmlb.h> +#include <sys/dkio.h> +#include <sys/vtoc.h> +#include <sys/modctl.h> +#include <sys/bootconf.h> +#include <sys/promif.h> +#include <sys/sysmacros.h> +#include <sys/kstat.h> +#include <sys/mach_mmu.h> +#ifdef XPV_HVM_DRIVER +#include <sys/xpv_support.h> +#endif +#include <public/io/xenbus.h> +#include <xen/sys/xenbus_impl.h> +#include <xen/sys/xendev.h> +#include <sys/gnttab.h> +#include <sys/scsi/generic/inquiry.h> +#include <io/xdf.h> #define FLUSH_DISKCACHE 0x1 #define WRITE_BARRIER 0x2 @@ -302,6 +325,16 @@ xdf_attach(dev_info_t *devi, ddi_attach_cmd_t cmd) ddi_iblock_cookie_t ibc; ddi_iblock_cookie_t softibc; int instance; +#if defined(XPV_HVM_DRIVER) && defined(__i386) + /* XXX: 6609126 32-bit xdf driver panics on a 64-bit dom0 */ + extern int xen_is_64bit; + + if (xen_is_64bit) { + cmn_err(CE_WARN, "xdf cannot be used in 32-bit domUs on a" + " 64-bit dom0."); + return (DDI_FAILURE); + } +#endif xdfdebug = ddi_prop_get_int(DDI_DEV_T_ANY, devi, DDI_PROP_NOTPROM, "xdfdebug", 0); @@ -534,7 +567,11 @@ xdf_suspend(dev_info_t *devi) /* make sure no more I/O responses left in the ring buffer */ if ((st == XD_INIT) || (st == XD_READY)) { +#ifdef XPV_HVM_DRIVER + ec_unbind_evtchn(vdp->xdf_evtchn); +#else (void) ddi_remove_intr(devi, 0, NULL); +#endif (void) xdf_drain_io(vdp); /* * no need to teardown the ring buffer here @@ -1437,7 +1474,9 @@ xdf_drain_io(xdf_t *vdp) if (!xvdi_ring_has_incomp_request(xbr)) goto out; +#ifndef XPV_HVM_DRIVER (void) HYPERVISOR_yield(); +#endif /* * file-backed devices can be slow */ @@ -1616,12 +1655,17 @@ xdf_start_connect(xdf_t *vdp) ddi_get_name_addr(dip)); goto errout; } + vdp->xdf_evtchn = xvdi_get_evtchn(dip); +#ifdef XPV_HVM_DRIVER + ec_bind_evtchn_to_handler(vdp->xdf_evtchn, IPL_VBD, xdf_intr, vdp); +#else if (ddi_add_intr(dip, 0, NULL, NULL, xdf_intr, (caddr_t)vdp) != DDI_SUCCESS) { cmn_err(CE_WARN, "xdf_start_connect: xdf@%s: " "failed to add intr handler", ddi_get_name_addr(dip)); goto errout1; } +#endif if (xvdi_alloc_ring(dip, BLKIF_RING_SIZE, sizeof (union blkif_sring_entry), &gref, &vdp->xdf_xb_ring) != @@ -1657,7 +1701,7 @@ trans_retry: } if (rv = xenbus_printf(xbt, xsnode, "event-channel", "%u", - xvdi_get_evtchn(dip))) { + vdp->xdf_evtchn)) { cmn_err(CE_WARN, "xdf@%s: failed to write event-channel", ddi_get_name_addr(dip)); xvdi_fatal_error(dip, rv, "writing event-channel"); @@ -1694,7 +1738,11 @@ abort_trans: fail_trans: xvdi_free_ring(vdp->xdf_xb_ring); errout2: +#ifdef XPV_HVM_DRIVER + ec_unbind_evtchn(vdp->xdf_evtchn); +#else (void) ddi_remove_intr(vdp->xdf_dip, 0, NULL); +#endif errout1: xvdi_free_evtchn(dip); errout: @@ -1786,7 +1834,7 @@ xdf_post_connect(xdf_t *vdp) /* * We've created all the minor nodes via cmlb_attach() using default - * value in xdf_attach() to make it possbile to block in xdf_open(), + * value in xdf_attach() to make it possible to block in xdf_open(), * in case there's anyone (say, booting thread) ever trying to open * it before connected to backend. We will refresh all those minor * nodes w/ latest info we've got now when we are almost connected. @@ -1857,7 +1905,11 @@ xdf_post_connect(xdf_t *vdp) static void xdf_post_disconnect(xdf_t *vdp) { +#ifdef XPV_HVM_DRIVER + ec_unbind_evtchn(vdp->xdf_evtchn); +#else (void) ddi_remove_intr(vdp->xdf_dip, 0, NULL); +#endif xvdi_free_evtchn(vdp->xdf_dip); xvdi_free_ring(vdp->xdf_xb_ring); vdp->xdf_xb_ring = NULL; |
