mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-11-05 20:35:44 +00:00
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:
parent
c208e8c2d8
commit
2d0d2837dc
17 changed files with 51 additions and 57 deletions
|
@ -275,7 +275,7 @@ static bool do_check_io_limits(BlockIOLimit *io_limits)
|
|||
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 *file = NULL;
|
||||
|
@ -325,7 +325,7 @@ DriveInfo *drive_init(QemuOpts *opts, int default_to_scsi)
|
|||
return NULL;
|
||||
}
|
||||
} else {
|
||||
type = default_to_scsi ? IF_SCSI : IF_IDE;
|
||||
type = block_default_type;
|
||||
}
|
||||
|
||||
max_devs = if_max_devs[type];
|
||||
|
|
|
@ -19,8 +19,13 @@ void blockdev_auto_del(BlockDriverState *bs);
|
|||
|
||||
typedef enum {
|
||||
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_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
|
||||
} BlockInterfaceType;
|
||||
|
||||
|
@ -51,7 +56,7 @@ DriveInfo *drive_get_by_blockdev(BlockDriverState *bs);
|
|||
QemuOpts *drive_def(const char *optstr);
|
||||
QemuOpts *drive_add(BlockInterfaceType type, int index, const char *file,
|
||||
const char *optstr);
|
||||
DriveInfo *drive_init(QemuOpts *arg, int default_to_scsi);
|
||||
DriveInfo *drive_init(QemuOpts *arg, BlockInterfaceType block_default_type);
|
||||
|
||||
/* device-hotplug */
|
||||
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
#ifndef HW_BOARDS_H
|
||||
#define HW_BOARDS_H
|
||||
|
||||
#include "blockdev.h"
|
||||
#include "qdev.h"
|
||||
|
||||
typedef struct QEMUMachineInitArgs {
|
||||
|
@ -24,7 +25,7 @@ typedef struct QEMUMachine {
|
|||
const char *desc;
|
||||
QEMUMachineInitFunc *init;
|
||||
QEMUMachineResetFunc *reset;
|
||||
int use_scsi;
|
||||
BlockInterfaceType block_default_type;
|
||||
int max_cpus;
|
||||
unsigned int no_serial:1,
|
||||
no_parallel:1,
|
||||
|
|
|
@ -39,7 +39,7 @@ DriveInfo *add_init_drive(const char *optstr)
|
|||
if (!opts)
|
||||
return NULL;
|
||||
|
||||
dinfo = drive_init(opts, current_machine->use_scsi);
|
||||
dinfo = drive_init(opts, current_machine->block_default_type);
|
||||
if (!dinfo) {
|
||||
qemu_opts_del(opts);
|
||||
return NULL;
|
||||
|
|
|
@ -326,7 +326,7 @@ static QEMUMachine highbank_machine = {
|
|||
.name = "highbank",
|
||||
.desc = "Calxeda Highbank (ECX-1000)",
|
||||
.init = highbank_init,
|
||||
.use_scsi = 1,
|
||||
.block_default_type = IF_SCSI,
|
||||
.max_cpus = 4,
|
||||
};
|
||||
|
||||
|
|
|
@ -212,7 +212,6 @@ static QEMUMachine leon3_generic_machine = {
|
|||
.name = "leon3_generic",
|
||||
.desc = "Leon-3 generic",
|
||||
.init = leon3_generic_hw_init,
|
||||
.use_scsi = 0,
|
||||
};
|
||||
|
||||
static void leon3_machine_init(void)
|
||||
|
|
|
@ -324,14 +324,14 @@ static QEMUMachine mips_magnum_machine = {
|
|||
.name = "magnum",
|
||||
.desc = "MIPS Magnum",
|
||||
.init = mips_magnum_init,
|
||||
.use_scsi = 1,
|
||||
.block_default_type = IF_SCSI,
|
||||
};
|
||||
|
||||
static QEMUMachine mips_pica61_machine = {
|
||||
.name = "pica61",
|
||||
.desc = "Acer Pica 61",
|
||||
.init = mips_pica61_init,
|
||||
.use_scsi = 1,
|
||||
.block_default_type = IF_SCSI,
|
||||
};
|
||||
|
||||
static void mips_jazz_machine_init(void)
|
||||
|
|
|
@ -98,7 +98,7 @@ static void pc_fw_add_pflash_drv(void)
|
|||
return;
|
||||
}
|
||||
|
||||
if (!drive_init(opts, machine->use_scsi)) {
|
||||
if (!drive_init(opts, machine->block_default_type)) {
|
||||
qemu_opts_del(opts);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -122,7 +122,6 @@ static QEMUMachine puv3_machine = {
|
|||
.desc = "PKUnity Version-3 based on UniCore32",
|
||||
.init = puv3_init,
|
||||
.is_default = 1,
|
||||
.use_scsi = 0,
|
||||
};
|
||||
|
||||
static void puv3_machine_init(void)
|
||||
|
|
|
@ -364,14 +364,14 @@ static QEMUMachine realview_eb_machine = {
|
|||
.name = "realview-eb",
|
||||
.desc = "ARM RealView Emulation Baseboard (ARM926EJ-S)",
|
||||
.init = realview_eb_init,
|
||||
.use_scsi = 1,
|
||||
.block_default_type = IF_SCSI,
|
||||
};
|
||||
|
||||
static QEMUMachine realview_eb_mpcore_machine = {
|
||||
.name = "realview-eb-mpcore",
|
||||
.desc = "ARM RealView Emulation Baseboard (ARM11MPCore)",
|
||||
.init = realview_eb_mpcore_init,
|
||||
.use_scsi = 1,
|
||||
.block_default_type = IF_SCSI,
|
||||
.max_cpus = 4,
|
||||
};
|
||||
|
||||
|
@ -385,7 +385,7 @@ static QEMUMachine realview_pbx_a9_machine = {
|
|||
.name = "realview-pbx-a9",
|
||||
.desc = "ARM RealView Platform Baseboard Explore for Cortex-A9",
|
||||
.init = realview_pbx_a9_init,
|
||||
.use_scsi = 1,
|
||||
.block_default_type = IF_SCSI,
|
||||
.max_cpus = 4,
|
||||
};
|
||||
|
||||
|
|
|
@ -314,21 +314,6 @@ static void s390_init(QEMUMachineInitArgs *args)
|
|||
qdev_set_nic_properties(dev, nd);
|
||||
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 = {
|
||||
|
@ -336,6 +321,7 @@ static QEMUMachine s390_machine = {
|
|||
.alias = "s390",
|
||||
.desc = "VirtIO based S390 machine",
|
||||
.init = s390_init,
|
||||
.block_default_type = IF_VIRTIO,
|
||||
.no_cdrom = 1,
|
||||
.no_floppy = 1,
|
||||
.no_serial = 1,
|
||||
|
@ -352,3 +338,4 @@ static void s390_machine_init(void)
|
|||
}
|
||||
|
||||
machine_init(s390_machine_init);
|
||||
|
||||
|
|
|
@ -924,9 +924,9 @@ static QEMUMachine spapr_machine = {
|
|||
.desc = "pSeries Logical Partition (PAPR compliant)",
|
||||
.init = ppc_spapr_init,
|
||||
.reset = ppc_spapr_reset,
|
||||
.block_default_type = IF_SCSI,
|
||||
.max_cpus = MAX_CPUS,
|
||||
.no_parallel = 1,
|
||||
.use_scsi = 1,
|
||||
};
|
||||
|
||||
static void spapr_machine_init(void)
|
||||
|
|
24
hw/sun4m.c
24
hw/sun4m.c
|
@ -1426,7 +1426,7 @@ static QEMUMachine ss5_machine = {
|
|||
.name = "SS-5",
|
||||
.desc = "Sun4m platform, SPARCstation 5",
|
||||
.init = ss5_init,
|
||||
.use_scsi = 1,
|
||||
.block_default_type = IF_SCSI,
|
||||
.is_default = 1,
|
||||
};
|
||||
|
||||
|
@ -1434,7 +1434,7 @@ static QEMUMachine ss10_machine = {
|
|||
.name = "SS-10",
|
||||
.desc = "Sun4m platform, SPARCstation 10",
|
||||
.init = ss10_init,
|
||||
.use_scsi = 1,
|
||||
.block_default_type = IF_SCSI,
|
||||
.max_cpus = 4,
|
||||
};
|
||||
|
||||
|
@ -1442,7 +1442,7 @@ static QEMUMachine ss600mp_machine = {
|
|||
.name = "SS-600MP",
|
||||
.desc = "Sun4m platform, SPARCserver 600MP",
|
||||
.init = ss600mp_init,
|
||||
.use_scsi = 1,
|
||||
.block_default_type = IF_SCSI,
|
||||
.max_cpus = 4,
|
||||
};
|
||||
|
||||
|
@ -1450,7 +1450,7 @@ static QEMUMachine ss20_machine = {
|
|||
.name = "SS-20",
|
||||
.desc = "Sun4m platform, SPARCstation 20",
|
||||
.init = ss20_init,
|
||||
.use_scsi = 1,
|
||||
.block_default_type = IF_SCSI,
|
||||
.max_cpus = 4,
|
||||
};
|
||||
|
||||
|
@ -1458,35 +1458,35 @@ static QEMUMachine voyager_machine = {
|
|||
.name = "Voyager",
|
||||
.desc = "Sun4m platform, SPARCstation Voyager",
|
||||
.init = vger_init,
|
||||
.use_scsi = 1,
|
||||
.block_default_type = IF_SCSI,
|
||||
};
|
||||
|
||||
static QEMUMachine ss_lx_machine = {
|
||||
.name = "LX",
|
||||
.desc = "Sun4m platform, SPARCstation LX",
|
||||
.init = ss_lx_init,
|
||||
.use_scsi = 1,
|
||||
.block_default_type = IF_SCSI,
|
||||
};
|
||||
|
||||
static QEMUMachine ss4_machine = {
|
||||
.name = "SS-4",
|
||||
.desc = "Sun4m platform, SPARCstation 4",
|
||||
.init = ss4_init,
|
||||
.use_scsi = 1,
|
||||
.block_default_type = IF_SCSI,
|
||||
};
|
||||
|
||||
static QEMUMachine scls_machine = {
|
||||
.name = "SPARCClassic",
|
||||
.desc = "Sun4m platform, SPARCClassic",
|
||||
.init = scls_init,
|
||||
.use_scsi = 1,
|
||||
.block_default_type = IF_SCSI,
|
||||
};
|
||||
|
||||
static QEMUMachine sbook_machine = {
|
||||
.name = "SPARCbook",
|
||||
.desc = "Sun4m platform, SPARCbook",
|
||||
.init = sbook_init,
|
||||
.use_scsi = 1,
|
||||
.block_default_type = IF_SCSI,
|
||||
};
|
||||
|
||||
static const struct sun4d_hwdef sun4d_hwdefs[] = {
|
||||
|
@ -1709,7 +1709,7 @@ static QEMUMachine ss1000_machine = {
|
|||
.name = "SS-1000",
|
||||
.desc = "Sun4d platform, SPARCserver 1000",
|
||||
.init = ss1000_init,
|
||||
.use_scsi = 1,
|
||||
.block_default_type = IF_SCSI,
|
||||
.max_cpus = 8,
|
||||
};
|
||||
|
||||
|
@ -1717,7 +1717,7 @@ static QEMUMachine ss2000_machine = {
|
|||
.name = "SS-2000",
|
||||
.desc = "Sun4d platform, SPARCcenter 2000",
|
||||
.init = ss2000_init,
|
||||
.use_scsi = 1,
|
||||
.block_default_type = IF_SCSI,
|
||||
.max_cpus = 20,
|
||||
};
|
||||
|
||||
|
@ -1896,7 +1896,7 @@ static QEMUMachine ss2_machine = {
|
|||
.name = "SS-2",
|
||||
.desc = "Sun4c platform, SPARCstation 2",
|
||||
.init = ss2_init,
|
||||
.use_scsi = 1,
|
||||
.block_default_type = IF_SCSI,
|
||||
};
|
||||
|
||||
static void sun4m_register_types(void)
|
||||
|
|
|
@ -358,14 +358,14 @@ static QEMUMachine versatilepb_machine = {
|
|||
.name = "versatilepb",
|
||||
.desc = "ARM Versatile/PB (ARM926EJ-S)",
|
||||
.init = vpb_init,
|
||||
.use_scsi = 1,
|
||||
.block_default_type = IF_SCSI,
|
||||
};
|
||||
|
||||
static QEMUMachine versatileab_machine = {
|
||||
.name = "versatileab",
|
||||
.desc = "ARM Versatile/AB (ARM926EJ-S)",
|
||||
.init = vab_init,
|
||||
.use_scsi = 1,
|
||||
.block_default_type = IF_SCSI,
|
||||
};
|
||||
|
||||
static void versatile_machine_init(void)
|
||||
|
|
|
@ -477,7 +477,7 @@ static QEMUMachine vexpress_a9_machine = {
|
|||
.name = "vexpress-a9",
|
||||
.desc = "ARM Versatile Express for Cortex-A9",
|
||||
.init = vexpress_a9_init,
|
||||
.use_scsi = 1,
|
||||
.block_default_type = IF_SCSI,
|
||||
.max_cpus = 4,
|
||||
};
|
||||
|
||||
|
@ -485,7 +485,7 @@ static QEMUMachine vexpress_a15_machine = {
|
|||
.name = "vexpress-a15",
|
||||
.desc = "ARM Versatile Express for Cortex-A15",
|
||||
.init = vexpress_a15_init,
|
||||
.use_scsi = 1,
|
||||
.block_default_type = IF_SCSI,
|
||||
.max_cpus = 4,
|
||||
};
|
||||
|
||||
|
|
|
@ -200,7 +200,7 @@ static QEMUMachine zynq_machine = {
|
|||
.name = "xilinx-zynq-a9",
|
||||
.desc = "Xilinx Zynq Platform Baseboard for Cortex-A9",
|
||||
.init = zynq_init,
|
||||
.use_scsi = 1,
|
||||
.block_default_type = IF_SCSI,
|
||||
.max_cpus = 1,
|
||||
.no_sdcard = 1
|
||||
};
|
||||
|
|
21
vl.c
21
vl.c
|
@ -886,9 +886,9 @@ static int cleanup_add_fd(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)
|
||||
|
@ -899,14 +899,15 @@ static int drive_enable_snapshot(QemuOpts *opts, void *opaque)
|
|||
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,
|
||||
const char *optstr)
|
||||
{
|
||||
QemuOpts *opts;
|
||||
|
||||
if (type == IF_DEFAULT) {
|
||||
type = use_scsi ? IF_SCSI : IF_IDE;
|
||||
type = block_default_type;
|
||||
}
|
||||
|
||||
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) {
|
||||
drive_enable_snapshot(opts, NULL);
|
||||
}
|
||||
if (!drive_init(opts, use_scsi)) {
|
||||
if (!drive_init(opts, type)) {
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
@ -3770,14 +3771,16 @@ int main(int argc, char **argv, char **envp)
|
|||
/* open the virtual block devices */
|
||||
if (snapshot)
|
||||
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);
|
||||
}
|
||||
|
||||
default_drive(default_cdrom, snapshot, machine->use_scsi,
|
||||
default_drive(default_cdrom, snapshot, machine->block_default_type,
|
||||
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);
|
||||
default_drive(default_sdcard, snapshot, machine->use_scsi,
|
||||
default_drive(default_sdcard, snapshot, machine->block_default_type,
|
||||
IF_SD, 0, SD_OPTS);
|
||||
|
||||
register_savevm_live(NULL, "ram", 0, 4, &savevm_ram_handlers, NULL);
|
||||
|
|
Loading…
Reference in a new issue