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. 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. 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. I seem to recall that the same issue popped up a few months ago on these lists, too. -MattReceived on Thu Sep 03 2009 - 20:20:46 UTC
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:39:54 UTC