1. 13 11月, 2019 1 次提交
  2. 12 10月, 2019 1 次提交
  3. 16 9月, 2019 10 次提交
  4. 06 9月, 2019 3 次提交
    • L
      drm/i915: Call dma_set_max_seg_size() in i915_driver_hw_probe() · 68b58d39
      Lyude Paul 提交于
      commit 32f0a982650b123bdab36865617d3e03ebcacf3b upstream.
      
      Currently, we don't call dma_set_max_seg_size() for i915 because we
      intentionally do not limit the segment length that the device supports.
      However, this results in a warning being emitted if we try to map
      anything larger than SZ_64K on a kernel with CONFIG_DMA_API_DEBUG_SG
      enabled:
      
      [    7.751926] DMA-API: i915 0000:00:02.0: mapping sg segment longer
      than device claims to support [len=98304] [max=65536]
      [    7.751934] WARNING: CPU: 5 PID: 474 at kernel/dma/debug.c:1220
      debug_dma_map_sg+0x20f/0x340
      
      This was originally brought up on
      https://bugs.freedesktop.org/show_bug.cgi?id=108517 , and the consensus
      there was it wasn't really useful to set a limit (and that dma-debug
      isn't really all that useful for i915 in the first place). Unfortunately
      though, CONFIG_DMA_API_DEBUG_SG is enabled in the debug configs for
      various distro kernels. Since a WARN_ON() will disable automatic problem
      reporting (and cause any CI with said option enabled to start
      complaining), we really should just fix the problem.
      
      Note that as me and Chris Wilson discussed, the other solution for this
      would be to make DMA-API not make such assumptions when a driver hasn't
      explicitly set a maximum segment size. But, taking a look at the commit
      which originally introduced this behavior, commit 78c47830
      ("dma-debug: check scatterlist segments"), there is an explicit mention
      of this assumption and how it applies to devices with no segment size:
      
      	Conversely, devices which are less limited than the rather
      	conservative defaults, or indeed have no limitations at all
      	(e.g. GPUs with their own internal MMU), should be encouraged to
      	set appropriate dma_parms, as they may get more efficient DMA
      	mapping performance out of it.
      
      So unless there's any concerns (I'm open to discussion!), let's just
      follow suite and call dma_set_max_seg_size() with UINT_MAX as our limit
      to silence any warnings.
      
      Changes since v3:
      * Drop patch for enabling CONFIG_DMA_API_DEBUG_SG in CI. It looks like
        just turning it on causes the kernel to spit out bogus WARN_ONs()
        during some igt tests which would otherwise require teaching igt to
        disable the various DMA-API debugging options causing this. This is
        too much work to be worth it, since DMA-API debugging is useless for
        us. So, we'll just settle with this single patch to squelch WARN_ONs()
        during driver load for users that have CONFIG_DMA_API_DEBUG_SG turned
        on for some reason.
      * Move dma_set_max_seg_size() call into i915_driver_hw_probe() - Chris
        Wilson
      Signed-off-by: NLyude Paul <lyude@redhat.com>
      Reviewed-by: NChris Wilson <chris@chris-wilson.co.uk>
      Cc: <stable@vger.kernel.org> # v4.18+
      Link: https://patchwork.freedesktop.org/patch/msgid/20190823205251.14298-1-lyude@redhat.com
      (cherry picked from commit acd674af95d3f627062007429b9c195c6b32361d)
      Signed-off-by: NJani Nikula <jani.nikula@intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      68b58d39
    • X
      drm/i915: Don't deballoon unused ggtt drm_mm_node in linux guest · c7615333
      Xiong Zhang 提交于
      commit 0a3dfbb5cd9033752639ef33e319c2f2863c713a upstream.
      
      The following call trace may exist in linux guest dmesg when guest i915
      driver is unloaded.
      [   90.776610] [drm:vgt_deballoon_space.isra.0 [i915]] deballoon space: range [0x0 - 0x0] 0 KiB.
      [   90.776621] BUG: unable to handle kernel NULL pointer dereference at 00000000000000c0
      [   90.776691] IP: drm_mm_remove_node+0x4d/0x320 [drm]
      [   90.776718] PGD 800000012c7d0067 P4D 800000012c7d0067 PUD 138e4c067 PMD 0
      [   90.777091] task: ffff9adab60f2f00 task.stack: ffffaf39c0fe0000
      [   90.777142] RIP: 0010:drm_mm_remove_node+0x4d/0x320 [drm]
      [   90.777573] Call Trace:
      [   90.777653]  intel_vgt_deballoon+0x4c/0x60 [i915]
      [   90.777729]  i915_ggtt_cleanup_hw+0x121/0x190 [i915]
      [   90.777792]  i915_driver_unload+0x145/0x180 [i915]
      [   90.777856]  i915_pci_remove+0x15/0x20 [i915]
      [   90.777890]  pci_device_remove+0x3b/0xc0
      [   90.777916]  device_release_driver_internal+0x157/0x220
      [   90.777945]  driver_detach+0x39/0x70
      [   90.777967]  bus_remove_driver+0x51/0xd0
      [   90.777990]  pci_unregister_driver+0x23/0x90
      [   90.778019]  SyS_delete_module+0x1da/0x240
      [   90.778045]  entry_SYSCALL_64_fastpath+0x24/0x87
      [   90.778072] RIP: 0033:0x7f34312af067
      [   90.778092] RSP: 002b:00007ffdea3da0d8 EFLAGS: 00000206
      [   90.778297] RIP: drm_mm_remove_node+0x4d/0x320 [drm] RSP: ffffaf39c0fe3dc0
      [   90.778344] ---[ end trace f4b1bc8305fc59dd ]---
      
      Four drm_mm_node are used to reserve guest ggtt space, but some of them
      may be skipped and not initialised due to space constraints in
      intel_vgt_balloon(). If drm_mm_remove_node() is called with
      uninitialized drm_mm_node, the above call trace occurs.
      
      This patch check drm_mm_node's validity before calling
      drm_mm_remove_node().
      
      Fixes: ff8f7975("drm/i915: return the correct usable aperture size under gvt environment")
      Cc: stable@vger.kernel.org
      Signed-off-by: NXiong Zhang <xiong.y.zhang@intel.com>
      Acked-by: NZhenyu Wang <zhenyuw@linux.intel.com>
      Reviewed-by: NChris Wilson <chris@chris-wilson.co.uk>
      Signed-off-by: NChris Wilson <chris@chris-wilson.co.uk>
      Link: https://patchwork.freedesktop.org/patch/msgid/1566279978-9659-1-git-send-email-xiong.y.zhang@intel.com
      (cherry picked from commit 4776f3529d6b1e47f02904ad1d264d25ea22b27b)
      Signed-off-by: NJani Nikula <jani.nikula@intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      c7615333
    • L
      drm/i915: fix broadwell EU computation · a3eb2eba
      Lionel Landwerlin 提交于
      [ Upstream commit 63ac3328f0d1d37f286e397b14d9596ed09d7ca5 ]
      
      subslice_mask is an array indexed by slice, not subslice.
      Signed-off-by: NLionel Landwerlin <lionel.g.landwerlin@intel.com>
      Fixes: 8cc76693 ("drm/i915: store all subslice masks")
      Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=108712Reviewed-by: NChris Wilson <chris@chris-wilson.co.uk>
      Reviewed-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20181112123931.2815-1-lionel.g.landwerlin@intel.comSigned-off-by: NSasha Levin <sashal@kernel.org>
      a3eb2eba
  5. 16 8月, 2019 1 次提交
  6. 07 8月, 2019 1 次提交
  7. 10 7月, 2019 1 次提交
  8. 19 6月, 2019 1 次提交
    • V
      drm/i915/sdvo: Implement proper HDMI audio support for SDVO · b08ec06c
      Ville Syrjälä 提交于
      commit d74408f528261f900dddb9778f61b5c5a7a6249c upstream.
      
      Our SDVO audio support is pretty bogus. We can't push audio over the
      SDVO bus, so trying to enable audio in the SDVO control register doesn't
      do anything. In fact it looks like the SDVO encoder will always mix in
      the audio coming over HDA, and there's no (at least documented) way to
      disable that from our side. So HDMI audio does work currently on gen4
      but only by luck really. On gen3 it got broken by the referenced commit.
      And what has always been missing on every platform is the ELD.
      
      To pass the ELD to the audio driver we need to write it to magic buffer
      in the SDVO encoder hardware which then gets pulled out via HDA in the
      other end. Ie. pretty much the same thing we had for native HDMI before
      we started to just pass the ELD between the drivers. This sort of
      explains why we even have that silly hardware buffer with native HDMI.
      
      $ cat /proc/asound/card0/eld#1.0
      -monitor_present		0
      -eld_valid		0
      +monitor_present		1
      +eld_valid		1
      +monitor_name		LG TV
      +connection_type		HDMI
      +...
      
      This also fixes our state readout since we can now query the SDVO
      encoder about the state of the "ELD valid" and "presence detect"
      bits. As mentioned those don't actually control whether audio
      gets sent over the HDMI cable, but it's the best we can do. And with
      the state checker appeased we can re-enable HDMI audio for gen3.
      
      Cc: stable@vger.kernel.org
      Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
      Cc: zardam@gmail.com
      Tested-by: zardam@gmail.com
      Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=108976
      Fixes: de44e256 ("drm/i915/sdvo: Shut up state checker with hdmi cards on gen3")
      Signed-off-by: NVille Syrjälä <ville.syrjala@linux.intel.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20190409144054.24561-3-ville.syrjala@linux.intel.comReviewed-by: NImre Deak <imre.deak@intel.com>
      (cherry picked from commit dc49a56bd43bb04982e64b44436831da801d0237)
      Signed-off-by: NJani Nikula <jani.nikula@intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      b08ec06c
  9. 11 6月, 2019 3 次提交
  10. 02 5月, 2019 1 次提交
  11. 17 4月, 2019 2 次提交
  12. 03 4月, 2019 1 次提交
  13. 24 3月, 2019 1 次提交
  14. 27 2月, 2019 1 次提交
  15. 20 2月, 2019 2 次提交
    • J
      drm/i915: Prevent a race during I915_GEM_MMAP ioctl with WC set · 6a204bd5
      Joonas Lahtinen 提交于
      commit 2e7bd10e05afb866b5fb13eda25095c35d7a27cc upstream.
      
      Make sure the underlying VMA in the process address space is the
      same as it was during vm_mmap to avoid applying WC to wrong VMA.
      
      A more long-term solution would be to have vm_mmap_locked variant
      in linux/mmap.h for when caller wants to hold mmap_sem for an
      extended duration.
      
      v2:
      - Refactor the compare function
      
      Fixes: 1816f923 ("drm/i915: Support creation of unbound wc user mappings for objects")
      Reported-by: NAdam Zabrocki <adamza@microsoft.com>
      Suggested-by: NLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: NJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
      Cc: <stable@vger.kernel.org> # v4.0+
      Cc: Akash Goel <akash.goel@intel.com>
      Cc: Chris Wilson <chris@chris-wilson.co.uk>
      Cc: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
      Cc: Adam Zabrocki <adamza@microsoft.com>
      Reviewed-by: NChris Wilson <chris@chris-wilson.co.uk>
      Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com> #v1
      Link: https://patchwork.freedesktop.org/patch/msgid/20190207085454.10598-1-joonas.lahtinen@linux.intel.com
      (cherry picked from commit 5c4604e757ba9b193b09768d75a7d2105a5b883f)
      Signed-off-by: NJani Nikula <jani.nikula@intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      6a204bd5
    • L
      drm/i915: Block fbdev HPD processing during suspend · 4631e0b4
      Lyude Paul 提交于
      commit e8a8fedd57fdcebf0e4f24ef0fc7e29323df8e66 upstream.
      
      When resuming, we check whether or not any previously connected
      MST topologies are still present and if so, attempt to resume them. If
      this fails, we disable said MST topologies and fire off a hotplug event
      so that userspace knows to reprobe.
      
      However, sending a hotplug event involves calling
      drm_fb_helper_hotplug_event(), which in turn results in fbcon doing a
      connector reprobe in the caller's thread - something we can't do at the
      point in which i915 calls drm_dp_mst_topology_mgr_resume() since
      hotplugging hasn't been fully initialized yet.
      
      This currently causes some rather subtle but fatal issues. For example,
      on my T480s the laptop dock connected to it usually disappears during a
      suspend cycle, and comes back up a short while after the system has been
      resumed. This guarantees pretty much every suspend and resume cycle,
      drm_dp_mst_topology_mgr_set_mst(mgr, false); will be caused and in turn,
      a connector hotplug will occur. Now it's Rute Goldberg time: when the
      connector hotplug occurs, i915 reprobes /all/ of the connectors,
      including eDP. However, eDP probing requires that we power on the panel
      VDD which in turn, grabs a wakeref to the appropriate power domain on
      the GPU (on my T480s, this is the PORT_DDI_A_IO domain). This is where
      things start breaking, since this all happens before
      intel_power_domains_enable() is called we end up leaking the wakeref
      that was acquired and never releasing it later. Come next suspend/resume
      cycle, this causes us to fail to shut down the GPU properly, which
      causes it not to resume properly and die a horrible complicated death.
      
      (as a note: this only happens when there's both an eDP panel and MST
      topology connected which is removed mid-suspend. One or the other seems
      to always be OK).
      
      We could try to fix the VDD wakeref leak, but this doesn't seem like
      it's worth it at all since we aren't able to handle hotplug detection
      while resuming anyway. So, let's go with a more robust solution inspired
      by nouveau: block fbdev from handling hotplug events until we resume
      fbdev. This allows us to still send sysfs hotplug events to be handled
      later by user space while we're resuming, while also preventing us from
      actually processing any hotplug events we receive until it's safe.
      
      This fixes the wakeref leak observed on the T480s and as such, also
      fixes suspend/resume with MST topologies connected on this machine.
      
      Changes since v2:
      * Don't call drm_fb_helper_hotplug_event() under lock, do it after lock
        (Chris Wilson)
      * Don't call drm_fb_helper_hotplug_event() in
        intel_fbdev_output_poll_changed() under lock (Chris Wilson)
      * Always set ifbdev->hpd_waiting (Chris Wilson)
      Signed-off-by: NLyude Paul <lyude@redhat.com>
      Fixes: 0e32b39c ("drm/i915: add DP 1.2 MST support (v0.7)")
      Cc: Todd Previte <tprevite@gmail.com>
      Cc: Dave Airlie <airlied@redhat.com>
      Cc: Jani Nikula <jani.nikula@linux.intel.com>
      Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
      Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
      Cc: Imre Deak <imre.deak@intel.com>
      Cc: intel-gfx@lists.freedesktop.org
      Cc: <stable@vger.kernel.org> # v3.17+
      Reviewed-by: NChris Wilson <chris@chris-wilson.co.uk>
      Link: https://patchwork.freedesktop.org/patch/msgid/20190129191001.442-2-lyude@redhat.com
      (cherry picked from commit fe5ec65668cdaa4348631d8ce1766eed43b33c10)
      Signed-off-by: NJani Nikula <jani.nikula@intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      4631e0b4
  16. 15 2月, 2019 1 次提交
  17. 23 1月, 2019 1 次提交
    • Z
      drm/i915/gvt: Fix mmap range check · ac8b9e8e
      Zhenyu Wang 提交于
      commit 51b00d8509dc69c98740da2ad07308b630d3eb7d upstream.
      
      This is to fix missed mmap range check on vGPU bar2 region
      and only allow to map vGPU allocated GMADDR range, which means
      user space should support sparse mmap to get proper offset for
      mmap vGPU aperture. And this takes care of actual pgoff in mmap
      request as original code always does from beginning of vGPU
      aperture.
      
      Fixes: 659643f7 ("drm/i915/gvt/kvmgt: add vfio/mdev support to KVMGT")
      Cc: "Monroy, Rodrigo Axel" <rodrigo.axel.monroy@intel.com>
      Cc: "Orrala Contreras, Alfredo" <alfredo.orrala.contreras@intel.com>
      Cc: stable@vger.kernel.org # v4.10+
      Reviewed-by: NHang Yuan <hang.yuan@intel.com>
      Signed-off-by: NZhenyu Wang <zhenyuw@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      ac8b9e8e
  18. 17 1月, 2019 1 次提交
  19. 20 12月, 2018 2 次提交
  20. 13 12月, 2018 1 次提交
  21. 01 12月, 2018 1 次提交
  22. 27 11月, 2018 1 次提交
  23. 21 11月, 2018 2 次提交
    • V
      drm/i915: Fix hpd handling for pins with two encoders · 32bd1336
      Ville Syrjälä 提交于
      commit 44a7276b30c3c15f2b7790a5729640597fb6a1df upstream.
      
      In my haste to remove irq_port[] I accidentally changed the
      way we deal with hpd pins that are shared by multiple encoders
      (DP and HDMI for pre-DDI platforms). Previously we would only
      handle such pins via ->hpd_pulse(), but now we queue up the
      hotplug work for the HDMI encoder directly. Worse yet, we now
      count each hpd twice and this increment the hpd storm count
      twice as fast. This can lead to spurious storms being detected.
      
      Go back to the old way of doing things, ie. delegate to
      ->hpd_pulse() for any pin which has an encoder with that hook
      implemented. I don't really like the idea of adding irq_port[]
      back so let's loop through the encoders first to check if we
      have an encoder with ->hpd_pulse() for the pin, and then go
      through all the pins and decided on the correct course of action
      based on the earlier findings.
      
      I have occasionally toyed with the idea of unifying the pre-DDI
      HDMI and DP encoders into a single encoder as well. Besides the
      hotplug processing it would have the other benefit of preventing
      userspace from trying to enable both encoders at the same time.
      That is simply illegal as they share the same clock/data pins.
      We have some testcases that will attempt that and thus fail on
      many older machines. But for now let's stick to fixing just the
      hotplug code.
      
      Cc: stable@vger.kernel.org # 4.19+
      Cc: Lyude Paul <lyude@redhat.com>
      Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
      Fixes: b6ca3eee ("drm/i915: Nuke dev_priv->irq_port[]")
      Signed-off-by: NVille Syrjälä <ville.syrjala@linux.intel.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20181108200424.28371-1-ville.syrjala@linux.intel.comReviewed-by: NLyude Paul <lyude@redhat.com>
      (cherry picked from commit 5a3aeca97af1b6b3498d59a7fd4e8bb95814c108)
      Signed-off-by: NJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      32bd1336
    • L
      drm/i915: Fix NULL deref when re-enabling HPD IRQs on systems with MST · 67d55fb2
      Lyude Paul 提交于
      commit 541ff7e9 upstream.
      
      Turns out that if you trigger an HPD storm on a system that has an MST
      topology connected to it, you'll end up causing the kernel to eventually
      hit a NULL deref:
      
      [  332.339041] BUG: unable to handle kernel NULL pointer dereference at 00000000000000ec
      [  332.340906] PGD 0 P4D 0
      [  332.342750] Oops: 0000 [#1] SMP PTI
      [  332.344579] CPU: 2 PID: 25 Comm: kworker/2:0 Kdump: loaded Tainted: G           O      4.18.0-rc3short-hpd-storm+ #2
      [  332.346453] Hardware name: LENOVO 20BWS1KY00/20BWS1KY00, BIOS JBET71WW (1.35 ) 09/14/2018
      [  332.348361] Workqueue: events intel_hpd_irq_storm_reenable_work [i915]
      [  332.350301] RIP: 0010:intel_hpd_irq_storm_reenable_work.cold.3+0x2f/0x86 [i915]
      [  332.352213] Code: 00 00 ba e8 00 00 00 48 c7 c6 c0 aa 5f a0 48 c7 c7 d0 73 62 a0 4c 89 c1 4c 89 04 24 e8 7f f5 af e0 4c 8b 04 24 44 89 f8 29 e8 <41> 39 80 ec 00 00 00 0f 85 43 13 fc ff 41 0f b6 86 b8 04 00 00 41
      [  332.354286] RSP: 0018:ffffc90000147e48 EFLAGS: 00010006
      [  332.356344] RAX: 0000000000000005 RBX: ffff8802c226c9d4 RCX: 0000000000000006
      [  332.358404] RDX: 0000000000000000 RSI: 0000000000000082 RDI: ffff88032dc95570
      [  332.360466] RBP: 0000000000000005 R08: 0000000000000000 R09: ffff88031b3dc840
      [  332.362528] R10: 0000000000000000 R11: 000000031a069602 R12: ffff8802c226ca20
      [  332.364575] R13: ffff8802c2268000 R14: ffff880310661000 R15: 000000000000000a
      [  332.366615] FS:  0000000000000000(0000) GS:ffff88032dc80000(0000) knlGS:0000000000000000
      [  332.368658] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      [  332.370690] CR2: 00000000000000ec CR3: 000000000200a003 CR4: 00000000003606e0
      [  332.372724] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
      [  332.374773] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
      [  332.376798] Call Trace:
      [  332.378809]  process_one_work+0x1a1/0x350
      [  332.380806]  worker_thread+0x30/0x380
      [  332.382777]  ? wq_update_unbound_numa+0x10/0x10
      [  332.384772]  kthread+0x112/0x130
      [  332.386740]  ? kthread_create_worker_on_cpu+0x70/0x70
      [  332.388706]  ret_from_fork+0x35/0x40
      [  332.390651] Modules linked in: i915(O) vfat fat joydev btusb btrtl btbcm btintel bluetooth ecdh_generic iTCO_wdt wmi_bmof i2c_algo_bit drm_kms_helper intel_rapl syscopyarea sysfillrect x86_pkg_temp_thermal sysimgblt coretemp fb_sys_fops crc32_pclmul drm psmouse pcspkr mei_me mei i2c_i801 lpc_ich mfd_core i2c_core tpm_tis tpm_tis_core thinkpad_acpi wmi tpm rfkill video crc32c_intel serio_raw ehci_pci xhci_pci ehci_hcd xhci_hcd [last unloaded: i915]
      [  332.394963] CR2: 00000000000000ec
      
      This appears to be due to the fact that with an MST topology, not all
      intel_connector structs will have ->encoder set. So, fix this by
      skipping connectors without encoders in
      intel_hpd_irq_storm_reenable_work().
      
      For those wondering, this bug was found on accident while simulating HPD
      storms using a Chamelium connected to a ThinkPad T450s (Broadwell).
      
      Changes since v1:
      - Check intel_connector->mst_port instead of intel_connector->encoder
      Signed-off-by: NLyude Paul <lyude@redhat.com>
      Reviewed-by: NVille Syrjälä <ville.syrjala@linux.intel.com>
      Cc: stable@vger.kernel.org
      Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20181106213017.14563-3-lyude@redhat.com
      (cherry picked from commit fee61dee)
      Signed-off-by: NJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      67d55fb2