-
Notifications
You must be signed in to change notification settings - Fork 58
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
drm: Some refactoring and bug fixes to address VM panics #2215
base: dev
Are you sure you want to change the base?
Commits on Sep 4, 2024
-
Configuration menu - View commit details
-
Copy full SHA for b5543c6 - Browse repository at this point
Copy the full SHA b5543c6View commit details -
drm: Use RW_SYSINIT instead of implementing the same thing manually
No functional change intended.
Configuration menu - View commit details
-
Copy full SHA for 1a3a112 - Browse repository at this point
Copy the full SHA 1a3a112View commit details -
Make sure that a failure from pmap_gpu_enter() triggers an assertion failure. This should only happen under memory pressure.
Configuration menu - View commit details
-
Copy full SHA for 35a6304 - Browse repository at this point
Copy the full SHA 35a6304View commit details -
drm: Remove some commented-out code
mmap_sem refers to a Linux synchronization mechanism. Linux is different enough here that the references are not very helpful. No functional change intended.
Configuration menu - View commit details
-
Copy full SHA for 5c84ed3 - Browse repository at this point
Copy the full SHA 5c84ed3View commit details -
drm: Move an assignment closer to initialization
vm_pfn_pcount is only set once, we might as well set it during initialization.
Configuration menu - View commit details
-
Copy full SHA for 473946a - Browse repository at this point
Copy the full SHA 473946aView commit details -
Configuration menu - View commit details
-
Copy full SHA for 5aede0a - Browse repository at this point
Copy the full SHA 5aede0aView commit details -
drm: Fix the size passed to vm_pager_allocate() for SG objects
vmap->vm_len is always 0 here. I believe this code is effectively dead, but let's fix it anyway.
Configuration menu - View commit details
-
Copy full SHA for 40888cb - Browse repository at this point
Copy the full SHA 40888cbView commit details -
drm: Fix use of Mach error numbers in drm_cdev_pager_populate()
See vm_fault_populate(): a return value of VM_PAGER_BAD tells the fault layer to continue handling the fault "normally", i.e., it will allocate a page, insert it into the VM object, and map it. That's not what we want in general.
Configuration menu - View commit details
-
Copy full SHA for 036a4dc - Browse repository at this point
Copy the full SHA 036a4dcView commit details -
drm: Remove the drm_cdev_pager_fault() implementation
There are currently no DRM objects of type OBJT_DEVICE, all are of type OBJT_PHYS or OBJT_MGTDEVICE. drm_cdev_pager_fault() is thus dead code, so remove it in advance of further refactoring. In particular, drm_vmap_find() will be removed.
Configuration menu - View commit details
-
Copy full SHA for 714785b - Browse repository at this point
Copy the full SHA 714785bView commit details -
phys_pager: Avoid holding the object lock over the pager dtor
As in dev_pager_dealloc(), drop the object lock around calls to the destructor. This might be necessary if the destructor wants to sleep.
Configuration menu - View commit details
-
Copy full SHA for 1323324 - Browse repository at this point
Copy the full SHA 1323324View commit details -
drm: Refactor handling of GEM object mappings
Each GEM object is backed by a VM object which stores a handle for each page belonging to the object. A GEM object can be mapped multiple times. Panfrost's buffer objects are backed by physical RAM from the host system. The old code tried to maintain a global list of VMAs which map a GEM object, and this used the object pointer as a unique key, which breaks when the same object is mapped more than once. The mapping list is also somewhat awkward to maintain: FreeBSD's vm_fault layer is supposed to hide details relating to mappings of a given object (for instance, it doesn't pass the fault address to DRM), but Linux passes such details, so we end up faking them. Refactor things to handle the possibility of multiply-mapped GEM objects: - Minimize uses of VMAs. In the pager populate handler, we don't know which mapping the fault came from, so it doesn't make sense to try and look up a VMA. In practice, there is no need to know the origin of the fault, we just need a pindex to select the page to map. - Introduce a struct drm_object_glue, which glues together a GEM object, a VM object, and a list of VMAs which map the object. The list of VMAs is mostly useless but I've avoided removing it for now. Most uses of the VMA are replaced by extending the thread-private vm_fault structure. - Convert the global linked list lock to an sx lock so that it's possible to hold it while allocating memory. - Change the DRM object fault interface to avoid referencing VMAs. This deviates from upstream, but the modified code is all quite FreeBSD-specific anyway. While here, fix a related problem: when mmap()ing a device file, drm_fstub_do_mmap() tries to infer the VM object type to use. In particular, it creates a "managed device" object for panfrost buffer objects, which isn't correct since the object is backed by host RAM. The problem is further illustrated by the need to clear VPO_UNMANAGED and set PG_FICTITIOUS: setting PG_FICTITIOUS in host RAM pages is incorrect and can trigger assertion failures in the contig reclaim code. My view is that it's not possible to correctly map DRM objects without modifying upstream sources a little bit. That is, we cannot hide everything in drmkpi/linuxkpi. Keeping this in mind, the change fixes the problem described above by adding a new VM object type to struct vm_operations_struct, used in drm_fstub_do_mmap() to allocate the correct type of VM object.
Configuration menu - View commit details
-
Copy full SHA for 88f3f0d - Browse repository at this point
Copy the full SHA 88f3f0dView commit details