Support default block interfaces per QEMUMachine

There are QEMUMachines that have neither IF_IDE nor IF_SCSI as a
default/standard interface to their block devices / drives. Therefore,
this patch introduces a new field default_block_type per QEMUMachine
struct. The prior use_scsi field becomes thereby obsolete and is
replaced through .default_block_type = IF_SCSI.

This patch also changes the default for s390x to IF_VIRTIO and
removes an early hack that converts IF_IDE drives.
Other parties have already claimed interest (e.g. IF_SD for exynos)

To create a sane default, for machines that dont specify a
default_block_type, this patch makes IF_IDE = 0 and IF_NONE = 1.
I checked all users of IF_NONE (blockdev.c and ww/device-hotplug.c)
as well as IF_IDE and it seems that it is ok to change the defines -
in other words, I found no obvious (to me) assumption in the code
regarding IF_NONE==0. IF_NONE is only set if there is an
explicit if=none. Without if=* the interface becomes IF_DEFAULT.

I would suggest to have some additional care, e.g. by letting
this patch sit some days in the block tree.

Based on an initial patch from Einar Lueck <elelueck@de.ibm.com>

Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
CC: Igor Mitsyanko <i.mitsyanko@samsung.com>
CC: Markus Armbruster <armbru@redhat.com>
CC: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Alexander Graf <agraf@suse.de>
Acked-by: Igor Mitsyanko <i.mitsyanko@samsung.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
Christian Borntraeger 2012-11-20 15:30:34 +01:00 committed by Kevin Wolf
parent c208e8c2d8
commit 2d0d2837dc
17 changed files with 51 additions and 57 deletions

View File

@ -275,7 +275,7 @@ static bool do_check_io_limits(BlockIOLimit *io_limits)
return true; return true;
} }
DriveInfo *drive_init(QemuOpts *opts, int default_to_scsi) DriveInfo *drive_init(QemuOpts *opts, BlockInterfaceType block_default_type)
{ {
const char *buf; const char *buf;
const char *file = NULL; const char *file = NULL;
@ -325,7 +325,7 @@ DriveInfo *drive_init(QemuOpts *opts, int default_to_scsi)
return NULL; return NULL;
} }
} else { } else {
type = default_to_scsi ? IF_SCSI : IF_IDE; type = block_default_type;
} }
max_devs = if_max_devs[type]; max_devs = if_max_devs[type];

View File

@ -19,8 +19,13 @@ void blockdev_auto_del(BlockDriverState *bs);
typedef enum { typedef enum {
IF_DEFAULT = -1, /* for use with drive_add() only */ IF_DEFAULT = -1, /* for use with drive_add() only */
/*
* IF_IDE must be zero, because we want QEMUMachine member
* block_default_type to default-initialize to IF_IDE
*/
IF_IDE = 0,
IF_NONE, IF_NONE,
IF_IDE, IF_SCSI, IF_FLOPPY, IF_PFLASH, IF_MTD, IF_SD, IF_VIRTIO, IF_XEN, IF_SCSI, IF_FLOPPY, IF_PFLASH, IF_MTD, IF_SD, IF_VIRTIO, IF_XEN,
IF_COUNT IF_COUNT
} BlockInterfaceType; } BlockInterfaceType;
@ -51,7 +56,7 @@ DriveInfo *drive_get_by_blockdev(BlockDriverState *bs);
QemuOpts *drive_def(const char *optstr); QemuOpts *drive_def(const char *optstr);
QemuOpts *drive_add(BlockInterfaceType type, int index, const char *file, QemuOpts *drive_add(BlockInterfaceType type, int index, const char *file,
const char *optstr); const char *optstr);
DriveInfo *drive_init(QemuOpts *arg, int default_to_scsi); DriveInfo *drive_init(QemuOpts *arg, BlockInterfaceType block_default_type);
/* device-hotplug */ /* device-hotplug */

View File

