Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 8 Jul 2012 21:05:16 +1000
From:      Peter Jeremy <peter@rulingia.com>
To:        freebsd-hackers@freebsd.org
Subject:   Re: contigmalloc() breaking Xorg
Message-ID:  <20120708110516.GA38312@server.rulingia.com>
In-Reply-To: <20120703111753.GB72292@server.rulingia.com>
References:  <20120703111753.GB72292@server.rulingia.com>

next in thread | previous in thread | raw e-mail | index | archive | help

--/9DWx/yDrRhgMJTb
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On 2012-Jul-03 21:17:53 +1000, Peter Jeremy <peter@server.rulingia.com> wro=
te:
>I have a reasonably recent 8-stable/amd64 system (r237444) with a "ATI
>Radeon HD 2400 Pro", xorg-server-1.10.6,1 and xf86-video-ati-6.14.3_1
>8GB RAM and ZFS.  I'm seeing fairly consistent problems with Xorg
=2E..
>How difficult would it be to modify bus_dmamem_alloc() [at least on
>x86] to handle multi-segment allocations?

I think I've managed to create an amd64 bus_dmamem_alloc() that allows
page-sized allocations as long as no boundary condition is specified
and no more than page-sized alignment is required (porting it to other
architectures would be trivial).  I've given it a quick whirl inside a
VBox and no smoke came out but I'd appreciate someone with a better
understanding of bus_dma(9) and vm/vm_contig.c giving
http://www.rulingia.com/bugs/patch-wiredmalloc a once-over.  Note that
this patch is against 8.x but there's only a trivial difference to head.

BTW, the comment in busdma_machdep.c:bus_dmamem_alloc()
	 * XXX Use Contigmalloc until it is merged into this facility
	 *     and handles multi-seg allocations.  Nobody is doing
	 *     multi-seg allocations yet though.
	 * XXX Certain AGP hardware does.
does not appear to be accurate.  Apart from drm, quite a few drivers
call bus_dma_tag_create(9) with multiple segments and also call
bus_dmamem_alloc(9) [though I haven't verified that the calls share
the same bus_dma_tag, so I can't be absolutely certain].

BTW(2): Whilst studying busdma_machdep.c for arm and mips, I've
noticed they appear to potentially allocate substantial kernel stack
under some conditions as several bus_dma(9) functions include:
    bus_dma_segment_t dm_segments[dmat->nsegments];
What prevents this overflowing the kernel stack?

--=20
Peter Jeremy

--/9DWx/yDrRhgMJTb
Content-Type: application/pgp-signature

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.19 (FreeBSD)

iEYEARECAAYFAk/5aWwACgkQ/opHv/APuIdzaACaA4AO/KTUaGipf+W8ON6dy6ud
7WIAoMNon9i8PrZ+k72+fX+keyE4m87i
=nFuQ
-----END PGP SIGNATURE-----

--/9DWx/yDrRhgMJTb--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20120708110516.GA38312>