修訂 | 81a42e87b9c26dc3fda79f4bc6b4e1491da6aaa7 (tree) |
---|---|
時間 | 2017-05-05 02:10:08 |
作者 | Paulo Sergio Travaglia <pstglia@gmai...> |
Commiter | Chih-Wei Huang |
HACK - Avoid crashes on SurfaceFlinger when using software rendering
When using sw rendering, depending user action (pressing HOME button after
lauching an app, for instance) there's an attempt do map a vaddr that has
already been mapped. And this is done by the process that created it.
This triggers a kernel trap and surfaceflinger is destroyed:
10-30 18:14:11.474 1096 1645 D gralloc : gralloc_map() succeeded fd=59,
10-30 18:14:11.474 1355 1389 D gralloc : gralloc_map() succeeded fd=202,
10-30 18:14:11.475 1096 1096 D gralloc : Registering a buffer in the
process that created it. This may cause memory ordering problems.
10-30 18:14:11.475 1096 1096 D gralloc : gralloc_map() succeeded
fd=60, off=0, size=1028096, vaddr=0xaac21000
10-30 18:14:11.574 1095 1095 I ServiceManager: service 'gpu' died
In order to avoid this, the patch avoids mapping a buffer when the
mapping process is the creator process.
This should be threated as a workaround and removed when the real
root cause is discovered.
@@ -116,9 +116,11 @@ int gralloc_register_buffer(gralloc_module_t const* module, | ||
116 | 116 | // problems. Most modern L1 caches fit that description. |
117 | 117 | |
118 | 118 | private_handle_t* hnd = (private_handle_t*)handle; |
119 | - ALOGD_IF(hnd->pid == getpid(), | |
120 | - "Registering a buffer in the process that created it. " | |
121 | - "This may cause memory ordering problems."); | |
119 | + if (hnd->pid == getpid()) { | |
120 | + ALOGD("Avoid registering a buffer in the process that created it. " | |
121 | + "This may cause memory ordering problems."); | |
122 | + return 1; | |
123 | + } | |
122 | 124 | |
123 | 125 | void *vaddr; |
124 | 126 | return gralloc_map(module, handle, &vaddr); |