All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dan Carpenter <dan.carpenter-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org>
To: ckoenig.leichtzumerken-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org
Cc: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org
Subject: [bug report] drm/amd/display: wait for fence without holding reservation lock
Date: Thu, 2 May 2019 11:04:42 +0300	[thread overview]
Message-ID: <20190502080442.GA29009@mwanda> (raw)

Hello Christian König,

The patch 2fac0f53fe59: "drm/amd/display: wait for fence without
holding reservation lock" from Apr 2, 2019, leads to the following
static checker warning:

	drivers/gpu/drm/amd/amdgpu/../display/amdgpu_dm/amdgpu_dm.c:5338 amdgpu_dm_commit_planes()
	warn: 'r' unsigned <= 0

drivers/gpu/drm/amd/amdgpu/../display/amdgpu_dm/amdgpu_dm.c
  5238  static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
  5239                                      struct dc_state *dc_state,
  5240                                      struct drm_device *dev,
  5241                                      struct amdgpu_display_manager *dm,
  5242                                      struct drm_crtc *pcrtc,
  5243                                      bool wait_for_vblank)
  5244  {
  5245          uint32_t i, r;
                ^^^^^^^^    ^

  5246          uint64_t timestamp_ns;
  5247          struct drm_plane *plane;
  5248          struct drm_plane_state *old_plane_state, *new_plane_state;
  5249          struct amdgpu_crtc *acrtc_attach = to_amdgpu_crtc(pcrtc);
  5250          struct drm_crtc_state *new_pcrtc_state =
  5251                          drm_atomic_get_new_crtc_state(state, pcrtc);
  5252          struct dm_crtc_state *acrtc_state = to_dm_crtc_state(new_pcrtc_state);
  5253          struct dm_crtc_state *dm_old_crtc_state =
  5254                          to_dm_crtc_state(drm_atomic_get_old_crtc_state(state, pcrtc));
  5255          int planes_count = 0, vpos, hpos;
  5256          unsigned long flags;
  5257          struct amdgpu_bo *abo;
  5258          uint64_t tiling_flags;
  5259          uint32_t target_vblank, last_flip_vblank;
  5260          bool vrr_active = amdgpu_dm_vrr_active(acrtc_state);
  5261          bool pflip_present = false;
  5262          struct {
  5263                  struct dc_surface_update surface_updates[MAX_SURFACES];
  5264                  struct dc_plane_info plane_infos[MAX_SURFACES];
  5265                  struct dc_scaling_info scaling_infos[MAX_SURFACES];
  5266                  struct dc_flip_addrs flip_addrs[MAX_SURFACES];
  5267                  struct dc_stream_update stream_update;
  5268          } *bundle;
  5269  
  5270          bundle = kzalloc(sizeof(*bundle), GFP_KERNEL);
  5271  
  5272          if (!bundle) {
  5273                  dm_error("Failed to allocate update bundle\n");
  5274                  goto cleanup;
  5275          }
  5276  
  5277          /*
  5278           * Disable the cursor first if we're disabling all the planes.
  5279           * It'll remain on the screen after the planes are re-enabled
  5280           * if we don't.
  5281           */
  5282          if (acrtc_state->active_planes == 0)
  5283                  amdgpu_dm_commit_cursors(state);
  5284  
  5285          /* update planes when needed */
  5286          for_each_oldnew_plane_in_state(state, plane, old_plane_state, new_plane_state, i) {
  5287                  struct drm_crtc *crtc = new_plane_state->crtc;
  5288                  struct drm_crtc_state *new_crtc_state;
  5289                  struct drm_framebuffer *fb = new_plane_state->fb;
  5290                  bool plane_needs_flip;
  5291                  struct dc_plane_state *dc_plane;
  5292                  struct dm_plane_state *dm_new_plane_state = to_dm_plane_state(new_plane_state);
  5293  
  5294                  /* Cursor plane is handled after stream updates */
  5295                  if (plane->type == DRM_PLANE_TYPE_CURSOR)
  5296                          continue;
  5297  
  5298                  if (!fb || !crtc || pcrtc != crtc)
  5299                          continue;
  5300  
  5301                  new_crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
  5302                  if (!new_crtc_state->active)
  5303                          continue;
  5304  
  5305                  dc_plane = dm_new_plane_state->dc_state;
  5306  
  5307                  bundle->surface_updates[planes_count].surface = dc_plane;
  5308                  if (new_pcrtc_state->color_mgmt_changed) {
  5309                          bundle->surface_updates[planes_count].gamma = dc_plane->gamma_correction;
  5310                          bundle->surface_updates[planes_count].in_transfer_func = dc_plane->in_transfer_func;
  5311                  }
  5312  
  5313                  fill_dc_scaling_info(new_plane_state,
  5314                                       &bundle->scaling_infos[planes_count]);
  5315  
  5316                  bundle->surface_updates[planes_count].scaling_info =
  5317                          &bundle->scaling_infos[planes_count];
  5318  
  5319                  plane_needs_flip = old_plane_state->fb && new_plane_state->fb;
  5320  
  5321                  pflip_present = pflip_present || plane_needs_flip;
  5322  
  5323                  if (!plane_needs_flip) {
  5324                          planes_count += 1;
  5325                          continue;
  5326                  }
  5327  
  5328                  abo = gem_to_amdgpu_bo(fb->obj[0]);
  5329  
  5330                  /*
  5331                   * Wait for all fences on this FB. Do limited wait to avoid
  5332                   * deadlock during GPU reset when this fence will not signal
  5333                   * but we hold reservation lock for the BO.
  5334                   */
  5335                  r = reservation_object_wait_timeout_rcu(abo->tbo.resv, true,
  5336                                                          false,
  5337                                                          msecs_to_jiffies(5000));
  5338                  if (unlikely(r <= 0))
                            ^^^^^^^^^^^^^^^^

If reservation_object_wait_timeout_rcu() then r is unsigned.  Also this
just prints an error instead of doing proper error handling so it's not
really worth fixing?

  5339                          DRM_ERROR("Waiting for fences timed out or interrupted!");
  5340  
  5341                  /*
  5342                   * TODO This might fail and hence better not used, wait
  5343                   * explicitly on fences instead
  5344                   * and in general should be called for
  5345                   * blocking commit to as per framework helpers
  5346                   */
  5347                  r = amdgpu_bo_reserve(abo, true);
  5348                  if (unlikely(r != 0))
  5349                          DRM_ERROR("failed to reserve buffer before flip\n");
  5350  
  5351                  amdgpu_bo_get_tiling_flags(abo, &tiling_flags);
  5352  
  5353                  amdgpu_bo_unreserve(abo);

regards,
dan carpenter
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

             reply	other threads:[~2019-05-02  8:04 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-05-02  8:04 Dan Carpenter [this message]
2019-05-02 12:56 ` [bug report] drm/amd/display: wait for fence without holding reservation lock Kazlauskas, Nicholas

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190502080442.GA29009@mwanda \
    --to=dan.carpenter-qhclzuegtsvqt0dzr+alfa@public.gmane.org \
    --cc=amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org \
    --cc=ckoenig.leichtzumerken-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.