qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: John Snow <jsnow@redhat.com>
To: Markus Armbruster <armbru@redhat.com>
Cc: kwolf@redhat.com, qemu-devel@nongnu.org, stefanha@redhat.com,
	agraf@suse.de
Subject: Re: [Qemu-devel] [RFC 0/4] Adding -cdrom, -hd[abcd] and -drive file=... to Q35
Date: Tue, 19 Aug 2014 11:56:39 -0400	[thread overview]
Message-ID: <53F373B7.9000706@redhat.com> (raw)
In-Reply-To: <87ppfwaoqr.fsf@blackfin.pond.sub.org>


On 08/19/2014 04:05 AM, Markus Armbruster wrote:
> John Snow <jsnow@redhat.com> writes:
>
>> Currently, the drive definitions created by drive_new() when using
>> the -drive file=...[,if=ide] or -cdrom or -hd[abcd] options are not
>> picked up by the Q35 initialization routine.
>>
>> To fix this, we have to add hooks to search for these drives using
>> something like pc_piix's ide_drive_get and then add them using
>> something like pci_ide_create_devs.
>
> ide_drive_get() isn't pc_piix's, it's a helper function in the IDE core
> which boards (not just pc_piix) use to find the if=ide drives.  It fills
> in an array of DriveInfo.
>
> pci_ide_create_devs() is a helper function in the IDE PCI code which PCI
> IDE controllers (not just piix3-ide) use to create IDE devices for an
> array of DriveInfo.

Yes. I meant to say pc_piix's /call to/ ide_drive_get. I would have to 
patch up the other boards if I changed this function! Only an RFC before 
I got too far down this path :]

>> Where it gets slightly wonky is the fact that if=ide is specified
>> to use two devices per bus, whereas AHCI does not utilize that
>> same master/slave mechanic. Therefore, many places inside of
>> blockdev.c where we add and define new drives use incorrect math
>> for AHCI devices and try to place them on impossible buses.
>> Notably -hdb and -hdd would become inaccessible.
>
> Yes.
>
>> To remedy this, I added a new interface type, IF_AHCI. Corresponding
>> to this change, I modified the default machine properties for Q35
>> to use this interface as a default.
>>
>> The changes appear to work well, but where I'd like some feedback
>> is what should happen if people do something like:
>>
>> qemu -M q35 -drive if=ide,file=fedora.qcow2
>>
>> The code as presented here is not going to look for or attempt to
>> connect IDE devices, because it is now looking for /AHCI/ devices.
>>
>> At worst, this may break a few existing scripts, but I actually think
>> that since the if=ide,file=... shorthand never worked to begin with,
>> the impact might actually be minimal.
>>
>> But since the legacy IDE interface of the ICH9 is as of yet unemulated,
>> the if=ide drives don't have a reasonable place to go yet. I am also
>> not sure what a reasonable way to handle people specifying BOTH
>> if=ide and if=ahci drives would be.
>
> We've been through IF_AHCI before, more than once, but that was before
> you got involved :)
>
> The problem at hand is that "-drive if=ide" and its sugared forms -hda,
> -hdb, -cdrom, ... don't work with Q35.
>
> You provide a solution for the sugared forms, you leave the problem
> unsolved for the unsugared form, and you add a new problem: -drive
> if=ahci doesn't work with i440FX.  Progress, sort of.

Adding a call to boards that support the AHCI device during their 
initialization should be easy enough, if we decide that "ide means 
ISA/PCI, ahci means the AHCI HBA." I could probably even write one 
generic routine between i440fx and q35 to do both IDE/AHCI.

If we decide that IF_IDE and IF_AHCI mean different things, the problem 
of the unsugared form being unsolved depends on me (well, or someone) 
implementing the legacy IDE interface for Q35.

> Let's take a step back, and recap previous discussion.  There are two
> defensible point of views, in my opinion.
>
> One is that IDE and AHCI should be separate interface types, just like
> IDE and SCSI are.
>
> Attempts to define an if=X drive with a board that doesn't provide a
> controller for X should fail[*].  Only onboard controllers matter,
> add-ons plugged in with -device don't.  An i440FX board provides only
> IDE.  A Q35 board provides only AHCI, not IDE.  If we implement an
> ich9-ahci legacy mode, and switch it on, then it provides only IDE, not
> AHCI.  Or maybe both, depending on how we do it.

I think I am leaning towards this viewpoint, but it depends on what 
"interface" means in QEMU. Currently, the number of units per bus is 
tied to the "interface" and clearly the AHCI SATA interface only 
supports one per bus, so semantically this makes sense.

