xen: allow disabling PV disks and nics
Introduce two new loader tunnables that can be used to disable PV disks and PV nics at boot time. They default to 0 and should be set to 1 (or any number different than 0) in order to disable the PV devices: hw.xen.disable_pv_disks=1 hw.xen.disable_pv_nics=1 In /boot/loader.conf will disable both PV disks and nics. Sponsored by: Citrix Systems R&D Tested by: Karl Pielorz <kpielorz_lst@tdx.co.uk> MFC after: 1 week
This commit is contained in:
parent
b005264e84
commit
f8f1bb83f7
@ -1366,6 +1366,9 @@ xbd_probe(device_t dev)
|
||||
if (strcmp(xenbus_get_type(dev), "vbd") != 0)
|
||||
return (ENXIO);
|
||||
|
||||
if (xen_hvm_domain() && xen_disable_pv_disks != 0)
|
||||
return (ENXIO);
|
||||
|
||||
if (xen_hvm_domain()) {
|
||||
int error;
|
||||
char *type;
|
||||
|
@ -445,6 +445,9 @@ static int
|
||||
netfront_probe(device_t dev)
|
||||
{
|
||||
|
||||
if (xen_hvm_domain() && xen_disable_pv_nics != 0)
|
||||
return (ENXIO);
|
||||
|
||||
if (!strcmp(xenbus_get_type(dev), "vif")) {
|
||||
device_set_desc(dev, "Virtual Network Interface");
|
||||
return (0);
|
||||
|
@ -100,8 +100,15 @@ DPCPU_DEFINE(struct vcpu_info *, vcpu_info);
|
||||
shared_info_t *HYPERVISOR_shared_info;
|
||||
start_info_t *HYPERVISOR_start_info;
|
||||
|
||||
|
||||
/*------------------------------ Sysctl tunables -----------------------------*/
|
||||
int xen_disable_pv_disks = 0;
|
||||
int xen_disable_pv_nics = 0;
|
||||
TUNABLE_INT("hw.xen.disable_pv_disks", &xen_disable_pv_disks);
|
||||
TUNABLE_INT("hw.xen.disable_pv_nics", &xen_disable_pv_nics);
|
||||
|
||||
#ifdef SMP
|
||||
/* XEN diverged cpu operations */
|
||||
/*---------------------- XEN diverged cpu operations -------------------------*/
|
||||
static void
|
||||
xen_hvm_cpu_resume(void)
|
||||
{
|
||||
@ -256,21 +263,34 @@ enum {
|
||||
static void
|
||||
xen_hvm_disable_emulated_devices(void)
|
||||
{
|
||||
u_short disable_devs = 0;
|
||||
|
||||
if (xen_pv_domain()) {
|
||||
/*
|
||||
* No emulated devices in the PV case, so no need to unplug
|
||||
* anything.
|
||||
*/
|
||||
if (xen_disable_pv_disks != 0 || xen_disable_pv_nics != 0)
|
||||
printf("PV devices cannot be disabled in PV guests\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (inw(XEN_MAGIC_IOPORT) != XMI_MAGIC)
|
||||
return;
|
||||
|
||||
if (bootverbose)
|
||||
printf("XEN: Disabling emulated block and network devices\n");
|
||||
outw(XEN_MAGIC_IOPORT, XMI_UNPLUG_IDE_DISKS|XMI_UNPLUG_NICS);
|
||||
if (xen_disable_pv_disks == 0) {
|
||||
if (bootverbose)
|
||||
printf("XEN: disabling emulated disks\n");
|
||||
disable_devs |= XMI_UNPLUG_IDE_DISKS;
|
||||
}
|
||||
if (xen_disable_pv_nics == 0) {
|
||||
if (bootverbose)
|
||||
printf("XEN: disabling emulated nics\n");
|
||||
disable_devs |= XMI_UNPLUG_NICS;
|
||||
}
|
||||
|
||||
if (disable_devs != 0)
|
||||
outw(XEN_MAGIC_IOPORT, disable_devs);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -56,6 +56,9 @@ extern start_info_t *HYPERVISOR_start_info;
|
||||
/* XXX: we need to get rid of this and use HYPERVISOR_start_info directly */
|
||||
extern char *console_page;
|
||||
|
||||
extern int xen_disable_pv_disks;
|
||||
extern int xen_disable_pv_nics;
|
||||
|
||||
enum xen_domain_type {
|
||||
XEN_NATIVE, /* running on bare hardware */
|
||||
XEN_PV_DOMAIN, /* running in a PV domain */
|
||||
|
Loading…
Reference in New Issue
Block a user