1. 11 8月, 2014 2 次提交
    • D
      drm/irq: Implement a generic vblank_wait function · e8450f51
      Daniel Vetter 提交于
      As usual in both a crtc index and a struct drm_crtc * version.
      
      The function assumes that no one drivers their display below 10Hz, and
      it will complain if the vblank wait takes longer than that.
      
      v2: Also check dev->max_vblank_counter since some drivers register a
      fake get_vblank_counter function.
      
      v3: Use drm_vblank_count instead of calling the low-level
      ->get_vblank_counter callback. That way we'll get the sw-cooked
      counter for platforms without proper vblank support and so can ditch
      the max_vblank_counter check again.
      
      v4: Review from Michel Dänzer:
      - Restore lost notes about v3:
      - Spelling in kerneldoc.
      - Inline wait_event condition.
      - s/vblank_wait/wait_one_vblank/
      
      Cc: Michel Dänzer <michel@daenzer.net>
      Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
      Reviewed-by: NMichel Dänzer <michel.daenzer@amd.com>
      Reviewed-by: NMatt Roper <matthew.d.roper@intel.com>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      e8450f51
    • D
      drm: Add a plane->reset hook · 2a0d7cfd
      Daniel Vetter 提交于
      In general having this can't hurt, and the atomic helpers will need
      it to be able to reset the state objects properly. The overall idea
      is to reset in the order pixels flow, so planes -> crtcs ->
      encoders -> connectors.
      
      v2: Squash in fixup from Ville to correctly deference struct drm_plane
      instead of drm_crtc when walking the plane list. Fixes an oops in
      driver init and resume.
      Reviewed-by: NMatt Roper <matthew.d.roper@intel.com>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      2a0d7cfd
  2. 08 8月, 2014 5 次提交
    • D
      drm: trylock modest locking for fbdev panics · cb597bb3
      Daniel Vetter 提交于
      In the fbdev code we want to do trylocks only to avoid deadlocks and
      other ugly issues. Thus far we've only grabbed the overall modeset
      lock, but that already failed to exclude a pile of potential
      concurrent operations. With proper atomic support this will be worse.
      
      So add a trylock mode to the modeset locking code which attempts all
      locks only with trylocks, if possible. We need to track this in the
      locking functions themselves and can't restrict this to drivers since
      driver-private w/w mutexes must be treated the same way.
      
      There's still the issue that other driver private locks aren't handled
      here at all, but well can't have everything. With this we will at
      least not regress, even once atomic allows lots of concurrent kms
      activity.
      
      Aside: We should move the acquire context to stack-based allocation in
      the callers to get rid of that awful WARN_ON(kmalloc_failed) control
      flow which just blows up when memory is short. But that's material for
      separate patches.
      
      v2:
      - Fix logic inversion fumble in the fb helper.
      - Add proper kerneldoc.
      Reviewed-by: NMatt Roper <matthew.d.roper@intel.com>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      cb597bb3
    • D
      drm: Move ->old_fb from crtc to plane · 3d30a59b
      Daniel Vetter 提交于
      Atomic implemenations for legacy ioctls must be able to drop locks.
      Which doesn't cause havoc since we only do that while constructing
      the new state, so no driver or hardware state change has happened.
      
      The only troubling bit is the fb refcounting the core does - if
      someone else has snuck in then it might potentially unref an
      outdated framebuffer. To fix that move the old_fb temporary storage
      into struct drm_plane for all ioctls, so that the atomic helpers can
      update it.
      
      v2: Fix up the error case handling as suggested by Matt Roper and just
      grab locks uncoditionally - there's no point in optimizing the locking
      for when userspace gets it wrong.
      
      Cc: Matt Roper <matthew.d.roper@intel.com>
      Cc: Dave Airlie <airlied@redhat.com>
      Reviewed-by: NMatt Roper <matthew.d.roper@intel.com>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      3d30a59b
    • D
      drm: Handle legacy per-crtc locking with full acquire ctx · d059f652
      Daniel Vetter 提交于
      So drivers using the atomic interfaces expect that they can acquire
      additional locks internal to the driver as-needed. Examples would be
      locks to protect shared state like shared display PLLs.
      
      Unfortunately the legacy ioctls assume that all locking is fully done
      by the drm core. Now for those paths which grab all locks we already
      have to keep around an acquire context in dev->mode_config. Helper
      functions that implement legacy interfaces in terms of atomic support
      can therefore grab this acquire contexts and reuse it.
      
      The only interfaces left are the cursor and pageflip ioctls. So add
      functions to grab the crtc lock these need using an acquire context
      and preserve it for atomic drivers to reuse.
      
      v2:
      - Fixup comments&kerneldoc.
      - Drop the WARNING from modeset_lock_all_crtcs since that can be used
        in legacy paths with crtc locking.
      
      v3: Fix a type on the kerneldoc Dave spotted.
      
      Cc: Dave Airlie <airlied@redhat.com>
      Reviewed-by: NDave Airlie <airlied@redhat.com>
      Reviewed-by: NMatt Roper <matthew.d.roper@intel.com>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      d059f652
    • D
      drm: Move modeset_lock_all helpers to drm_modeset_lock.[hc] · a6a8bb84
      Daniel Vetter 提交于
      Somehow we've forgotten about this little bit of OCD.
      Reviewed-by: NDave Airlie <airlied@redhat.com>
      Reviewed-by: NMatt Roper <matthew.d.roper@intel.com>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      a6a8bb84
    • D
      drm: Add drm_plane/connector_index · 10f637bf
      Daniel Vetter 提交于
      In the atomic state we'll have an array of states for crtcs, planes
      and connectors and need to be able to at them by their index. We
      already have a drm_crtc_index function so add the missing ones for
      planes and connectors.
      
      If it later on turns out that the list walking is too expensive we can
      add the index to the relevant modeset objects.
      
      Rob Clark doesn't like the loops too much, but we can always add an
      obj->idx parameter later on. And for now reiterating is actually safer
      since nowadays we have hotpluggable connectors (thanks to DP MST).
      
      v2: Fix embarrassing copypasta fail in kerneldoc and header
      declarations, spotted by Matt Roper.
      
      Cc: Matt Roper <matthew.d.roper@intel.com>
      Reviewed-by: NMatt Roper <matthew.d.roper@intel.com>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      10f637bf
  3. 07 8月, 2014 1 次提交
  4. 06 8月, 2014 4 次提交
    • V
      drm: Warn when leaking flip events on close · ddde4371
      Ville Syrjälä 提交于
      Warn when there are events on the file_priv->event_list just before
      file_priv gets freed. This can occur if the driver doesn't clean up
      pending page flip events in ->preclose().
      Signed-off-by: NVille Syrjälä <ville.syrjala@linux.intel.com>
      ddde4371
    • C
      drm: Perform cmdline mode parsing during connector initialisation · eaf99c74
      Chris Wilson 提交于
      i915.ko has a custom fbdev initialisation routine that aims to preserve
      the current mode set by the BIOS, unless overruled by the user. The
      user's wishes are determined by what, if any, mode is specified on the
      command line (via the video= parameter). However, that command line mode
      is first parsed by drm_fb_helper_initial_config() which is called after
      i915.ko's custom initial_config() as a fallback method. So in order for
      us to honour it, we need to move the cmdline parser earlier. If we
      perform the connector cmdline parsing as soon as we initialise the
      connector, that cmdline mode and forced status is then available even if
      the fbdev helper is not compiled in or never called.
      
      We also then expose the cmdline user mode in the connector mode lists.
      
      v2: Rebase after connector->name upheaval.
      
      v3: Adapt mga200 to look for the cmdline mode in the new place. Nicely
      simplifies things while at that.
      
      v4: Fix checkpatch.
      
      v5: Select FB_CMDLINE to adapt to the changed fbdev patch.
      
      Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=73154
      Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> (v2)
      Cc: Jesse Barnes <jbarnes@virtuousgeek.org>
      Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
      Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
      Reviewed-by: Jesse Barnes <jbarnes@virtuousgeek.org> (v2)
      Cc: dri-devel@lists.freedesktop.org
      Cc: Julia Lemire <jlemire@matrox.com>
      Cc: Dave Airlie <airlied@redhat.com>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      eaf99c74
    • D
      video/fbdev: Always built-in video= cmdline parsing · ea6763c1
      Daniel Vetter 提交于
      In drm/i915 we want to get at the video= cmdline modes even when we
      don't have fbdev support enabled, so that users can always override
      the kernel's initial mode selection.
      
      But that gives us a direct depency upon the parsing code in the fbdev
      subsystem. Since it's so little code just extract these 2 functions
      and always build them in.
      
      Whiel at it fix the checkpatch fail in this code.
      
      v2: Also move fb_mode_option. Spotted by the kbuild.
      
      v3: Review from Geert:
      - Keep the old copyright notice from fb_mem.c, although I have no
      idea what exactly applies.
      - Only compile this when needed.
      
      Cc: Geert Uytterhoeven <geert@linux-m68k.org>
      Cc: Plagniol-Villard <plagnioj@jcrosoft.com>
      Cc: Tomi Valkeinen <tomi.valkeinen@ti.com>
      Cc: linux-fbdev@vger.kernel.org
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      
      --
      
      I prefer if we can merge this through drm-next since we'll use it
      there in follow-up patches.
      -Daniel
      ea6763c1
    • D
      drm: Don't grab an fb reference for the idr · 83f45fc3
      Daniel Vetter 提交于
      The current refcounting scheme is that the fb lookup idr also holds a
      reference. This works out nicely bacause thus far we've always
      explicitly cleaned up idr entries for framebuffers:
      - Userspace fbs get removed in the rmfb ioctl or when the drm file
        gets closed.
      - Kernel fbs (for fbdev emulation) get cleaned up by the driver code
        at module unload time.
      
      But now i915 also reconstructs the bios fbs for a smooth transition.
      And that fb is purely transitional and should get removed immmediately
      once all crtcs stop using it. Of course if the i915 fbdev code decides
      to reuse it as the main fbdev fb then it shouldn't be cleaned up, but
      in that case the fbdev code will grab it's own reference.
      
      The problem is now that we also want to register that takeover fb in
      the idr, so that userspace can do a smooth transition (animated maybe
      even!) itself. But currently we have no one who will clean up the idr
      reference once that fb isn't useful any more, and so essentially leak
      it.
      
      Fix this by no longer holding a full fb reference for the idr, but
      instead just have a weak reference using kref_get_unless_zero. But
      that requires us to synchronize and clean up with the idr and fb_lock
      in drm_framebuffer_free, so add that. It's a bit ugly that we have to
      unconditionally grab the fb_lock, but without that someone might creep
      through a race.
      
      This leak was caught by the fb leak check in drm_mode_config_cleanup.
      Originally the leak was introduced in
      
      commit 46f297fb
      Author: Jesse Barnes <jbarnes@virtuousgeek.org>
      Date:   Fri Mar 7 08:57:48 2014 -0800
      
          drm/i915: add plane_config fetching infrastructure v2
      
      Cc:  Jesse Barnes <jbarnes@virtuousgeek.org>
      Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=77511Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      83f45fc3
  5. 05 8月, 2014 9 次提交
    • D
      drm: Fix race when checking for fb in the generic kms obj lookup · 168c02ec
      Daniel Vetter 提交于
      In my review of
      
      commit 98f75de4
      Author: Rob Clark <robdclark@gmail.com>
      Date:   Fri May 30 11:37:03 2014 -0400
      
          drm: add object property typ
      
      I asked for a check to make sure that we never leak an fb from the
      generic mode object lookup since those have completely different
      lifetime rules. Rob added it, but outside of the idr mutex, which
      means that our dereference of obj->type can already chase free'd
      memory.
      
      Somehow I didn't spot this, so fix this asap.
      
      v2: Simplify the conditionals as suggested by Chris.
      
      Cc: Rob Clark <robdclark@gmail.com>
      Cc: Chris Wilson <chris@chris-wilson.co.uk>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      Reviewed-by: NRob Clark <robdclark@gmail.com>
      Signed-off-by: NDave Airlie <airlied@redhat.com>
      168c02ec
    • C
      drm: Unlink dead file_priv from list of active files first · dff01de1
      Chris Wilson 提交于
      In order to prevent external observers walking the list of open DRM
      files from seeing an invalid drm_file_private in the process of being
      torndown, the first operation we need to take is to unlink the
      drm_file_private from that list.
      
      	general protection fault: 0000 [#1] PREEMPT SMP
      	Modules linked in: i915 i2c_algo_bit drm_kms_helper drm lpc_ich mfd_core nls_iso8859_1 i2c_hid video hid_generic usbhid hid e1000e ahci ptp libahci pps_core
      	CPU: 3 PID: 8220 Comm: cat Not tainted 3.16.0-rc6+ #4
      	Hardware name: Intel Corporation Shark Bay Client platform/WhiteTip Mountain 1, BIOS HSWLPTU1.86C.0119.R00.1303230105 03/23/2013
      	task: ffff8800219642c0 ti: ffff880047024000 task.ti: ffff880047024000
      	RIP: 0010:[<ffffffffa0137c70>]  [<ffffffffa0137c70>] per_file_stats+0x110/0x160 [i915]
      	RSP: 0018:ffff880047027d48  EFLAGS: 00010246
      	RAX: 6b6b6b6b6b6b6b6b RBX: ffff880047027e30 RCX: 0000000000000000
      	RDX: 0000000000000001 RSI: 0000000000000000 RDI: ffff88003a05cd00
      	RBP: ffff880047027d58 R08: 0000000000000001 R09: 0000000000000000
      	R10: ffff8800219642c0 R11: 0000000000000000 R12: ffff88003a05cd00
      	R13: 0000000000000000 R14: ffff88003a05cd00 R15: ffff880047027d88
      	FS:  00007f5f73a13740(0000) GS:ffff88014e380000(0000) knlGS:0000000000000000
      	CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      	CR2: 00000000023ff038 CR3: 0000000021a4b000 CR4: 00000000001407e0
      	Stack:
      	 0000000000000001 000000000000ffff ffff880047027dc8 ffffffff813438e4
      	 ffff880047027e30 ffffffffa0137b60 ffff880021a8af58 ffff880021a8f1a0
      	 ffff8800a2061fb0 ffff8800a2062048 ffff8800a2061fb0 ffff8800a1e23478
      	Call Trace:
      	 [<ffffffff813438e4>] idr_for_each+0xf4/0x180
      	 [<ffffffffa0137b60>] ? i915_gem_stolen_list_info+0x1f0/0x1f0 [i915]
      	 [<ffffffffa013a17a>] i915_gem_object_info+0x5ca/0x6a0 [i915]
      	 [<ffffffff81193ec5>] seq_read+0xf5/0x3a0
      	 [<ffffffff8116d950>] vfs_read+0x90/0x150
      	 [<ffffffff8116e509>] SyS_read+0x49/0xb0
      	 [<ffffffff815d8622>] tracesys+0xd0/0xd5
      	Code: 01 00 00 49 39 84 24 08 01 00 00 74 55 49 8b 84 24 b8 00 00 00 48 01 43 18 31 c0 5b 41 5c 5d c3 0f 1f 00 49 8b 44 24 08 4c 89 e7 <48> 8b 70 28 48 81 c6 48 80 00 00 e8 80 14 01 00 84 c0 74 bc 49
      	RIP  [<ffffffffa0137c70>] per_file_stats+0x110/0x160 [i915]
      	RSP <ffff880047027d48>
      Reported-by: N"Ursulin, Tvrtko" <tvrtko.ursulin@intel.com>
      Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=81712Signed-off-by: NChris Wilson <chris@chris-wilson.co.uk>
      Cc: "Ursulin, Tvrtko" <tvrtko.ursulin@intel.com>
      Reviewed-by: NDavid Herrmann <dh.herrmann@gmail.com>
      Signed-off-by: NDave Airlie <airlied@redhat.com>
      dff01de1
    • T
      drm/ttm: Pass GFP flags in order to avoid deadlock. · a91576d7
      Tetsuo Handa 提交于
      Commit 7dc19d5a "drivers: convert shrinkers to new count/scan API" added
      deadlock warnings that ttm_page_pool_free() and ttm_dma_page_pool_free()
      are currently doing GFP_KERNEL allocation.
      
      But these functions did not get updated to receive gfp_t argument.
      This patch explicitly passes sc->gfp_mask or GFP_KERNEL to these functions,
      and removes the deadlock warning.
      Signed-off-by: NTetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
      Cc: stable <stable@kernel.org> [2.6.35+]
      Signed-off-by: NDave Airlie <airlied@redhat.com>
      a91576d7
    • T
      drm/ttm: Fix possible stack overflow by recursive shrinker calls. · 71336e01
      Tetsuo Handa 提交于
      While ttm_dma_pool_shrink_scan() tries to take mutex before doing GFP_KERNEL
      allocation, ttm_pool_shrink_scan() does not do it. This can result in stack
      overflow if kmalloc() in ttm_page_pool_free() triggered recursion due to
      memory pressure.
      
        shrink_slab()
        => ttm_pool_shrink_scan()
           => ttm_page_pool_free()
              => kmalloc(GFP_KERNEL)
                 => shrink_slab()
                    => ttm_pool_shrink_scan()
                       => ttm_page_pool_free()
                          => kmalloc(GFP_KERNEL)
      
      Change ttm_pool_shrink_scan() to do like ttm_dma_pool_shrink_scan() does.
      Signed-off-by: NTetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
      Cc: stable <stable@kernel.org> [2.6.35+]
      Signed-off-by: NDave Airlie <airlied@redhat.com>
      71336e01
    • T
      drm/ttm: Use mutex_trylock() to avoid deadlock inside shrinker functions. · 22e71691
      Tetsuo Handa 提交于
      I can observe that RHEL7 environment stalls with 100% CPU usage when a
      certain type of memory pressure is given. While the shrinker functions
      are called by shrink_slab() before the OOM killer is triggered, the stall
      lasts for many minutes.
      
      One of reasons of this stall is that
      ttm_dma_pool_shrink_count()/ttm_dma_pool_shrink_scan() are called and
      are blocked at mutex_lock(&_manager->lock). GFP_KERNEL allocation with
      _manager->lock held causes someone (including kswapd) to deadlock when
      these functions are called due to memory pressure. This patch changes
      "mutex_lock();" to "if (!mutex_trylock()) return ...;" in order to
      avoid deadlock.
      Signed-off-by: NTetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
      Cc: stable <stable@kernel.org> [3.3+]
      Signed-off-by: NDave Airlie <airlied@redhat.com>
      22e71691
    • T
      drm/ttm: Choose a pool to shrink correctly in ttm_dma_pool_shrink_scan(). · 46c2df68
      Tetsuo Handa 提交于
      We can use "unsigned int" instead of "atomic_t" by updating start_pool
      variable under _manager->lock. This patch will make it possible to avoid
      skipping when choosing a pool to shrink in round-robin style, after next
      patch changes mutex_lock(_manager->lock) to !mutex_trylock(_manager->lork).
      Signed-off-by: NTetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
      Cc: stable <stable@kernel.org> [3.3+]
      Signed-off-by: NDave Airlie <airlied@redhat.com>
      46c2df68
    • T
      drm/ttm: Fix possible division by 0 in ttm_dma_pool_shrink_scan(). · 11e504cc
      Tetsuo Handa 提交于
      list_empty(&_manager->pools) being false before taking _manager->lock
      does not guarantee that _manager->npools != 0 after taking _manager->lock
      because _manager->npools is updated under _manager->lock.
      Signed-off-by: NTetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
      Cc: stable <stable@kernel.org> [3.3+]
      Signed-off-by: NDave Airlie <airlied@redhat.com>
      11e504cc
    • D
      drm/tda998x: update for new drm connector APIs. · 74cd62ea
      Dave Airlie 提交于
      Signed-off-by: NDave Airlie <airlied@redhat.com>
      74cd62ea
    • D
      drm/sti: fix warning in build. · 8bb652eb
      Dave Airlie 提交于
      Signed-off-by: NDave Airlie <airlied@redhat.com>
      8bb652eb
  6. 04 8月, 2014 19 次提交