Re: non aligned DMA transfer attempted

From: Matthew Dillon <dillon_at_apollo.backplane.com>
Date: Thu, 3 Sep 2009 15:10:06 -0700 (PDT)
    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.

						-Matt
Received 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