[Mesa-dev] [PATCH 3/3] r600g, radeonsi: attempt to fix racy multi-context apps calling BufferData
Michel Dänzer
michel at daenzer.net
Tue Mar 11 00:33:45 PDT 2014
On Son, 2014-03-09 at 02:24 +0100, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=75061
[...]
> @@ -136,15 +137,23 @@ bool r600_init_resource(struct r600_common_screen *rscreen,
> res->domains = RADEON_DOMAIN_VRAM;
> }
>
> - /* Allocate the resource. */
> - res->buf = rscreen->ws->buffer_create(rscreen->ws, size, alignment,
> - use_reusable_pool,
> - res->domains);
> - if (!res->buf) {
> + /* Allocate a new resource. */
> + new_buf = rscreen->ws->buffer_create(rscreen->ws, size, alignment,
> + use_reusable_pool,
> + res->domains);
> + if (!new_buf) {
> return false;
> }
>
> + /* Replace the pointer such that if res->buf wasn't NULL, it won't be
> + * NULL. This should prevent crashes with multiple contexts using
> + * the same buffer where one of the contexts invalidates it while
> + * the others are using it. */
> + old_buf = res->buf;
> + res->buf = new_buf; /* this should be atomic */
> res->cs_buf = rscreen->ws->buffer_get_cs_handle(res->buf);
> + pb_reference(&old_buf, NULL);
> +
This removes the window where res->buf is NULL, but it leaves a small
window where res->cs_buf doesn't match res->buf. In case that might
still cause subtle issues, the window should be minimal like this:
old_buf = res->buf;
res->cs_buf = rscreen->ws->buffer_get_cs_handle(new_buf);
res->buf = new_buf; /* this should be atomic */
You mentioned on IRC that there is a known bug in patch 1. Patch 2 is
Reviewed-by: Michel Dänzer <michel.daenzer at amd.com>
--
Earthling Michel Dänzer | http://www.amd.com
Libre software enthusiast | Mesa and X developer
More information about the mesa-dev
mailing list