[Nouveau] Some ideas on how to mix userspace fifo's with a kernel memory manager
Maarten Maathuis
madman2003 at gmail.com
Sat Dec 20 14:48:49 PST 2008
On 12/20/2008 10:08 PM, Ben Skeggs wrote:
>
>
> On Sat, Dec 20, 2008 at 11:58 PM, Maarten Maathuis
> <madman2003 at gmail.com <mailto:madman2003 at gmail.com>> wrote:
>
> I was thinking of the following system:
>
> Allocate a fifo for userspace, map the fifo, map the fifo
> registers into
> userspace.
> These allocations are therefore pinned, so something to avoid memory
> fragmentation has to be done.
>
> Userspace library fills up an entire fifo, minus a few essential
> things
> i will mention later. Userspace does ioctl with all the bo's it'll
> need
> for the fifo.
>
> Kernel pins all these bo's,
>
> Feel free to give it a try, there's nothing stopping you. The main
> reason being that the kernel has to be able to do things such as emit
> buffer moves, and zero-fill new buffers. We have a channel allocated
> for the DRM, but as I discovered doing all the above on that channel
> has severe performance issues (synchronisation beween client's channel
> and kernel's channel).
You make a good point, i hadn't considered this requirement.
>
> creates several dma objects
> that covers only a single bo (as a form of memory protection). Kernel
> sends back a list of these object handles
>
> The first major problem is here. This has been discussed numerous
> times already, and as good an idea as it sounds, it's not possible to
> implement on any of the chipsets we support. On all the 3D object
> classes, there's exactly 2 methods that take object handles for
> textures (DMA_TEXTURE*). Now, on nv4x you can use up to 16 texture
> images, which would each have separate bos. See the problem already?
> The image units have a bit which allow you to select between
> DMA_TEXTURE0 and DMA_TEXTURE1 but that's all.
I just realised this (i was actually going to reply about this if you
hadn't).
>
> If you're concerned about protection there's not a great deal that's
> feasible on pre-nv5x chipsets. Protecting clients from accessing
> memory that's not supposed to be accessible by the GPU is all we can
> do, stopping channels from accessing each others' memory isn't. On
> nv5x each channel has its own address space, which gives us much more
> flexibility.
>
> + a list of ref_cnt values
> that have to inserted after the bo usage is done. Userspace fills
> in the
> remaining values and fires the fifo.
>
> Later, under memory pressure for example, the memory manager checks
> which bo's can be unpinned.
>
>
>
> So you'll still need an ioctl, but you do avoid a copy into kernel
> space, which might hurt for stuff like hostdata transfers.
>
> If you notice the comments in my GEM code, I don't intend on doing
> this forever. I'm currently in the process of moving interstate and
> don't have access to the system I've been working on the mm stuff
> from, hopefully in a couple of weeks I'll be able to get back to it.
Out of curiosity, does the current work for nv50? It's tempting to give
it a try and fiddle with it, but if there's still a lot to do to even
get it working then I'm probably wasting my time.
Do you intend to something mmap'ish for command buffers?
>
> Ben.
>
>
>
> As usual, comment is appreciated.
>
> Maarten.
> _______________________________________________
> Nouveau mailing list
> Nouveau at lists.freedesktop.org <mailto:Nouveau at lists.freedesktop.org>
> http://lists.freedesktop.org/mailman/listinfo/nouveau
>
>
More information about the Nouveau
mailing list