Date: Tue, 2 Sep 2014 10:27:46 -0700 From: John-Mark Gurney <jmg@funkthat.com> To: Roger Pau =?iso-8859-1?Q?Monn=E9?= <royger@FreeBSD.org> Cc: src-committers@FreeBSD.org, Alexander Motin <mav@FreeBSD.org>, scottl@FreeBSD.org, cperciva@FreeBSD.org, svn-src-head@FreeBSD.org, svn-src-all@FreeBSD.org Subject: Re: svn commit: r269814 - head/sys/dev/xen/blkfront Message-ID: <20140902172746.GY71691@funkthat.com> In-Reply-To: <20140902171841.GX71691@funkthat.com> References: <53e8e31e.2179.30c1c657@svn.freebsd.org> <53FF7386.3050804@FreeBSD.org> <20140828184515.GV71691@funkthat.com> <53FF7BC4.6050801@FreeBSD.org> <5400BDC7.7020902@FreeBSD.org> <54058E1E.4050907@FreeBSD.org> <20140902171841.GX71691@funkthat.com>
next in thread | previous in thread | raw e-mail | index | archive | help
John-Mark Gurney wrote this message on Tue, Sep 02, 2014 at 10:18 -0700: > Roger Pau Monn wrote this message on Tue, Sep 02, 2014 at 11:30 +0200: > > El 29/08/14 a les 19.52, Roger Pau Monné ha escrit: > > > El 28/08/14 a les 20.58, Alexander Motin ha escrit: > > >> On 28.08.2014 21:45, John-Mark Gurney wrote: > > >>> Alexander Motin wrote this message on Thu, Aug 28, 2014 at 21:23 +0300: > > >>>> Hi, Roger. > > >>>> > > >>>> It looks to me like this commit does not work as it should. I got > > >>>> problem when I just tried `newfs /dev/ada0 ; mount /dev/ada0 /mnt`. > > >>>> Somehow newfs does not produce valid filesystem. Problem is reliably > > >>>> repeatable and reverting this commit fixes it. > > >>>> > > >>>> I found at least one possible cause there: If original data buffer is > > >>>> unmapped, misaligned and not physically contiguous, then present x86 > > >>>> bus_dmamap_load_bio() implementation will process each physically > > >>>> contiguous segment separately. Due to the misalignment first and last > > >>>> physical segments may have size not multiple to 512 bytes. Since each > > >>>> segment processed separately, they are not joined together, and > > >>>> xbd_queue_cb() is getting segments not multiple to 512 bytes. Attempt to > > >>>> convert them to exact number of sectors in the driver cause data corruption. > > >>> > > >>> Are you sure this isn't a problem w/ the tag not properly specifying > > >>> the correct alignement? > > >> > > >> I don't know how to specify it stronger then this: > > >> error = bus_dma_tag_create( > > >> bus_get_dma_tag(sc->xbd_dev), /* parent */ > > >> 512, PAGE_SIZE, /* algnmnt, boundary */ > > >> BUS_SPACE_MAXADDR, /* lowaddr */ > > >> BUS_SPACE_MAXADDR, /* highaddr */ > > >> NULL, NULL, /* filter, filterarg */ > > >> sc->xbd_max_request_size, > > >> sc->xbd_max_request_segments, > > >> PAGE_SIZE, /* maxsegsize */ > > >> BUS_DMA_ALLOCNOW, /* flags */ > > >> busdma_lock_mutex, /* lockfunc */ > > >> &sc->xbd_io_lock, /* lockarg */ > > >> &sc->xbd_io_dmat); > > >> > > >>> Also, I don't think there is a way for busdma > > >>> to say that you MUST have a segment be a multiple of 512, though you > > >>> could use a 512 boundary, but that would force all segments to only be > > >>> 512 bytes... > > >> > > >> As I understand, that is mandatory requirement for this "hardware". > > >> Alike 4K alignment requirement also exist at least for SDHCI, and IIRC > > >> UHCI/OHCI hardware. Even AHCI requires both segment addresses and > > >> lengths to be even. > > >> > > >> I may be wrong, but I think it is quite likely that hardware that > > >> requires segment address alignment quite likely will have the same > > >> requirements for segments length. > > > > Hello, > > > > I have the following fix, which makes sure the total length and the > > size of each segment is aligned. I'm not very knowledgeable of the > > busdma code, so someone has to review it. > > I feel that this alignment should only be enforced via a new option on > the tag... I don't see how alignment and segment size should be > conflated... I could totally see a device that requires an alignement > of 8 bytes, but has a segment size of 16, or vice versa, and requiring > them to be the same means we will bounce unnecesarily... > > cc'd scottl since he knows this code better than I... and cperciva as > he touched it for similar reasons.. > > Oh, I just found PR 152818, where cperciva did a similar fix to > bounce_bus_dmamap_load_buffer for the exact same reason... It was > committed in r216194... Also, if this change is made w/o adding a field to the tag, the busdma man page needs to be updated w/ the fact that alignment also forces segment sizes to be alignment sized... cperciva forgot this when he did his commit... -- John-Mark Gurney Voice: +1 415 225 5579 "All that I will do, has been done, All that I have, has not."
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20140902172746.GY71691>