Peculiarity in vmwgfx_mob.c

Zack Rusin zackr at vmware.com
Sun Jun 13 17:37:20 UTC 2021


On 6/13/21 6:08 AM, Martin Krastev wrote:
> Hey, Zack
> 
> Looking at vmw_otable_batch_takedown() in vmwgfx-next circa 467343468d53 I've noticed something puzzling. Here's the current state of the fn:
> 
> d80efd5cb3dec (Thomas Hellstrom      2015-08-10 10:39:35 -0700 338) static void vmw_otable_batch_takedown(struct vmw_private *dev_priv,
> d80efd5cb3dec (Thomas Hellstrom      2015-08-10 10:39:35 -0700 339)                            struct vmw_otable_batch *batch)
> 3530bdc35e99c (Thomas Hellstrom      2012-11-21 10:49:52 +0100 340) {
> 3530bdc35e99c (Thomas Hellstrom      2012-11-21 10:49:52 +0100 341)     SVGAOTableType i;
> d80efd5cb3dec (Thomas Hellstrom      2015-08-10 10:39:35 -0700 342)     struct ttm_buffer_object *bo = batch->otable_bo;
> 3530bdc35e99c (Thomas Hellstrom      2012-11-21 10:49:52 +0100 343)     int ret;
> 3530bdc35e99c (Thomas Hellstrom      2012-11-21 10:49:52 +0100 344)
> d80efd5cb3dec (Thomas Hellstrom      2015-08-10 10:39:35 -0700 345)     for (i = 0; i < batch->num_otables; ++i)
> d80efd5cb3dec (Thomas Hellstrom      2015-08-10 10:39:35 -0700 346)             if (batch->otables[i].enabled)
> d80efd5cb3dec (Thomas Hellstrom      2015-08-10 10:39:35 -0700 347)                     vmw_takedown_otable_base(dev_priv, i,
> d80efd5cb3dec (Thomas Hellstrom      2015-08-10 10:39:35 -0700 348)                                              &batch->otables[i]);
> 3530bdc35e99c (Thomas Hellstrom      2012-11-21 10:49:52 +0100 349)
> dfd5e50ea43ca (Christian König       2016-04-06 11:12:03 +0200 350)     ret = ttm_bo_reserve(bo, false, true, NULL);
> 3530bdc35e99c (Thomas Hellstrom      2012-11-21 10:49:52 +0100 351)     BUG_ON(ret != 0);
> 3530bdc35e99c (Thomas Hellstrom      2012-11-21 10:49:52 +0100 352)
> e9431ea5076a9 (Thomas Hellstrom      2018-06-19 15:33:53 +0200 353)     vmw_bo_fence_single(bo, NULL);
> 2ef4fb92363c4 (Zack Rusin            2021-03-22 13:04:11 -0400 354)     ttm_bo_unpin(bo);
> 3530bdc35e99c (Thomas Hellstrom      2012-11-21 10:49:52 +0100 355)     ttm_bo_unreserve(bo);
> 3530bdc35e99c (Thomas Hellstrom      2012-11-21 10:49:52 +0100 356)
> d1a73c641afd2 (Zack Rusin            2021-01-14 18:38:16 -0500 357)     ttm_bo_unpin(batch->otable_bo);
> 6034d9d48e62a (Thomas Zimmermann     2019-01-25 12:02:09 +0100 358)     ttm_bo_put(batch->otable_bo);
> 6034d9d48e62a (Thomas Zimmermann     2019-01-25 12:02:09 +0100 359)     batch->otable_bo = NULL;
> 3530bdc35e99c (Thomas Hellstrom      2012-11-21 10:49:52 +0100 360) }
> 
> Line 357 does a repeat unpinning of the batch->otable_bo, which we already unpinned on line 354.
> 
> But according to 2ef4fb92363c4 line 357 should not look like that!
> 
> @@ -341,9 +351,9 @@ static void vmw_otable_batch_takedown(struct vmw_private *dev_priv,
>          BUG_ON(ret != 0);
>   
>          vmw_bo_fence_single(bo, NULL);
> +       ttm_bo_unpin(bo);
>          ttm_bo_unreserve(bo);
>   
> -       ttm_bo_unpin(batch->otable_bo);
>          ttm_bo_put(batch->otable_bo);
>          batch->otable_bo = NULL;
>   }
> 
> 
> Can you confirm you're seeing what I'm seeing?

Great catch Martin. Yes, this looks like a bad merge that I missed. It looks like it was introduced in:
68a32ba14177 ("Merge tag 'drm-next-2021-04-28' of git://anongit.freedesktop.org/drm/drm")

So, what most likely has happened was that the change:
2ef4fb92363c ("drm/vmwgfx: Make sure bo's are unpinned before putting them back")
probably conflicted with something in either drm-misc-next, Dave's tree or Linus' tree and it was manually resolved by the givens tree's maintainers during the merge and accidentally reintroduced the code that patch was fixing.

I don't know of an automatic way of monitoring for those types of issues, maybe Daniel or Dave know of something. I'll just have to pay a little more attention to what goes in Linus' tree in the future.

z


More information about the dri-devel mailing list