Commit d176c495 authored by Gerd Hoffmann's avatar Gerd Hoffmann Committed by Anthony Liguori
Browse files

qdev-ify virtio-blk.



First user of the new drive property.  With this patch applied host
and guest config can be specified separately, like this:

  -drive if=none,id=disk1,file=/path/to/disk.img
  -device virtio-blk-pci,drive=disk1

You can set any property for virtio-blk-pci now.  You can set the pci
address via addr=.  You can switch the device into 0.10 compat mode
using class=0x0180.  As this is per device you can have one 0.10 and one
0.11 virtio block device in a single virtual machine.

Old syntax continues to work.  Internally it does the same as the two
lines above though.  One side effect this has is a different
initialization order, which might result in a different pci address
being assigned by default.

Long term plan here is to have this working for all block devices, i.e.
once all scsi is properly qdev-ified you will be able to do something
like this:

  -drive if=none,id=sda,file=/path/to/disk.img
  -device lsi,id=lsi,addr=<pciaddr>
  -device scsi-disk,drive=sda,bus=lsi.0,lun=<n>

Signed-off-by: default avatarGerd Hoffmann <kraxel@redhat.com>
Signed-off-by: default avatarAnthony Liguori <aliguori@us.ibm.com>
Message-Id: 
parent 14b41872
Loading
Loading
Loading
Loading
+0 −12
Original line number Diff line number Diff line
@@ -1409,18 +1409,6 @@ static void pc_init1(ram_addr_t ram_size,
        }
    }

    /* Add virtio block devices */
    if (pci_enabled) {
        int unit_id = 0;

        while ((dinfo = drive_get(IF_VIRTIO, 0, unit_id)) != NULL) {
            pci_dev = pci_create("virtio-blk-pci",
                                 dinfo->devaddr);
            qdev_init(&pci_dev->qdev);
            unit_id++;
        }
    }

    /* Add virtio balloon device */
    if (pci_enabled && virtio_balloon) {
        pci_dev = pci_create("virtio-balloon-pci", virtio_balloon_devaddr);
+1 −0
Original line number Diff line number Diff line
@@ -136,6 +136,7 @@ static PCIDevice *qemu_pci_hot_add_storage(Monitor *mon,
        break;
    case IF_VIRTIO:
        dev = pci_create("virtio-blk-pci", devaddr);
        qdev_prop_set_drive(&dev->qdev, "drive", dinfo);
        break;
    default:
        dev = NULL;
+0 −11
Original line number Diff line number Diff line
@@ -90,7 +90,6 @@ static void bamboo_init(ram_addr_t ram_size,
{
    unsigned int pci_irq_nrs[4] = { 28, 27, 26, 25 };
    PCIBus *pcibus;
    PCIDevice *pci_dev;
    CPUState *env;
    uint64_t elf_entry;
    uint64_t elf_lowaddr;
@@ -102,21 +101,11 @@ static void bamboo_init(ram_addr_t ram_size,
    target_ulong dt_base = 0;
    void *fdt;
    int i;
    DriveInfo *dinfo;

    /* Setup CPU. */
    env = ppc440ep_init(&ram_size, &pcibus, pci_irq_nrs, 1, cpu_model);

    if (pcibus) {
        int unit_id = 0;

        /* Add virtio block devices. */
        while ((dinfo = drive_get(IF_VIRTIO, 0, unit_id)) != NULL) {
            pci_dev = pci_create("virtio-blk-pci", dinfo->devaddr);
            qdev_init(&pci_dev->qdev);
            unit_id++;
        }

        /* Add virtio console devices */
        for(i = 0; i < MAX_VIRTIO_CONSOLES; i++) {
            if (virtcon_hds[i]) {
+0 −11
Original line number Diff line number Diff line
@@ -157,7 +157,6 @@ static void mpc8544ds_init(ram_addr_t ram_size,
                         const char *cpu_model)
{
    PCIBus *pci_bus;
    PCIDevice *pci_dev;
    CPUState *env;
    uint64_t elf_entry;
    uint64_t elf_lowaddr;
@@ -172,7 +171,6 @@ static void mpc8544ds_init(ram_addr_t ram_size,
    unsigned int pci_irq_nrs[4] = {1, 2, 3, 4};
    qemu_irq *irqs, *mpic, *pci_irqs;
    SerialState * serial[2];
    DriveInfo *dinfo;

    /* Setup CPU */
    env = cpu_ppc_init("e500v2_v30");
@@ -217,15 +215,6 @@ static void mpc8544ds_init(ram_addr_t ram_size,
    isa_mmio_init(MPC8544_PCI_IO, MPC8544_PCI_IOLEN);

    if (pci_bus) {
        int unit_id = 0;

        /* Add virtio block devices. */
        while ((dinfo = drive_get(IF_VIRTIO, 0, unit_id)) != NULL) {
            pci_dev = pci_create("virtio-blk-pci", dinfo->devaddr);
            qdev_init(&pci_dev->qdev);
            unit_id++;
        }

        /* Register network interfaces. */
        for (i = 0; i < nb_nics; i++) {
            pci_nic_init(&nd_table[i], "virtio", NULL);
+4 −6
Original line number Diff line number Diff line
@@ -414,29 +414,27 @@ static int virtio_blk_load(QEMUFile *f, void *opaque, int version_id)
    return 0;
}

VirtIODevice *virtio_blk_init(DeviceState *dev)
VirtIODevice *virtio_blk_init(DeviceState *dev, DriveInfo *dinfo)
{
    VirtIOBlock *s;
    int cylinders, heads, secs;
    static int virtio_blk_id;
    BlockDriverState *bs;
    char *ps;

    s = (VirtIOBlock *)virtio_common_init("virtio-blk", VIRTIO_ID_BLOCK,
                                          sizeof(struct virtio_blk_config),
                                          sizeof(VirtIOBlock));

    bs = qdev_init_bdrv(dev, IF_VIRTIO);
    s->vdev.get_config = virtio_blk_update_config;
    s->vdev.get_features = virtio_blk_get_features;
    s->vdev.reset = virtio_blk_reset;
    s->bs = bs;
    s->bs = dinfo->bdrv;
    s->rq = NULL;
    if (strlen(ps = (char *)drive_get_serial(bs)))
    if (strlen(ps = (char *)drive_get_serial(s->bs)))
        strncpy(s->serial_str, ps, sizeof(s->serial_str));
    else
        snprintf(s->serial_str, sizeof(s->serial_str), "0");
    bs->private = dev;
    s->bs->private = dev;
    bdrv_guess_geometry(s->bs, &cylinders, &heads, &secs);
    bdrv_set_geometry_hint(s->bs, cylinders, heads, secs);

Loading