qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [sneak preview] major scsi overhaul


From: Gerd Hoffmann
Subject: Re: [Qemu-devel] [sneak preview] major scsi overhaul
Date: Mon, 16 Nov 2009 17:35:18 +0100
User-agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.4pre) Gecko/20091014 Fedora/3.0-2.8.b4.fc11 Lightning/1.0pre Thunderbird/3.0b4

On 11/11/09 17:38, Paul Brook wrote:
That cap is important.
For scsi-generic you probably don't have a choice because of the way the
kernel interface works.

Exactly.  And why is the cap important for scsi-disk if scsi-generic
does fine without?

With scsi-generic you're at the mercy of what the kernel API gives you, and if
the guest hardware/OS isn't cooperative then you loose.

The guest will loose with unreasonable large requests. qemu_malloc() -> oom() -> abort() -> guest is gone.

We can also limit the amout of host memory we allow the guest to consume, so uncooperative guests can't push the host into swap. This is not implemented today, indicating that it hasn't been a problem so far. And with zerocopy it will be even less a problem as we don't need host memory to buffer the data ...

It doesn't.  The disconnect and thus the opportunity to submit more
commands while the device is busy doing the actual I/O is there.

Disconnecting on the first DMA request (after switching to a data phase and
transferring zero bytes) is bizarre behavior, but probably allowable.

The new lsi code doesn't. The old code could do that under certain circumstances. And what is bizarre about that? A real hard drive will most likely do exactly that on reads (unless it has the data cached and can start the transfer instantly).

However by my reading DMA transfers must be performed synchronously by the
SCRIPTS engine, so you need to do a lot of extra checking to prove that you
can safely continue execution without actually performing the transfer.

I'll happily add a 'strict' mode which does data transfers synchronously in case any compatibility issues show up.

Such a mode would be slower of course. We'll have to either do the I/O in lots of little chunks or loose zerocopy. Large transfers + memcpy is probably the faster option.

It may be that it's
hard/impossible to get both command queueing and zero-copy.

I have it working.

More likely you have a nasty hack that happens to work with the Linux drivers.

Linux works. Windows XP works. FreeBSD works. More regression testing is planned.

Suggestions for other guests which might be sensitive to changes like this? Maybe even some which don't work with the current lsi emulation?

IIUC you're pretending that the DMA completed and eventually disconnecting the
device, assuming that nothing will read that data until the command complete
notification is received.

Yes.

Consider the case there the guest transfers the data from a single command in
two blocks, and has the HBA raise an interrupt in-between so that it can start
processing before the command completes. This processing could even be done by
the SCRIPTS engine itself, or a guest could even reuse the buffer for the
second DMA block.

In theory you can do all sorts of crazy stuff with the lsi scripts engine, like implementing a ext2 filesystem driver.

In practice I expect guests will use the scripts engine only for stuff which is also supported by other scsi controllers.

cheers,
  Gerd




reply via email to

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