@ -3,6 +3,7 @@
#ifndef HW_BOARDS_H #ifndef HW_BOARDS_H
#define HW_BOARDS_H #define HW_BOARDS_H
#include "blockdev.h"
#include "qdev.h" #include "qdev.h"
typedef struct QEMUMachineInitArgs { typedef struct QEMUMachineInitArgs {
@ -24,7 +25,7 @@ typedef struct QEMUMachine {
const char *desc; const char *desc;
QEMUMachineInitFunc *init; QEMUMachineInitFunc *init;
QEMUMachineResetFunc *reset; QEMUMachineResetFunc *reset;
int use_scsi; BlockInterfaceType block_default_type;
int max_cpus; int max_cpus;
unsigned int no_serial:1, unsigned int no_serial:1,
no_parallel:1, no_parallel:1,

View File

@ -39,7 +39,7 @@ DriveInfo *add_init_drive(const char *optstr)
if (!opts) if (!opts)
return NULL; return NULL;
dinfo = drive_init(opts, current_machine->use_scsi); dinfo = drive_init(opts, current_machine->block_default_type);
if (!dinfo) { if (!dinfo) {
qemu_opts_del(opts); qemu_opts_del(opts);
return NULL; return NULL;

View File

@ -326,7 +326,7 @@ static QEMUMachine highbank_machine = {
.name = "highbank", .name = "highbank",
.desc = "Calxeda Highbank (ECX-1000)", .desc = "Calxeda Highbank (ECX-1000)",
.init = highbank_init, .init = highbank_init,
.use_scsi = 1, .block_default_type = IF_SCSI,
.max_cpus = 4, .max_cpus = 4,
}; };

View File

@ -212,7 +212,6 @@ static QEMUMachine leon3_generic_machine = {
.name = "leon3_generic", .name = "leon3_generic",
.desc = "Leon-3 generic", .desc = "Leon-3 generic",
.init = leon3_generic_hw_init, .init = leon3_generic_hw_init,
.use_scsi = 0,
}; };
static void leon3_machine_init(void) static void leon3_machine_init(void)

View File

@ -324,14 +324,14 @@ static QEMUMachine mips_magnum_machine = {
.name = "magnum", .name = "magnum",
.desc = "MIPS Magnum", .desc = "MIPS Magnum",
.init = mips_magnum_init, .init = mips_magnum_init,
.use_scsi = 1, .block_default_type = IF_SCSI,
}; };
static QEMUMachine mips_pica61_machine = { static QEMUMachine mips_pica61_machine = {
.name = "pica61", .name = "pica61",
.desc = "Acer Pica 61", .desc = "Acer Pica 61",
.init = mips_pica61_init, .init = mips_pica61_init,
.use_scsi = 1, .block_default_type = IF_SCSI,
}; };
static void mips_jazz_machine_init(void) static void mips_jazz_machine_init(void)

View File

@ -98,7 +98,7 @@ static void pc_fw_add_pflash_drv(void)
return; return;
} }
if (!drive_init(opts, machine->use_scsi)) { if (!drive_init(opts, machine->block_default_type)) {
qemu_opts_del(opts); qemu_opts_del(opts);
} }
} }

View File

@ -122,7 +122,6 @@ static QEMUMachine puv3_machine = {
.desc = "PKUnity Version-3 based on UniCore32", .desc = "PKUnity Version-3 based on UniCore32",
.init = puv3_init, .init = puv3_init,
.is_default = 1, .is_default = 1,
.use_scsi = 0,
}; };
static void puv3_machine_init(void) static void puv3_machine_init(void)

View File

@ -364,14 +364,14 @@ static QEMUMachine realview_eb_machine = {
.name = "realview-eb", .name = "realview-eb",
.desc = "ARM RealView Emulation Baseboard (ARM926EJ-S)", .desc = "ARM RealView Emulation Baseboard (ARM926EJ-S)",
.init = realview_eb_init, .init = realview_eb_init,
.use_scsi = 1, .block_default_type = IF_SCSI,
}; };
static QEMUMachine realview_eb_mpcore_machine = { static QEMUMachine realview_eb_mpcore_machine = {
.name = "realview-eb-mpcore", .name = "realview-eb-mpcore",
.desc = "ARM RealView Emulation Baseboard (ARM11MPCore)", .desc = "ARM RealView Emulation Baseboard (ARM11MPCore)",
.init = realview_eb_mpcore_init, .init = realview_eb_mpcore_init,
.use_scsi = 1, .block_default_type = IF_SCSI,
.max_cpus = 4, .max_cpus = 4,
}; };
@ -385,7 +385,7 @@ static QEMUMachine realview_pbx_a9_machine = {
.name = "realview-pbx-a9", .name = "realview-pbx-a9",
.desc = "ARM RealView Platform Baseboard Explore for Cortex-A9", .desc = "ARM RealView Platform Baseboard Explore for Cortex-A9",
.init = realview_pbx_a9_init, .init = realview_pbx_a9_init,
.use_scsi = 1, .block_default_type = IF_SCSI,
.max_cpus = 4, .max_cpus = 4,
}; };

