No description
In crosvm, the MinigbmDevice implementation of the Gralloc interface assumes that a call to get_image_memory_requirements will be immediately followed by a matching call to allocate_memory, as the implementation stashes a buffer allocated by the first call to be returned by the second. However on Android multiple processes/threads can be making calls to allocate memory via CrosGralloc. In particular if the device is configured to use the cross-domain back-end, and two threads are trying to allocate memory, the two requests to get the memory requirements for an allocation can be submitted to crosvm followed by the two requests to actually allocate memory. When the assumption is violated, the crosvm code was raising an error for the SECOND memory requirement request. However the error does not propagate back to the virtgpu_cross_domain code here. The result is that the request is understood to have succeeded, and the code here then reads the size metadata from the response buffer, but that contains the values from the FIRST memory requirement request. Those values may be There is a fix for crosvm in review (https://crrev.com/c/6260975) to not raise an error if the calls are not made in the expected order, while still maintaining a single stashed buffer. However this means the memory allocated for one of the two requests must be released, and would have to be reallocated, at some extra runtime cost as allocating graphics memory requires allocating physically contiguous memory. The existing cross-domain code here acquired a simple mutex lock to maintain a metadata cache, which was held for the duration of the first call. This change extends the duration of the lock to the entire allocation request so that the guest always makes the two requests in the expected order. BUG=b:395748805,b:355060470 TEST=ARCVM on Corsola starts up under high CPU stress Change-Id: I6429ea28141ef440345a3eb442066173b3e04802 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/minigbm/+/6288246 Commit-Queue: Lloyd Pique <lpique@google.com> Reviewed-by: Yiwei Zhang <zzyiwei@chromium.org> Tested-by: Lloyd Pique <lpique@google.com> |
||
|---|---|---|
| cros_gralloc | ||
| external | ||
| .clang-format | ||
| amdgpu.c | ||
| backend_mock.c | ||
| common.mk | ||
| DIR_METADATA | ||
| dri.c | ||
| dri.h | ||
| drv.c | ||
| drv.h | ||
| drv_array_helpers.c | ||
| drv_array_helpers.h | ||
| drv_helpers.c | ||
| drv_helpers.h | ||
| drv_priv.h | ||
| dumb_driver.c | ||
| gbm.c | ||
| gbm.h | ||
| gbm_helpers.c | ||
| gbm_helpers.h | ||
| gbm_priv.h | ||
| gbm_unittest.cc | ||
| i915.c | ||
| intel_defines.h | ||
| LICENSE | ||
| Makefile | ||
| mediatek.c | ||
| minigbm_helpers.c | ||
| minigbm_helpers.h | ||
| msm.c | ||
| OWNERS | ||
| PRESUBMIT.cfg | ||
| presubmit.sh | ||
| rockchip.c | ||
| testrunner.cc | ||
| util.h | ||
| vc4.c | ||
| virtgpu.c | ||
| virtgpu.h | ||
| virtgpu_cross_domain.c | ||
| virtgpu_virgl.c | ||
| xe.c | ||