On Mon, Mar 5, 2018 at 12:44 PM, Michel Dänzer <michel at daenzer.net> wrote: > From: Michel Dänzer <michel.daenzer at amd.com> > > Since xf86CursorCloseScreen runs after RADEONCloseScreen_KMS, > PointPriv->spriteFuncs doesn't point to the same struct in the latter as > in RADEONCursorInit_KMS. So we were restoring info->Set/MoveCursor to > the wrong struct. Then in the next server generation, > info->Set/MoveCursor would end up pointing to > drmmode_sprite_set/move_cursor, resulting in an infinite loop if one of > them was called. > > To avoid this, only change the Set/MoveCursor hooks if their values > match our expectations, otherwise leave them as is. This is kind of a > hack, but the alternative would be invasive and thus risky changes to > the way we're wrapping CloseScreen, and it's not even clear that can > work without changing xserver code. > > Fixes: 1fe8ca75974c ("Keep track of how many SW cursors are visible on > each screen") > Signed-off-by: Michel Dänzer <michel.daenzer at amd.com> Acked-by: Alex Deucher <alexander.deucher at amd.com> > --- > src/radeon_kms.c | 16 ++++++++++------ > 1 file changed, 10 insertions(+), 6 deletions(-) > > diff --git a/src/radeon_kms.c b/src/radeon_kms.c > index 85390e306..790d4be16 100644 > --- a/src/radeon_kms.c > +++ b/src/radeon_kms.c > @@ -2017,10 +2017,12 @@ static Bool RADEONCursorInit_KMS(ScreenPtr pScreen) > return FALSE; > } > > - info->SetCursor = PointPriv->spriteFuncs->SetCursor; > - info->MoveCursor = PointPriv->spriteFuncs->MoveCursor; > - PointPriv->spriteFuncs->SetCursor = drmmode_sprite_set_cursor; > - PointPriv->spriteFuncs->MoveCursor = drmmode_sprite_move_cursor; > + if (PointPriv->spriteFuncs->SetCursor != drmmode_sprite_set_cursor) { > + info->SetCursor = PointPriv->spriteFuncs->SetCursor; > + info->MoveCursor = PointPriv->spriteFuncs->MoveCursor; > + PointPriv->spriteFuncs->SetCursor = drmmode_sprite_set_cursor; > + PointPriv->spriteFuncs->MoveCursor = drmmode_sprite_move_cursor; > + } > } > > if (xf86ReturnOptValBool(info->Options, OPTION_SW_CURSOR, FALSE)) > @@ -2184,8 +2186,10 @@ static Bool RADEONCloseScreen_KMS(ScreenPtr pScreen) > miPointerScreenPtr PointPriv = > dixLookupPrivate(&pScreen->devPrivates, miPointerScreenKey); > > - PointPriv->spriteFuncs->SetCursor = info->SetCursor; > - PointPriv->spriteFuncs->MoveCursor = info->MoveCursor; > + if (PointPriv->spriteFuncs->SetCursor == drmmode_sprite_set_cursor) { > + PointPriv->spriteFuncs->SetCursor = info->SetCursor; > + PointPriv->spriteFuncs->MoveCursor = info->MoveCursor; > + } > } > > pScreen->BlockHandler = info->BlockHandler; > -- > 2.16.2 > > _______________________________________________ > amd-gfx mailing list > amd-gfx at lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/amd-gfx