View File

@ -314,21 +314,6 @@ static void s390_init(QEMUMachineInitArgs *args)
qdev_set_nic_properties(dev, nd); qdev_set_nic_properties(dev, nd);
qdev_init_nofail(dev); qdev_init_nofail(dev);
} }
/* Create VirtIO disk drives */
for(i = 0; i < MAX_BLK_DEVS; i++) {
DriveInfo *dinfo;
DeviceState *dev;
dinfo = drive_get(IF_IDE, 0, i);
if (!dinfo) {
continue;
}
dev = qdev_create((BusState *)s390_bus, "virtio-blk-s390");
qdev_prop_set_drive_nofail(dev, "drive", dinfo->bdrv);
qdev_init_nofail(dev);
}
} }
static QEMUMachine s390_machine = { static QEMUMachine s390_machine = {
@ -336,6 +321,7 @@ static QEMUMachine s390_machine = {
.alias = "s390", .alias = "s390",
.desc = "VirtIO based S390 machine", .desc = "VirtIO based S390 machine",
.init = s390_init, .init = s390_init,
.block_default_type = IF_VIRTIO,
.no_cdrom = 1, .no_cdrom = 1,
.no_floppy = 1, .no_floppy = 1,
.no_serial = 1, .no_serial = 1,
@ -352,3 +338,4 @@ static void s390_machine_init(void)
} }
machine_init(s390_machine_init); machine_init(s390_machine_init);

View File

@ -924,9 +924,9 @@ static QEMUMachine spapr_machine = {
.desc = "pSeries Logical Partition (PAPR compliant)", .desc = "pSeries Logical Partition (PAPR compliant)",
.init = ppc_spapr_init, .init = ppc_spapr_init,
.reset = ppc_spapr_reset, .reset = ppc_spapr_reset,
.block_default_type = IF_SCSI,
.max_cpus = MAX_CPUS, .max_cpus = MAX_CPUS,
.no_parallel = 1, .no_parallel = 1,
.use_scsi = 1,
}; };
static void spapr_machine_init(void) static void spapr_machine_init(void)

View File

