On Friday, February 6, 2009 1:35 pm Thomas Hellström wrote:Jesse,
Jesse Barnes wrote:
On Thursday, February 5, 2009 10:37 am Jesse Barnes wrote:Yes, an mmap() is always paired with a vm_close(), and the vm_close()
So if we leave the lookup reference around from the GTT mapping ioctl,Ah but maybe we should just tear down the fake offset at unmap time; then
that would take care of new mappings. And if we added/removed
references at VM open/close time, we should be covered for fork. But is
it ok to add a new unref in the finish ioctl for GTT mapped objects? I
don't think so, because we don't know for sure if the caller was the one
that created the new fake offset (which would be one way of detecting
whether it was GTT mapped). Seems like we need a new unmap ioctl? Or we
could put the mapping ref/unref in libdrm, where it would be tracked on
a per-process basis...
we'd be able to use it as an existence test for the mapping and get the
refcounting right. The last thing I thought of was whether we'd be ok in
a map_gtt -> crash case. I *think* the vm_close code will deal with
that, if we do a deref there?
also happens in a crash situation.
This one should cover the cases you found.
- ref at map time will keep the object around so fault shouldn't fail
- additional threads will take their refs in vm_open/close
- unmap will unref and remove mmap_offset allowing object to be freed