[V2] modesetting: code refactor for PRIME sync

jimqu jimqu at amd.com
Tue Aug 28 14:52:49 UTC 2018


Hi AlexG,

What's about new patch?

Thanks
JimQu


在 2018/8/27 13:37, Jim Qu 写道:
> The X will be crashed on the system with other DDX driver,
> such as amdgpu.
>
> show the log like:
>
> randr: falling back to unsynchronized pixmap sharing
> (EE)
> (EE) Backtrace:
> (EE) 0: /usr/lib/xorg/Xorg (xorg_backtrace+0x4e)
> (EE) 1: /usr/lib/xorg/Xorg (0x55cb0151a000+0x1b5ce9)
> (EE) 2: /lib/x86_64-linux-gnu/libpthread.so.0 (0x7f1587a1d000+0x11390)
> (EE)
> (EE) Segmentation fault at address 0x0
> (EE)
>
> The issue is that modesetting as the master, and amdgpu as the slave.
> Thus, when the master attempts to access pSlavePixPriv in ms_dirty_update(),
> problems result due to the fact that it's accessing AMD's 'ppriv' using the
> modesetting structure definition.
>
> Apart from fixing crash issue, the patch fix other issue in master interface
> in which driver should refer to master pixmap.
>
> Change-Id: I274633c9657c3621c95efd7632355662b9f5052c
> Signed-off-by: Jim Qu <Jim.Qu at amd.com>
> ---
>   hw/xfree86/drivers/modesetting/driver.c | 36 +++++++++++++++++----------------
>   1 file changed, 19 insertions(+), 17 deletions(-)
>
> diff --git a/hw/xfree86/drivers/modesetting/driver.c b/hw/xfree86/drivers/modesetting/driver.c
> index 9362370..792dfb6 100644
> --- a/hw/xfree86/drivers/modesetting/driver.c
> +++ b/hw/xfree86/drivers/modesetting/driver.c
> @@ -640,19 +640,21 @@ ms_dirty_update(ScreenPtr screen, int *timeout)
>       xorg_list_for_each_entry(ent, &screen->pixmap_dirty_list, ent) {
>           region = DamageRegion(ent->damage);
>           if (RegionNotEmpty(region)) {
> -            msPixmapPrivPtr ppriv =
> -                msGetPixmapPriv(&ms->drmmode, ent->slave_dst);
> +            if (!screen->isGPU) {
> +                   msPixmapPrivPtr ppriv =
> +                    msGetPixmapPriv(&ms->drmmode, ent->slave_dst->master_pixmap);
>   
> -            if (ppriv->notify_on_damage) {
> -                ppriv->notify_on_damage = FALSE;
> +                if (ppriv->notify_on_damage) {
> +                    ppriv->notify_on_damage = FALSE;
>   
> -                ent->slave_dst->drawable.pScreen->
> -                    SharedPixmapNotifyDamage(ent->slave_dst);
> -            }
> +                    ent->slave_dst->drawable.pScreen->
> +                        SharedPixmapNotifyDamage(ent->slave_dst);
> +                }
>   
> -            /* Requested manual updating */
> -            if (ppriv->defer_dirty_update)
> -                continue;
> +                /* Requested manual updating */
> +                if (ppriv->defer_dirty_update)
> +                    continue;
> +            }
>   
>               redisplay_dirty(screen, ent, timeout);
>               DamageEmpty(ent->damage);
> @@ -1251,8 +1253,8 @@ msStartFlippingPixmapTracking(RRCrtcPtr crtc, DrawablePtr src,
>       ScreenPtr pScreen = src->pScreen;
>       modesettingPtr ms = modesettingPTR(xf86ScreenToScrn(pScreen));
>   
> -    msPixmapPrivPtr ppriv1 = msGetPixmapPriv(&ms->drmmode, slave_dst1),
> -                    ppriv2 = msGetPixmapPriv(&ms->drmmode, slave_dst2);
> +    msPixmapPrivPtr ppriv1 = msGetPixmapPriv(&ms->drmmode, slave_dst1->master_pixmap),
> +                    ppriv2 = msGetPixmapPriv(&ms->drmmode, slave_dst2->master_pixmap);
>   
>       if (!PixmapStartDirtyTracking(src, slave_dst1, x, y,
>                                     dst_x, dst_y, rotation)) {
> @@ -1280,10 +1282,10 @@ msStartFlippingPixmapTracking(RRCrtcPtr crtc, DrawablePtr src,
>   static Bool
>   msPresentSharedPixmap(PixmapPtr slave_dst)
>   {
> -    ScreenPtr pScreen = slave_dst->drawable.pScreen;
> +    ScreenPtr pScreen = slave_dst->master_pixmap->drawable.pScreen;
>       modesettingPtr ms = modesettingPTR(xf86ScreenToScrn(pScreen));
>   
> -    msPixmapPrivPtr ppriv = msGetPixmapPriv(&ms->drmmode, slave_dst);
> +    msPixmapPrivPtr ppriv = msGetPixmapPriv(&ms->drmmode, slave_dst->master_pixmap);
>   
>       RegionPtr region = DamageRegion(ppriv->dirty->damage);
>   
> @@ -1304,8 +1306,8 @@ msStopFlippingPixmapTracking(DrawablePtr src,
>       ScreenPtr pScreen = src->pScreen;
>       modesettingPtr ms = modesettingPTR(xf86ScreenToScrn(pScreen));
>   
> -    msPixmapPrivPtr ppriv1 = msGetPixmapPriv(&ms->drmmode, slave_dst1),
> -                    ppriv2 = msGetPixmapPriv(&ms->drmmode, slave_dst2);
> +    msPixmapPrivPtr ppriv1 = msGetPixmapPriv(&ms->drmmode, slave_dst1->master_pixmap),
> +                    ppriv2 = msGetPixmapPriv(&ms->drmmode, slave_dst2->master_pixmap);
>   
>       Bool ret = TRUE;
>   
> @@ -1471,7 +1473,7 @@ msRequestSharedPixmapNotifyDamage(PixmapPtr ppix)
>       ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
>       modesettingPtr ms = modesettingPTR(scrn);
>   
> -    msPixmapPrivPtr ppriv = msGetPixmapPriv(&ms->drmmode, ppix);
> +    msPixmapPrivPtr ppriv = msGetPixmapPriv(&ms->drmmode, ppix->master_pixmap);
>   
>       ppriv->notify_on_damage = TRUE;
>   



More information about the xorg-devel mailing list