@ -1426,7 +1426,7 @@ static QEMUMachine ss5_machine = {
.name = "SS-5", .name = "SS-5",
.desc = "Sun4m platform, SPARCstation 5", .desc = "Sun4m platform, SPARCstation 5",
.init = ss5_init, .init = ss5_init,
.use_scsi = 1, .block_default_type = IF_SCSI,
.is_default = 1, .is_default = 1,
}; };
@ -1434,7 +1434,7 @@ static QEMUMachine ss10_machine = {
.name = "SS-10", .name = "SS-10",
.desc = "Sun4m platform, SPARCstation 10", .desc = "Sun4m platform, SPARCstation 10",
.init = ss10_init, .init = ss10_init,
.use_scsi = 1, .block_default_type = IF_SCSI,
.max_cpus = 4, .max_cpus = 4,
}; };
@ -1442,7 +1442,7 @@ static QEMUMachine ss600mp_machine = {
.name = "SS-600MP", .name = "SS-600MP",
.desc = "Sun4m platform, SPARCserver 600MP", .desc = "Sun4m platform, SPARCserver 600MP",
.init = ss600mp_init, .init = ss600mp_init,
.use_scsi = 1, .block_default_type = IF_SCSI,
.max_cpus = 4, .max_cpus = 4,
}; };
@ -1450,7 +1450,7 @@ static QEMUMachine ss20_machine = {
.name = "SS-20", .name = "SS-20",
.desc = "Sun4m platform, SPARCstation 20", .desc = "Sun4m platform, SPARCstation 20",
.init = ss20_init, .init = ss20_init,
.use_scsi = 1, .block_default_type = IF_SCSI,
.max_cpus = 4, .max_cpus = 4,
}; };
@ -1458,35 +1458,35 @@ static QEMUMachine voyager_machine = {
.name = "Voyager", .name = "Voyager",
.desc = "Sun4m platform, SPARCstation Voyager", .desc = "Sun4m platform, SPARCstation Voyager",
.init = vger_init, .init = vger_init,
.use_scsi = 1, .block_default_type = IF_SCSI,
}; };
static QEMUMachine ss_lx_machine = { static QEMUMachine ss_lx_machine = {
.name = "LX", .name = "LX",
.desc = "Sun4m platform, SPARCstation LX", .desc = "Sun4m platform, SPARCstation LX",
.init = ss_lx_init, .init = ss_lx_init,
.use_scsi = 1, .block_default_type = IF_SCSI,
}; };
static QEMUMachine ss4_machine = { static QEMUMachine ss4_machine = {
.name = "SS-4", .name = "SS-4",
.desc = "Sun4m platform, SPARCstation 4", .desc = "Sun4m platform, SPARCstation 4",
.init = ss4_init, .init = ss4_init,
.use_scsi = 1, .block_default_type = IF_SCSI,
}; };
static QEMUMachine scls_machine = { static QEMUMachine scls_machine = {
.name = "SPARCClassic", .name = "SPARCClassic",
.desc = "Sun4m platform, SPARCClassic", .desc = "Sun4m platform, SPARCClassic",
.init = scls_init, .init = scls_init,
.use_scsi = 1, .block_default_type = IF_SCSI,
}; };
static QEMUMachine sbook_machine = { static QEMUMachine sbook_machine = {
.name = "SPARCbook", .name = "SPARCbook",
.desc = "Sun4m platform, SPARCbook", .desc = "Sun4m platform, SPARCbook",
.init = sbook_init, .init = sbook_init,
.use_scsi = 1, .block_default_type = IF_SCSI,
}; };
static const struct sun4d_hwdef sun4d_hwdefs[] = { static const struct sun4d_hwdef sun4d_hwdefs[] = {
@ -1709,7 +1709,7 @@ static QEMUMachine ss1000_machine = {
.name = "SS-1000", .name = "SS-1000",
.desc = "Sun4d platform, SPARCserver 1000", .desc = "Sun4d platform, SPARCserver 1000",
.init = ss1000_init, .init = ss1000_init,
.use_scsi = 1, .block_default_type = IF_SCSI,
.max_cpus = 8, .max_cpus = 8,
}; };
@ -1717,7 +1717,7 @@ static QEMUMachine ss2000_machine = {
.name = "SS-2000", .name = "SS-2000",
.desc = "Sun4d platform, SPARCcenter 2000", .desc = "Sun4d platform, SPARCcenter 2000",
.init = ss2000_init, .init = ss2000_init,
.use_scsi = 1, .block_default_type = IF_SCSI,
.max_cpus = 20, .max_cpus = 20,
}; };
@ -1896,7 +1896,7 @@ static QEMUMachine ss2_machine = {
.name = "SS-2", .name = "SS-2",
.desc = "Sun4c platform, SPARCstation 2", .desc = "Sun4c platform, SPARCstation 2",
.init = ss2_init, .init = ss2_init,
.use_scsi = 1, .block_default_type = IF_SCSI,
}; };
static void sun4m_register_types(void) static void sun4m_register_types(void)

View File

@ -358,14 +358,14 @@ static QEMUMachine versatilepb_machine = {
.name = "versatilepb", .name = "versatilepb",
.desc = "ARM Versatile/PB (ARM926EJ-S)", .desc = "ARM Versatile/PB (ARM926EJ-S)",
.init = vpb_init, .init = vpb_init,
.use_scsi = 1, .block_default_type = IF_SCSI,
}; };
static QEMUMachine versatileab_machine = { static QEMUMachine versatileab_machine = {
.name = "versatileab", .name = "versatileab",
.desc = "ARM Versatile/AB (ARM926EJ-S)", .desc = "ARM Versatile/AB (ARM926EJ-S)",
.init = vab_init, .init = vab_init,
.use_scsi = 1, .block_default_type = IF_SCSI,
}; };
static void versatile_machine_init(void) static void versatile_machine_init(void)

View File

