qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] the need for if=none for -drive?


From: Stefan Hajnoczi
Subject: Re: [Qemu-devel] the need for if=none for -drive?
Date: Thu, 8 Jan 2015 13:47:45 +0000

On Wed, Dec 17, 2014 at 11:52 AM, Markus Armbruster <address@hidden> wrote:
> Sorry for the slow reply, I missed this one until now.  Adding block
> maintainers.
>
> John Snow <address@hidden> writes:
>
>> On 11/02/2014 02:21 AM, Michael Tokarev wrote:
>>> All "modern" 2-way drive/device specifications need to explicitly
>>> specify if=none for the drive for it to not be used in the default
>>> ide bus implicitly.
>>
>> Which behave like this? I am reasonably sheltered in the IDE and S/ATA
>> lands.
>
> -drive's parameter "if" defaults to the board's preferred interface.
> if=none was added to shoehorn block devices into the -device world.  As
> Michael wrote, you always have to say if=none,id=FOO,... to create
> something usable with -device.
>
>>> But how about using some if=unspecified implicitly for all devices
>>> which don't specify if=, pick any devices from that list which are
>>> referenced from -device, and only add those which left (plus the
>>> ones with explicit if=ide) to the default ide bus?
>>
>> I wouldn't really be opposed to this, since making things more
>> explicit and less mysterious with the drive sugar sounds welcome to
>> me. I imagine you're trying to avoid the case where if= is omitted and
>> QEMU gets to decide what it wants to do in this (highly ambiguous)
>> case?
>>
>>> The change should be strighforward, the only (maybe significant)
>>> prob I see is a need to reorder -device/-drive initialization in
>>> vl.c.  We might pick them up in drive_check_orphaned() too.  Or,
>>> we can walk over -devices when adding -drives with if={unspec,explicit}.
>>>
>>> (this is a sort of a followup to 6b9e03a4e759876, "qtest/bios-tables:
>>> Correct Q35 command line", but ofcourse it's a topic by its own).
>>>
>>> Thanks,
>>>
>>> /mjt
>>>
>>
>> It may be a little too late, since it seemed as if defaulting to
>> "IF_DEFAULT" always winds up getting mapped to whatever is provided by
>> the second argument of drive_new (block_default_type) which usually
>> winds up being machine_class->block_default_type -- which for Q35 and
>> piix both is IDE. (Implicitly, because it never sets it. interface 0
>> is IF_IDE -- which makes the "true default" for if ... IDE, until it
>> is overridden.)
>>
>> Changing this behavior might break more than we fix, perhaps.
>>
>> I'll leave the masterminding of fixing up the grossly broken drive
>> sugar up to Markus, the secret architect of the recent Q35 sugar
>> patches :>
>
> IF_DEFAULT is currently used only for the non-option image argument,
> -hd[a-d] and -cdrom.  It tells the desugaring function drive_add() not
> add an "if" parameter.
>
> Parameter "if" is processed by drive_new().  It defaults to argument
> block_default_type.  For -drive, it's the current machine's
> block_default_type.  Some machines set IF_SCSI, and two set IF_VIRTIO,
> the rest get IF_IDE via zero initialization.
>
> Board initialization code iterates over drives they know, and create
> appropriate device models.  Boards never pick up if=none drives.
>
> Anything not picked up by board initialization can be used by -device.
> Ideally, these are just the if=none drives, but confusing crap like
> "-drive id=foo,if=mtd,file=tmp.qcow2 -device usb-storage,drive=foo" also
> works.
>
> Anything not used by -device either triggers an "orphaned drive"
> warning, and stays around for possible use by device_add.
>
> Michael proposes to reshuffle this a bit.  Instead of resolving missing
> "if" to the machine's block_default_type in drive_new(), keep it
> undecided a bit longer.  Give -device first pick.  Anything left over
> defaults to the machine's block_default_type as before.
>
> Two remarks.
>
> First, I'm afraid giving -device first pick isn't quite trivial.  The
> current code acting on -device creates and connects a device model.
> Requires the board to be initialized already.  Either we delay the board
> iterating over drives until after -device is done.  Changes failure
> modes, need to make sure the error reporting doesn't degrade.  Or we do
> an early pass to claim the drives for -device, and actually connect them
> later.
>
> Second, while I too find the need for if=none annoying, I'm not sure I
> like the amount of extra magic.  Could be too much.  Opinions?

I agree with both these points.

Not sure it's worth the effort to implement this correctly, review, and test it.

Stefan



reply via email to

[Prev in Thread] Current Thread [Next in Thread]