dri-devel.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
From: Rob Clark <robdclark@gmail.com>
To: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: DRI Development <dri-devel@lists.freedesktop.org>
Subject: Re: [PATCH 03/35] drm/<drivers>: reorder framebuffer init sequence
Date: Fri, 11 Jan 2013 15:06:00 -0600	[thread overview]
Message-ID: <CAF6AEGtF2cAn7xJWJvM-T=_Ymjj2HjjOuFO7yTCLo1k_C8JYuw@mail.gmail.com> (raw)
In-Reply-To: <1357850897-27102-4-git-send-email-daniel.vetter@ffwll.ch>

On Thu, Jan 10, 2013 at 2:47 PM, Daniel Vetter <daniel.vetter@ffwll.ch> wrote:
> With more fine-grained locking we can no longer rely on the big
> mode_config lock to prevent concurrent access to mode resources
> like framebuffers. Instead a framebuffer becomes accessible to
> other threads as soon as it is added to the relevant lookup
> structures. Hence it needs to be fully set up by the time drivers
> call drm_framebuffer_init.
>
> This patch here is the drivers part of that reorg. Nothing really fancy
> going on safe for three special cases.
>
> - exynos needs to be careful to properly unref all handles.
> - nouveau gets a resource leak fixed for free: one of the error
>   cases didn't cleanup the framebuffer, which is now moot since
>   the framebuffer is only registered once it is fully set up.
> - vmwgfx requires a slight reordering of operations, I'm hoping I didn't
>   break anything (but it's refcount management only, so should be safe).
>
> v2: Split out exynos, since it's a bit more hairy than expected.
>
> v3: Drop bogus cirrus hunk noticed by Richard Wilbur.
>
> v4: Split out vmwgfx since there's a small change in return values.
>
> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>

for the omapdrm part:

Reviewed-by: Rob Clark <rob@ti.com>

> ---
>  drivers/gpu/drm/ast/ast_main.c            |    4 ++--
>  drivers/gpu/drm/cirrus/cirrus_main.c      |    4 ++--
>  drivers/gpu/drm/drm_fb_cma_helper.c       |   10 +++++-----
>  drivers/gpu/drm/gma500/framebuffer.c      |    4 ++--
>  drivers/gpu/drm/i915/intel_display.c      |    5 +++--
>  drivers/gpu/drm/mgag200/mgag200_main.c    |    8 +++++---
>  drivers/gpu/drm/nouveau/nouveau_display.c |   10 +++++-----
>  drivers/gpu/drm/radeon/radeon_display.c   |    2 +-
>  drivers/gpu/drm/udl/udl_fb.c              |    2 +-
>  drivers/staging/omapdrm/omap_fb.c         |   16 ++++++++--------
>  10 files changed, 34 insertions(+), 31 deletions(-)
>
> diff --git a/drivers/gpu/drm/ast/ast_main.c b/drivers/gpu/drm/ast/ast_main.c
> index f668e6c..d5ba709 100644
> --- a/drivers/gpu/drm/ast/ast_main.c
> +++ b/drivers/gpu/drm/ast/ast_main.c
> @@ -266,13 +266,13 @@ int ast_framebuffer_init(struct drm_device *dev,
>  {
>         int ret;
>
> +       drm_helper_mode_fill_fb_struct(&ast_fb->base, mode_cmd);
> +       ast_fb->obj = obj;
>         ret = drm_framebuffer_init(dev, &ast_fb->base, &ast_fb_funcs);
>         if (ret) {
>                 DRM_ERROR("framebuffer init failed %d\n", ret);
>                 return ret;
>         }
> -       drm_helper_mode_fill_fb_struct(&ast_fb->base, mode_cmd);
> -       ast_fb->obj = obj;
>         return 0;
>  }
>
> diff --git a/drivers/gpu/drm/cirrus/cirrus_main.c b/drivers/gpu/drm/cirrus/cirrus_main.c
> index 6a9b12e..364474c 100644
> --- a/drivers/gpu/drm/cirrus/cirrus_main.c
> +++ b/drivers/gpu/drm/cirrus/cirrus_main.c
> @@ -42,13 +42,13 @@ int cirrus_framebuffer_init(struct drm_device *dev,
>  {
>         int ret;
>
> +       drm_helper_mode_fill_fb_struct(&gfb->base, mode_cmd);
> +       gfb->obj = obj;
>         ret = drm_framebuffer_init(dev, &gfb->base, &cirrus_fb_funcs);
>         if (ret) {
>                 DRM_ERROR("drm_framebuffer_init failed: %d\n", ret);
>                 return ret;
>         }
> -       drm_helper_mode_fill_fb_struct(&gfb->base, mode_cmd);
> -       gfb->obj = obj;
>         return 0;
>  }
>
> diff --git a/drivers/gpu/drm/drm_fb_cma_helper.c b/drivers/gpu/drm/drm_fb_cma_helper.c
> index fd9d0af..e1e0cb0 100644
> --- a/drivers/gpu/drm/drm_fb_cma_helper.c
> +++ b/drivers/gpu/drm/drm_fb_cma_helper.c
> @@ -85,6 +85,11 @@ static struct drm_fb_cma *drm_fb_cma_alloc(struct drm_device *dev,
>         if (!fb_cma)
>                 return ERR_PTR(-ENOMEM);
>
> +       drm_helper_mode_fill_fb_struct(&fb_cma->fb, mode_cmd);
> +
> +       for (i = 0; i < num_planes; i++)
> +               fb_cma->obj[i] = obj[i];
> +
>         ret = drm_framebuffer_init(dev, &fb_cma->fb, &drm_fb_cma_funcs);
>         if (ret) {
>                 dev_err(dev->dev, "Failed to initalize framebuffer: %d\n", ret);
> @@ -92,11 +97,6 @@ static struct drm_fb_cma *drm_fb_cma_alloc(struct drm_device *dev,
>                 return ERR_PTR(ret);
>         }
>
> -       drm_helper_mode_fill_fb_struct(&fb_cma->fb, mode_cmd);
> -
> -       for (i = 0; i < num_planes; i++)
> -               fb_cma->obj[i] = obj[i];
> -
>         return fb_cma;
>  }
>
> diff --git a/drivers/gpu/drm/gma500/framebuffer.c b/drivers/gpu/drm/gma500/framebuffer.c
> index afded54..38e7e75 100644
> --- a/drivers/gpu/drm/gma500/framebuffer.c
> +++ b/drivers/gpu/drm/gma500/framebuffer.c
> @@ -260,13 +260,13 @@ static int psb_framebuffer_init(struct drm_device *dev,
>         default:
>                 return -EINVAL;
>         }
> +       drm_helper_mode_fill_fb_struct(&fb->base, mode_cmd);
> +       fb->gtt = gt;
>         ret = drm_framebuffer_init(dev, &fb->base, &psb_fb_funcs);
>         if (ret) {
>                 dev_err(dev->dev, "framebuffer init failed: %d\n", ret);
>                 return ret;
>         }
> -       drm_helper_mode_fill_fb_struct(&fb->base, mode_cmd);
> -       fb->gtt = gt;
>         return 0;
>  }
>
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index cf0c713..b2af790 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -8387,14 +8387,15 @@ int intel_framebuffer_init(struct drm_device *dev,
>         if (mode_cmd->offsets[0] != 0)
>                 return -EINVAL;
>
> +       drm_helper_mode_fill_fb_struct(&intel_fb->base, mode_cmd);
> +       intel_fb->obj = obj;
> +
>         ret = drm_framebuffer_init(dev, &intel_fb->base, &intel_fb_funcs);
>         if (ret) {
>                 DRM_ERROR("framebuffer init failed %d\n", ret);
>                 return ret;
>         }
>
> -       drm_helper_mode_fill_fb_struct(&intel_fb->base, mode_cmd);
> -       intel_fb->obj = obj;
>         return 0;
>  }
>
> diff --git a/drivers/gpu/drm/mgag200/mgag200_main.c b/drivers/gpu/drm/mgag200/mgag200_main.c
> index 70dd3c5..266438a 100644
> --- a/drivers/gpu/drm/mgag200/mgag200_main.c
> +++ b/drivers/gpu/drm/mgag200/mgag200_main.c
> @@ -40,13 +40,15 @@ int mgag200_framebuffer_init(struct drm_device *dev,
>                              struct drm_mode_fb_cmd2 *mode_cmd,
>                              struct drm_gem_object *obj)
>  {
> -       int ret = drm_framebuffer_init(dev, &gfb->base, &mga_fb_funcs);
> +       int ret;
> +
> +       drm_helper_mode_fill_fb_struct(&gfb->base, mode_cmd);
> +       gfb->obj = obj;
> +       ret = drm_framebuffer_init(dev, &gfb->base, &mga_fb_funcs);
>         if (ret) {
>                 DRM_ERROR("drm_framebuffer_init failed: %d\n", ret);
>                 return ret;
>         }
> -       drm_helper_mode_fill_fb_struct(&gfb->base, mode_cmd);
> -       gfb->obj = obj;
>         return 0;
>  }
>
> diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c b/drivers/gpu/drm/nouveau/nouveau_display.c
> index e4188f2..2591ff2 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_display.c
> +++ b/drivers/gpu/drm/nouveau/nouveau_display.c
> @@ -78,11 +78,6 @@ nouveau_framebuffer_init(struct drm_device *dev,
>         struct drm_framebuffer *fb = &nv_fb->base;
>         int ret;
>
> -       ret = drm_framebuffer_init(dev, fb, &nouveau_framebuffer_funcs);
> -       if (ret) {
> -               return ret;
> -       }
> -
>         drm_helper_mode_fill_fb_struct(fb, mode_cmd);
>         nv_fb->nvbo = nvbo;
>
> @@ -125,6 +120,11 @@ nouveau_framebuffer_init(struct drm_device *dev,
>                 }
>         }
>
> +       ret = drm_framebuffer_init(dev, fb, &nouveau_framebuffer_funcs);
> +       if (ret) {
> +               return ret;
> +       }
> +
>         return 0;
>  }
>
> diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c
> index 1da2386..12ec3ef 100644
> --- a/drivers/gpu/drm/radeon/radeon_display.c
> +++ b/drivers/gpu/drm/radeon/radeon_display.c
> @@ -1089,12 +1089,12 @@ radeon_framebuffer_init(struct drm_device *dev,
>  {
>         int ret;
>         rfb->obj = obj;
> +       drm_helper_mode_fill_fb_struct(&rfb->base, mode_cmd);
>         ret = drm_framebuffer_init(dev, &rfb->base, &radeon_fb_funcs);
>         if (ret) {
>                 rfb->obj = NULL;
>                 return ret;
>         }
> -       drm_helper_mode_fill_fb_struct(&rfb->base, mode_cmd);
>         return 0;
>  }
>
> diff --git a/drivers/gpu/drm/udl/udl_fb.c b/drivers/gpu/drm/udl/udl_fb.c
> index d4ab3be..829c4a7 100644
> --- a/drivers/gpu/drm/udl/udl_fb.c
> +++ b/drivers/gpu/drm/udl/udl_fb.c
> @@ -435,8 +435,8 @@ udl_framebuffer_init(struct drm_device *dev,
>         int ret;
>
>         ufb->obj = obj;
> -       ret = drm_framebuffer_init(dev, &ufb->base, &udlfb_funcs);
>         drm_helper_mode_fill_fb_struct(&ufb->base, mode_cmd);
> +       ret = drm_framebuffer_init(dev, &ufb->base, &udlfb_funcs);
>         return ret;
>  }
>
> diff --git a/drivers/staging/omapdrm/omap_fb.c b/drivers/staging/omapdrm/omap_fb.c
> index 09028e9..bf6421f 100644
> --- a/drivers/staging/omapdrm/omap_fb.c
> +++ b/drivers/staging/omapdrm/omap_fb.c
> @@ -424,14 +424,6 @@ struct drm_framebuffer *omap_framebuffer_init(struct drm_device *dev,
>         }
>
>         fb = &omap_fb->base;
> -       ret = drm_framebuffer_init(dev, fb, &omap_framebuffer_funcs);
> -       if (ret) {
> -               dev_err(dev->dev, "framebuffer init failed: %d\n", ret);
> -               goto fail;
> -       }
> -
> -       DBG("create: FB ID: %d (%p)", fb->base.id, fb);
> -
>         omap_fb->format = format;
>
>         for (i = 0; i < n; i++) {
> @@ -462,6 +454,14 @@ struct drm_framebuffer *omap_framebuffer_init(struct drm_device *dev,
>
>         drm_helper_mode_fill_fb_struct(fb, mode_cmd);
>
> +       ret = drm_framebuffer_init(dev, fb, &omap_framebuffer_funcs);
> +       if (ret) {
> +               dev_err(dev->dev, "framebuffer init failed: %d\n", ret);
> +               goto fail;
> +       }
> +
> +       DBG("create: FB ID: %d (%p)", fb->base.id, fb);
> +
>         return fb;
>
>  fail:
> --
> 1.7.10.4
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel

  reply	other threads:[~2013-01-11 21:06 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-01-10 20:47 [PATCH 00/36] kms locking rework Daniel Vetter
2013-01-10 20:47 ` [PATCH 01/35] drm: review locking rules in drm_crtc.c Daniel Vetter
2013-01-10 20:47 ` [PATCH 02/35] drm/doc: integrate drm_crtc.c kerneldoc Daniel Vetter
2013-01-10 20:47 ` [PATCH 03/35] drm/<drivers>: reorder framebuffer init sequence Daniel Vetter
2013-01-11 21:06   ` Rob Clark [this message]
2013-01-10 20:47 ` [PATCH 04/35] drm/vmwgfx: " Daniel Vetter
2013-01-10 20:47 ` [PATCH 05/35] drm/gma500: move fbcon restore to lastclose Daniel Vetter
2013-01-10 20:47 ` [PATCH 06/35] drm/nouveau: protect evo_wait/evo_kick sections with a channel mutex Daniel Vetter
2013-01-10 20:47 ` [PATCH 07/35] drm/nouveau: try to protect nbo->pin_refcount Daniel Vetter
2013-01-10 20:47 ` [PATCH 08/35] drm/<drivers>: Unified handling of unimplemented fb->create_handle Daniel Vetter
2013-01-18 15:00   ` Thierry Reding
2013-01-18 18:32     ` Daniel Vetter
2013-01-10 20:47 ` [PATCH 09/35] drm: encapsulate crtc->set_config calls Daniel Vetter
2013-01-10 20:47 ` [PATCH 10/35] drm: add drm_modeset_lock|unlock_all Daniel Vetter
2013-01-10 20:47 ` [PATCH 11/35] drm/i915: use drm_modeset_lock_all Daniel Vetter
2013-01-10 20:47 ` [PATCH 12/35] drm/gma500: " Daniel Vetter
2013-01-10 22:36   ` Alan Cox
2013-01-11 13:25     ` Daniel Vetter
2013-01-10 20:47 ` [PATCH 13/35] drm/ast: " Daniel Vetter
2013-01-10 20:47 ` [PATCH 14/35] drm/shmobile: " Daniel Vetter
2013-01-10 20:47 ` [PATCH 15/35] drm/vmgfx: " Daniel Vetter
2013-01-10 20:47 ` [PATCH 16/35] drm: add per-crtc locks Daniel Vetter
2013-01-10 20:47 ` [PATCH 17/35] drm: only take the crtc lock for ->cursor_set Daniel Vetter
2013-01-10 20:47 ` [PATCH 18/35] drm: only take the crtc lock for ->cursor_move Daniel Vetter
2013-01-10 20:48 ` [PATCH 19/35] drm: revamp locking around fb creation/destruction Daniel Vetter
2013-01-10 20:48 ` [PATCH 20/35] drm: create drm_framebuffer_lookup Daniel Vetter
2013-01-10 20:48 ` [PATCH 21/35] drm: revamp framebuffer cleanup interfaces Daniel Vetter
2013-01-10 20:48 ` [PATCH 22/35] drm: reference framebuffers which are on the idr Daniel Vetter
2013-01-10 20:48 ` [PATCH 23/35] drm: nest modeset locks within fpriv->fbs_lock Daniel Vetter
2013-01-10 20:48 ` [PATCH 24/35] drm: push modeset_lock_all into ->fb_create driver callbacks Daniel Vetter
2013-01-10 20:48 ` [PATCH 25/35] drm: don't take modeset locks in getfb ioctl Daniel Vetter
2013-01-10 20:48 ` [PATCH 26/35] drm: fb refcounting for dirtyfb_ioctl Daniel Vetter
2013-01-10 20:48 ` [PATCH 27/35] drm: refcounting for sprite framebuffers Daniel Vetter
2013-01-10 20:48 ` [PATCH 28/35] drm: refcounting for crtc framebuffers Daniel Vetter
2013-01-10 20:48 ` [PATCH 29/35] drm/i915: dump refcount into framebuffer debugfs file Daniel Vetter
2013-01-11 22:20   ` Rob Clark
2013-01-10 20:48 ` [PATCH 30/35] drm/vmwgfx: add proper framebuffer refcounting Daniel Vetter
2013-01-10 20:48 ` [PATCH 31/35] drm: optimize drm_framebuffer_remove Daniel Vetter
2013-01-10 20:48 ` [PATCH 32/35] drm: only grab the crtc lock for pageflips Daniel Vetter
2013-01-10 20:48 ` [PATCH 33/35] drm: don't hold crtc mutexes for connector ->detect callbacks Daniel Vetter
2013-01-10 20:48 ` [PATCH 34/35] drm/doc: updates for new framebuffer lifetime rules Daniel Vetter
2013-01-10 20:48 ` [PATCH 35/35] drm/fb_helper: check whether fbcon is bound Daniel Vetter
2013-01-10 20:48 ` [PATCH 36/36] drm/i915: wake up all pageflip waiters Daniel Vetter
2013-01-10 20:50   ` Daniel Vetter
2013-01-11 23:17 ` [PATCH 00/36] kms locking rework Rob Clark

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='CAF6AEGtF2cAn7xJWJvM-T=_Ymjj2HjjOuFO7yTCLo1k_C8JYuw@mail.gmail.com' \
    --to=robdclark@gmail.com \
    --cc=daniel.vetter@ffwll.ch \
    --cc=dri-devel@lists.freedesktop.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).