@ -477,7 +477,7 @@ static QEMUMachine vexpress_a9_machine = {
.name = "vexpress-a9", .name = "vexpress-a9",
.desc = "ARM Versatile Express for Cortex-A9", .desc = "ARM Versatile Express for Cortex-A9",
.init = vexpress_a9_init, .init = vexpress_a9_init,
.use_scsi = 1, .block_default_type = IF_SCSI,
.max_cpus = 4, .max_cpus = 4,
}; };
@ -485,7 +485,7 @@ static QEMUMachine vexpress_a15_machine = {
.name = "vexpress-a15", .name = "vexpress-a15",
.desc = "ARM Versatile Express for Cortex-A15", .desc = "ARM Versatile Express for Cortex-A15",
.init = vexpress_a15_init, .init = vexpress_a15_init,
.use_scsi = 1, .block_default_type = IF_SCSI,
.max_cpus = 4, .max_cpus = 4,
}; };

View File

@ -200,7 +200,7 @@ static QEMUMachine zynq_machine = {
.name = "xilinx-zynq-a9", .name = "xilinx-zynq-a9",
.desc = "Xilinx Zynq Platform Baseboard for Cortex-A9", .desc = "Xilinx Zynq Platform Baseboard for Cortex-A9",
.init = zynq_init, .init = zynq_init,
.use_scsi = 1, .block_default_type = IF_SCSI,
.max_cpus = 1, .max_cpus = 1,
.no_sdcard = 1 .no_sdcard = 1
}; };

21
vl.c
View File

@ -886,9 +886,9 @@ static int cleanup_add_fd(QemuOpts *opts, void *opaque)
static int drive_init_func(QemuOpts *opts, void *opaque) static int drive_init_func(QemuOpts *opts, void *opaque)
{ {
int *use_scsi = opaque; BlockInterfaceType *block_default_type = opaque;
return drive_init(opts, *use_scsi) == NULL; return drive_init(opts, *block_default_type) == NULL;
} }
static int drive_enable_snapshot(QemuOpts *opts, void *opaque) static int drive_enable_snapshot(QemuOpts *opts, void *opaque)
@ -899,14 +899,15 @@ static int drive_enable_snapshot(QemuOpts *opts, void *opaque)
return 0; return 0;
} }
static void default_drive(int enable, int snapshot, int use_scsi, static void default_drive(int enable, int snapshot,
BlockInterfaceType block_default_type,
BlockInterfaceType type, int index, BlockInterfaceType type, int index,
const char *optstr) const char *optstr)
{ {
QemuOpts *opts; QemuOpts *opts;
if (type == IF_DEFAULT) { if (type == IF_DEFAULT) {
type = use_scsi ? IF_SCSI : IF_IDE; type = block_default_type;
} }
if (!enable || drive_get_by_index(type, index)) { if (!enable || drive_get_by_index(type, index)) {
@ -917,7 +918,7 @@ static void default_drive(int enable, int snapshot, int use_scsi,
if (snapshot) { if (snapshot) {
drive_enable_snapshot(opts, NULL); drive_enable_snapshot(opts, NULL);
} }
if (!drive_init(opts, use_scsi)) { if (!drive_init(opts, type)) {
exit(1); exit(1);
} }
} }
@ -3770,14 +3771,16 @@ int main(int argc, char **argv, char **envp)
/* open the virtual block devices */ /* open the virtual block devices */
if (snapshot) if (snapshot)
qemu_opts_foreach(qemu_find_opts("drive"), drive_enable_snapshot, NULL, 0); qemu_opts_foreach(qemu_find_opts("drive"), drive_enable_snapshot, NULL, 0);
if (qemu_opts_foreach(qemu_find_opts("drive"), drive_init_func, &machine->use_scsi, 1) != 0) if (qemu_opts_foreach(qemu_find_opts("drive"), drive_init_func,
&machine->block_default_type, 1) != 0) {
exit(1); exit(1);
}
default_drive(default_cdrom, snapshot, machine->use_scsi, default_drive(default_cdrom, snapshot, machine->block_default_type,
IF_DEFAULT, 2, CDROM_OPTS); IF_DEFAULT, 2, CDROM_OPTS);
default_drive(default_floppy, snapshot, machine->use_scsi, default_drive(default_floppy, snapshot, machine->block_default_type,
IF_FLOPPY, 0, FD_OPTS); IF_FLOPPY, 0, FD_OPTS);
default_drive(default_sdcard, snapshot, machine->use_scsi, default_drive(default_sdcard, snapshot, machine->block_default_type,
IF_SD, 0, SD_OPTS); IF_SD, 0, SD_OPTS);
register_savevm_live(NULL, "ram", 0, 4, &savevm_ram_handlers, NULL); register_savevm_live(NULL, "ram", 0, 4, &savevm_ram_handlers, NULL);