On Thu, 3 Sep 2009, Alexander Motin wrote:
Scott Long wrote:
In this case, set maxio to 64k, not 127.5k. You'll typically get much
better i/o performance out of two 64k transfers
than you will out of one 127.k transfer and one 512 bytes transfer, which
is what the block layer will give you if
you try to send 128k.
Couldn't it be somehow handled on that level?
It's a limitation of the paticular hardware, not the OS. Plain disks will
behave like this, but RAID controllers might now. But if you want to add
this feature to the upper layers, be my guest.
Limiting maxio from 127.5K to
64K is also a penalty for requests with length in that range.
Most I/O that goes to a disk comes from one of the VM pagers, and is thus
page aligned and multi-of-page sized. Breaking one of these requests up
into sub-page sized requests costs a whole lot more than what you are
assuming. We analyzed exactly this situation a few years ago at Yahoo and
came to this conclusion.
It would be
nice if every level would do it's own job.
It's the job of the driver to handle the limitations of the hardware, yes.
Again, if you want to experiment with pushing this functionality into
GEOM, be my guest. But until then, consider following my advice.
Scott
On Sep 3, 2009, at 6:37 AM, Alexander Motin wrote:
Author: mav
Date: Thu Sep 3 12:37:17 2009
New Revision: 196777
URL: http://svn.freebsd.org/changeset/base/196777
Log:
ATI SB600 can't handle 256 sectors transfers with FPDMA (NCQ).
MFC after: 3 days
Modified:
head/sys/dev/ahci/ahci.c
Modified: head/sys/dev/ahci/ahci.c
==============================================================================
--- head/sys/dev/ahci/ahci.c Thu Sep 3 10:06:37 2009 (r196776)
+++ head/sys/dev/ahci/ahci.c Thu Sep 3 12:37:17 2009 (r196777)
@@ -1942,6 +1942,9 @@ ahciaction(struct cam_sim *sim, union cc
cpi->protocol = PROTO_ATA;
cpi->protocol_version = PROTO_VERSION_UNSPECIFIED;
cpi->maxio = MAXPHYS;
+ /* ATI SB600 can't handle 256 sectors with FPDMA (NCQ). */
+ if (pci_get_devid(device_get_parent(dev)) == 0x43801002)
+ cpi->maxio = min(cpi->maxio, 255 * 512);
cpi->ccb_h.status = CAM_REQ_CMP;
xpt_done(ccb);
break;
--
Alexander Motin
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"