On Sep 3, 2009, at 4:10 PM, Matthew Dillon wrote: > This is a known problem with physio and/or the ATA driver, > depending > on your viewpoint. See kern/kern_physio.c. > > The physio code directly maps the userland buffer via vmapbuf() and > supplies it as a BIO to the device. The ATA driver does not use > BUSDMA (and never has)... it assumes BIOs are minimally aligned. > Wrong. > But BIOs generated from kern_physio.c use user addresses directly > and > thus might only be byte-aligned. > > The CAM pass-through device has the same problem. > Huh? Are you confused by the physaddr interface of CAM? > The problem occurs most often when running a cd/dvd player or > burner > which declares operational structures it intends to read() or > write() > on the stack, sometimes even with char[] arrays. > > The solution I came up for with DFly was to implement bounce > buffers > manually in kern_physio.c and the CAM pass-through device for any > user data that was not 16-byte aligned. I considered implementing > bounce buffers in all the disk drivers that were missing it but > there are other serious problems trying to bounce dma buffers > that deep > in the device hierarchy... you can hit low-memory deadlocks if the > driver isn't written carefully enough (and most aren't). The > BUSDMA > API has never been easy to work with for anyone trying to use the > async data buffer bouncing load feature... most drivers just > force it > to run synchronously and thus hit the deadlock issues. > Wrong. ScottReceived on Fri Sep 04 2009 - 03:31:19 UTC
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:39:54 UTC