1. 23 3月, 2022 2 次提交
  2. 22 3月, 2022 2 次提交
    • V
      drm/tilcdc: Use drm_mode_copy() · 6185587b
      Ville Syrjälä 提交于
      struct drm_display_mode embeds a list head, so overwriting
      the full struct with another one will corrupt the list
      (if the destination mode is on a list). Use drm_mode_copy()
      instead which explicitly preserves the list head of
      the destination mode.
      
      Even if we know the destination mode is not on any list
      using drm_mode_copy() seems decent as it sets a good
      example. Bad examples of not using it might eventually
      get copied into code where preserving the list head
      actually matters.
      
      Obviously one case not covered here is when the mode
      itself is embedded in a larger structure and the whole
      structure is copied. But if we are careful when copying
      into modes embedded in structures I think we can be a
      little more reassured that bogus list heads haven't been
      propagated in.
      
      @is_mode_copy@
      @@
      drm_mode_copy(...)
      {
      ...
      }
      
      @depends on !is_mode_copy@
      struct drm_display_mode *mode;
      expression E, S;
      @@
      (
      - *mode = E
      + drm_mode_copy(mode, &E)
      |
      - memcpy(mode, E, S)
      + drm_mode_copy(mode, E)
      )
      
      @depends on !is_mode_copy@
      struct drm_display_mode mode;
      expression E;
      @@
      (
      - mode = E
      + drm_mode_copy(&mode, &E)
      |
      - memcpy(&mode, E, S)
      + drm_mode_copy(&mode, E)
      )
      
      @@
      struct drm_display_mode *mode;
      @@
      - &*mode
      + mode
      
      Cc: Jyri Sarha <jyri.sarha@iki.fi>
      Cc: Tomi Valkeinen <tomba@kernel.org>
      Signed-off-by: NVille Syrjälä <ville.syrjala@linux.intel.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20220218100403.7028-17-ville.syrjala@linux.intel.comReviewed-by: NTomi Valkeinen <tomi.valkeinen@ideasonboard.com>
      6185587b
    • V
      drm/gma500: Use drm_mode_copy() · cc436b1c
      Ville Syrjälä 提交于
      struct drm_display_mode embeds a list head, so overwriting
      the full struct with another one will corrupt the list
      (if the destination mode is on a list). Use drm_mode_copy()
      instead which explicitly preserves the list head of
      the destination mode.
      
      Even if we know the destination mode is not on any list
      using drm_mode_copy() seems decent as it sets a good
      example. Bad examples of not using it might eventually
      get copied into code where preserving the list head
      actually matters.
      
      Obviously one case not covered here is when the mode
      itself is embedded in a larger structure and the whole
      structure is copied. But if we are careful when copying
      into modes embedded in structures I think we can be a
      little more reassured that bogus list heads haven't been
      propagated in.
      
      @is_mode_copy@
      @@
      drm_mode_copy(...)
      {
      ...
      }
      
      @depends on !is_mode_copy@
      struct drm_display_mode *mode;
      expression E, S;
      @@
      (
      - *mode = E
      + drm_mode_copy(mode, &E)
      |
      - memcpy(mode, E, S)
      + drm_mode_copy(mode, E)
      )
      
      @depends on !is_mode_copy@
      struct drm_display_mode mode;
      expression E;
      @@
      (
      - mode = E
      + drm_mode_copy(&mode, &E)
      |
      - memcpy(&mode, E, S)
      + drm_mode_copy(&mode, E)
      )
      
      @@
      struct drm_display_mode *mode;
      @@
      - &*mode
      + mode
      
      Cc: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
      Signed-off-by: NVille Syrjälä <ville.syrjala@linux.intel.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20220218100403.7028-8-ville.syrjala@linux.intel.comAcked-by: NPatrik Jakobsson <patrik.r.jakobsson@gmail.com>
      cc436b1c
  3. 21 3月, 2022 4 次提交
  4. 19 3月, 2022 1 次提交
    • C
      fbdev: defio: fix the pagelist corruption · 856082f0
      Chuansheng Liu 提交于
      Easily hit the below list corruption:
      ==
      list_add corruption. prev->next should be next (ffffffffc0ceb090), but
      was ffffec604507edc8. (prev=ffffec604507edc8).
      WARNING: CPU: 65 PID: 3959 at lib/list_debug.c:26
      __list_add_valid+0x53/0x80
      CPU: 65 PID: 3959 Comm: fbdev Tainted: G     U
      RIP: 0010:__list_add_valid+0x53/0x80
      Call Trace:
       <TASK>
       fb_deferred_io_mkwrite+0xea/0x150
       do_page_mkwrite+0x57/0xc0
       do_wp_page+0x278/0x2f0
       __handle_mm_fault+0xdc2/0x1590
       handle_mm_fault+0xdd/0x2c0
       do_user_addr_fault+0x1d3/0x650
       exc_page_fault+0x77/0x180
       ? asm_exc_page_fault+0x8/0x30
       asm_exc_page_fault+0x1e/0x30
      RIP: 0033:0x7fd98fc8fad1
      ==
      
      Figure out the race happens when one process is adding &page->lru into
      the pagelist tail in fb_deferred_io_mkwrite(), another process is
      re-initializing the same &page->lru in fb_deferred_io_fault(), which is
      not protected by the lock.
      
      This fix is to init all the page lists one time during initialization,
      it not only fixes the list corruption, but also avoids INIT_LIST_HEAD()
      redundantly.
      
      V2: change "int i" to "unsigned int i" (Geert Uytterhoeven)
      Signed-off-by: NChuansheng Liu <chuansheng.liu@intel.com>
      Fixes: 105a9404 ("fbdev/defio: Early-out if page is already enlisted")
      Cc: Thomas Zimmermann <tzimmermann@suse.de>
      Cc: Geert Uytterhoeven <geert@linux-m68k.org>
      Reviewed-by: NJavier Martinez Canillas <javierm@redhat.com>
      Reviewed-by: NThomas Zimmermann <tzimmermann@suse.de>
      Signed-off-by: NThomas Zimmermann <tzimmermann@suse.de>
      Link: https://patchwork.freedesktop.org/patch/msgid/20220318005003.51810-1-chuansheng.liu@intel.com
      856082f0
  5. 18 3月, 2022 4 次提交
  6. 17 3月, 2022 23 次提交
  7. 16 3月, 2022 2 次提交
  8. 14 3月, 2022 2 次提交