I think the real ICH9 AHCI device supports only fully AHCI or fully 
legacy, but the AHCI spec itself appears to allow you to run a 
mixed-mode device.

I am not sure we have a usage case for mixed-mode, so enforcing 
either/or for the AHCI device makes sense for now, I think.

> The other point of view is that IDE and AHCI are no more different than
> the different kinds of SCSI HBAs.  This is certainly true from a qdev
> point of view: just like SCSI devices can connect to any SCSI qbus,
> regardless of the HBA providing it, so can IDE devices connect to any
> IDE qbus, regardless of the controller providing it.

Yes... Really the only difference are some mapping semantics. I don't 
think there's any /other/ reason I needed IF_AHCI, of course, I wasn't 
around for the previous discussions, so maybe there are other reasons I 
am not aware of.

> There's a wrinkle: the mapping between index to (bus, unit).  This
> mapping is ABI.  The current mapping makes sense for the first
> generation of controllers: PATA (two devices per bus, thus
> if_max_devs[IF_IDE] = 2), and 8-bit SCSI (seven per bus, thus
> if_max_devs[IF_SCSI = 7).
>
> The mapping is silly for newer SCSI HBAs.  Commit 622b520f tried to make
> it less silly, but had to be reverted in 27d6bf4 because the silliness
> was ABI.
>
> The mapping is also silly for ich9-ahci.  You side-step that silliness
> only, by adding a new interface type for it.  But shouldn't we add a
> number of SCSI interface types then, too?  Where does that end?
>
> Can we do better?  I think we can, by making this part of the ABI
> board-specific.  The general form of the mapping remains
>
>      (bus, unit) = (index / N, index % N)
>
> but N now depends on board and interface type, not just the latter.
>
> If the board connects if=scsi to an lsi53c895a, then N = 7.
>
> If the board connects if=ide to an piix3-ide, then N = 2.
>
> If the board connects if=ide to an ich9-ahci, then N = 1.
>
> I trust you get the idea :)

I suppose we could make it something like:
if (HBA.max_units > 0) {
   N := min(HBA.max_units, IF.max_units);
} else {
   N := IF.max_units;
}
(bus, unit) := (index / N, index % N);

Which sets a default property for the interface but allows the device 
(not the board) to override. Does that make more sense? If we allow 
people to wire up an AHCI device to piix, we'll run back into the same 
problems of the bus/unit mappings unless we make this a device property.

I do feel like I'd rather just make it an interface property and have 
people specify which type of bus they want to wire it up to, but that 
does create a lot of disparity against the SCSI devices.

> [*] Currently, they're silently ignored with most boards for most X, but
> I regard that as implementation defect.

Yes. Is there a bool in the drive info array that we can set to say 
"this drive has been added as a device" and check for any that went 
unset? I can add one and a routine to check for it, which may help flush 
out more of the weird legacy sugar option bugs.
(Sugar attracts bugs. heh-heh-heh...)

-- 
—js

  reply	other threads:[~2014-08-19 15:56 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-08-18 22:05 [Qemu-devel] [RFC 0/4] Adding -cdrom, -hd[abcd] and -drive file=... to Q35 John Snow
2014-08-18 22:05 ` [Qemu-devel] [RFC 1/4] blockdev: add if_get_max_devs John Snow
2014-08-18 22:05 ` [Qemu-devel] [RFC 2/4] blockdev: add IF_AHCI to support -cdrom and -hd[a-d] John Snow
2014-08-18 22:05 ` [Qemu-devel] [RFC 3/4] ide: update ide_drive_get to work with both PCI-IDE and AHCI interfaces John Snow
2014-08-18 22:05 ` [Qemu-devel] [RFC 4/4] ahci: implement -cdrom and -hd[a-d] John Snow
2014-08-19  8:05 ` [Qemu-devel] [RFC 0/4] Adding -cdrom, -hd[abcd] and -drive file=... to Q35 Markus Armbruster
2014-08-19 15:56   ` John Snow [this message]
2014-08-19 18:08     ` Markus Armbruster
2014-08-19 18:59       ` John Snow
2014-08-20  7:22         ` Markus Armbruster
2014-08-19 16:12 ` Dr. David Alan Gilbert
2014-08-19 16:31   ` John Snow

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=53F373B7.9000706@redhat.com \
    --to=jsnow@redhat.com \
    --cc=agraf@suse.de \
    --cc=armbru@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).