minigbm: fix cros gralloc0 racing
"gralloc0_open" is only called on the allocator service(the unique
gralloc HAL service for allocation), which will additionally do
"module->common.methods->open(...)" to open the allocator device. For
other clients of cros gralloc, they just opened the gralloc library in
sp-hal as a helper library. Mesa is one of the clients here. All the
gralloc helpers relying on the underlying driver existence should ensure
the driver gets initialized before doing any driver ops.
This patch adds the minimal init required for the sane ops.
BUG=b:190010929
TEST=racing fixed
Change-Id: Ia662f68dccec0d0179d679d2e57b8b3975661506
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/minigbm/+/2935981
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
Commit-Queue: Yiwei Zhang <zzyiwei@chromium.org>
Tested-by: Yiwei Zhang <zzyiwei@chromium.org>
Tested-by: John Stultz <john.stultz@linaro.org>
diff --git a/cros_gralloc/gralloc0/gralloc0.cc b/cros_gralloc/gralloc0/gralloc0.cc
index 078ec24..4f72fbf 100644
--- a/cros_gralloc/gralloc0/gralloc0.cc
+++ b/cros_gralloc/gralloc0/gralloc0.cc
@@ -264,9 +264,10 @@
auto const_module = reinterpret_cast<const struct gralloc0_module *>(module);
auto mod = const_cast<struct gralloc0_module *>(const_module);
- if (!mod->initialized)
+ if (!mod->initialized) {
if (gralloc0_init(mod, false))
return -ENODEV;
+ }
return mod->driver->retain(handle);
}
@@ -310,11 +311,17 @@
uint32_t offsets[DRV_MAX_PLANES] = { 0, 0, 0, 0 };
uint64_t format_modifier = 0;
struct cros_gralloc0_buffer_info *info;
- auto mod = (struct gralloc0_module const *)module;
+ auto const_module = reinterpret_cast<const struct gralloc0_module *>(module);
+ auto mod = const_cast<struct gralloc0_module *>(const_module);
uint32_t req_usage;
uint32_t gralloc_usage = 0;
uint32_t *out_gralloc_usage;
+ if (!mod->initialized) {
+ if (gralloc0_init(mod, false))
+ return -ENODEV;
+ }
+
va_start(args, op);
switch (op) {
@@ -417,12 +424,18 @@
int32_t ret;
uint32_t map_flags;
uint8_t *addr[DRV_MAX_PLANES];
- auto mod = (struct gralloc0_module const *)module;
+ auto const_module = reinterpret_cast<const struct gralloc0_module *>(module);
+ auto mod = const_cast<struct gralloc0_module *>(const_module);
struct rectangle rect = { .x = static_cast<uint32_t>(l),
.y = static_cast<uint32_t>(t),
.width = static_cast<uint32_t>(w),
.height = static_cast<uint32_t>(h) };
+ if (!mod->initialized) {
+ if (gralloc0_init(mod, false))
+ return -ENODEV;
+ }
+
auto hnd = cros_gralloc_convert_handle(handle);
if (!hnd) {
drv_log("Invalid handle.\n");
@@ -462,12 +475,18 @@
uint32_t offsets[DRV_MAX_PLANES] = { 0, 0, 0, 0 };
uint64_t format_modifier = 0;
uint8_t *addr[DRV_MAX_PLANES] = { nullptr, nullptr, nullptr, nullptr };
- auto mod = (struct gralloc0_module const *)module;
+ auto const_module = reinterpret_cast<const struct gralloc0_module *>(module);
+ auto mod = const_cast<struct gralloc0_module *>(const_module);
struct rectangle rect = { .x = static_cast<uint32_t>(l),
.y = static_cast<uint32_t>(t),
.width = static_cast<uint32_t>(w),
.height = static_cast<uint32_t>(h) };
+ if (!mod->initialized) {
+ if (gralloc0_init(mod, false))
+ return -ENODEV;
+ }
+
auto hnd = cros_gralloc_convert_handle(handle);
if (!hnd) {
drv_log("Invalid handle.\n");