1. 06 11月, 2018 8 次提交
  2. 27 9月, 2018 1 次提交
  3. 11 9月, 2018 1 次提交
  4. 30 8月, 2018 1 次提交
  5. 17 7月, 2018 1 次提交
  6. 12 7月, 2018 3 次提交
  7. 13 6月, 2018 1 次提交
    • K
      treewide: kmalloc() -> kmalloc_array() · 6da2ec56
      Kees Cook 提交于
      The kmalloc() function has a 2-factor argument form, kmalloc_array(). This
      patch replaces cases of:
      
              kmalloc(a * b, gfp)
      
      with:
              kmalloc_array(a * b, gfp)
      
      as well as handling cases of:
      
              kmalloc(a * b * c, gfp)
      
      with:
      
              kmalloc(array3_size(a, b, c), gfp)
      
      as it's slightly less ugly than:
      
              kmalloc_array(array_size(a, b), c, gfp)
      
      This does, however, attempt to ignore constant size factors like:
      
              kmalloc(4 * 1024, gfp)
      
      though any constants defined via macros get caught up in the conversion.
      
      Any factors with a sizeof() of "unsigned char", "char", and "u8" were
      dropped, since they're redundant.
      
      The tools/ directory was manually excluded, since it has its own
      implementation of kmalloc().
      
      The Coccinelle script used for this was:
      
      // Fix redundant parens around sizeof().
      @@
      type TYPE;
      expression THING, E;
      @@
      
      (
        kmalloc(
      -	(sizeof(TYPE)) * E
      +	sizeof(TYPE) * E
        , ...)
      |
        kmalloc(
      -	(sizeof(THING)) * E
      +	sizeof(THING) * E
        , ...)
      )
      
      // Drop single-byte sizes and redundant parens.
      @@
      expression COUNT;
      typedef u8;
      typedef __u8;
      @@
      
      (
        kmalloc(
      -	sizeof(u8) * (COUNT)
      +	COUNT
        , ...)
      |
        kmalloc(
      -	sizeof(__u8) * (COUNT)
      +	COUNT
        , ...)
      |
        kmalloc(
      -	sizeof(char) * (COUNT)
      +	COUNT
        , ...)
      |
        kmalloc(
      -	sizeof(unsigned char) * (COUNT)
      +	COUNT
        , ...)
      |
        kmalloc(
      -	sizeof(u8) * COUNT
      +	COUNT
        , ...)
      |
        kmalloc(
      -	sizeof(__u8) * COUNT
      +	COUNT
        , ...)
      |
        kmalloc(
      -	sizeof(char) * COUNT
      +	COUNT
        , ...)
      |
        kmalloc(
      -	sizeof(unsigned char) * COUNT
      +	COUNT
        , ...)
      )
      
      // 2-factor product with sizeof(type/expression) and identifier or constant.
      @@
      type TYPE;
      expression THING;
      identifier COUNT_ID;
      constant COUNT_CONST;
      @@
      
      (
      - kmalloc
      + kmalloc_array
        (
      -	sizeof(TYPE) * (COUNT_ID)
      +	COUNT_ID, sizeof(TYPE)
        , ...)
      |
      - kmalloc
      + kmalloc_array
        (
      -	sizeof(TYPE) * COUNT_ID
      +	COUNT_ID, sizeof(TYPE)
        , ...)
      |
      - kmalloc
      + kmalloc_array
        (
      -	sizeof(TYPE) * (COUNT_CONST)
      +	COUNT_CONST, sizeof(TYPE)
        , ...)
      |
      - kmalloc
      + kmalloc_array
        (
      -	sizeof(TYPE) * COUNT_CONST
      +	COUNT_CONST, sizeof(TYPE)
        , ...)
      |
      - kmalloc
      + kmalloc_array
        (
      -	sizeof(THING) * (COUNT_ID)
      +	COUNT_ID, sizeof(THING)
        , ...)
      |
      - kmalloc
      + kmalloc_array
        (
      -	sizeof(THING) * COUNT_ID
      +	COUNT_ID, sizeof(THING)
        , ...)
      |
      - kmalloc
      + kmalloc_array
        (
      -	sizeof(THING) * (COUNT_CONST)
      +	COUNT_CONST, sizeof(THING)
        , ...)
      |
      - kmalloc
      + kmalloc_array
        (
      -	sizeof(THING) * COUNT_CONST
      +	COUNT_CONST, sizeof(THING)
        , ...)
      )
      
      // 2-factor product, only identifiers.
      @@
      identifier SIZE, COUNT;
      @@
      
      - kmalloc
      + kmalloc_array
        (
      -	SIZE * COUNT
      +	COUNT, SIZE
        , ...)
      
      // 3-factor product with 1 sizeof(type) or sizeof(expression), with
      // redundant parens removed.
      @@
      expression THING;
      identifier STRIDE, COUNT;
      type TYPE;
      @@
      
      (
        kmalloc(
      -	sizeof(TYPE) * (COUNT) * (STRIDE)
      +	array3_size(COUNT, STRIDE, sizeof(TYPE))
        , ...)
      |
        kmalloc(
      -	sizeof(TYPE) * (COUNT) * STRIDE
      +	array3_size(COUNT, STRIDE, sizeof(TYPE))
        , ...)
      |
        kmalloc(
      -	sizeof(TYPE) * COUNT * (STRIDE)
      +	array3_size(COUNT, STRIDE, sizeof(TYPE))
        , ...)
      |
        kmalloc(
      -	sizeof(TYPE) * COUNT * STRIDE
      +	array3_size(COUNT, STRIDE, sizeof(TYPE))
        , ...)
      |
        kmalloc(
      -	sizeof(THING) * (COUNT) * (STRIDE)
      +	array3_size(COUNT, STRIDE, sizeof(THING))
        , ...)
      |
        kmalloc(
      -	sizeof(THING) * (COUNT) * STRIDE
      +	array3_size(COUNT, STRIDE, sizeof(THING))
        , ...)
      |
        kmalloc(
      -	sizeof(THING) * COUNT * (STRIDE)
      +	array3_size(COUNT, STRIDE, sizeof(THING))
        , ...)
      |
        kmalloc(
      -	sizeof(THING) * COUNT * STRIDE
      +	array3_size(COUNT, STRIDE, sizeof(THING))
        , ...)
      )
      
      // 3-factor product with 2 sizeof(variable), with redundant parens removed.
      @@
      expression THING1, THING2;
      identifier COUNT;
      type TYPE1, TYPE2;
      @@
      
      (
        kmalloc(
      -	sizeof(TYPE1) * sizeof(TYPE2) * COUNT
      +	array3_size(COUNT, sizeof(TYPE1), sizeof(TYPE2))
        , ...)
      |
        kmalloc(
      -	sizeof(TYPE1) * sizeof(THING2) * (COUNT)
      +	array3_size(COUNT, sizeof(TYPE1), sizeof(TYPE2))
        , ...)
      |
        kmalloc(
      -	sizeof(THING1) * sizeof(THING2) * COUNT
      +	array3_size(COUNT, sizeof(THING1), sizeof(THING2))
        , ...)
      |
        kmalloc(
      -	sizeof(THING1) * sizeof(THING2) * (COUNT)
      +	array3_size(COUNT, sizeof(THING1), sizeof(THING2))
        , ...)
      |
        kmalloc(
      -	sizeof(TYPE1) * sizeof(THING2) * COUNT
      +	array3_size(COUNT, sizeof(TYPE1), sizeof(THING2))
        , ...)
      |
        kmalloc(
      -	sizeof(TYPE1) * sizeof(THING2) * (COUNT)
      +	array3_size(COUNT, sizeof(TYPE1), sizeof(THING2))
        , ...)
      )
      
      // 3-factor product, only identifiers, with redundant parens removed.
      @@
      identifier STRIDE, SIZE, COUNT;
      @@
      
      (
        kmalloc(
      -	(COUNT) * STRIDE * SIZE
      +	array3_size(COUNT, STRIDE, SIZE)
        , ...)
      |
        kmalloc(
      -	COUNT * (STRIDE) * SIZE
      +	array3_size(COUNT, STRIDE, SIZE)
        , ...)
      |
        kmalloc(
      -	COUNT * STRIDE * (SIZE)
      +	array3_size(COUNT, STRIDE, SIZE)
        , ...)
      |
        kmalloc(
      -	(COUNT) * (STRIDE) * SIZE
      +	array3_size(COUNT, STRIDE, SIZE)
        , ...)
      |
        kmalloc(
      -	COUNT * (STRIDE) * (SIZE)
      +	array3_size(COUNT, STRIDE, SIZE)
        , ...)
      |
        kmalloc(
      -	(COUNT) * STRIDE * (SIZE)
      +	array3_size(COUNT, STRIDE, SIZE)
        , ...)
      |
        kmalloc(
      -	(COUNT) * (STRIDE) * (SIZE)
      +	array3_size(COUNT, STRIDE, SIZE)
        , ...)
      |
        kmalloc(
      -	COUNT * STRIDE * SIZE
      +	array3_size(COUNT, STRIDE, SIZE)
        , ...)
      )
      
      // Any remaining multi-factor products, first at least 3-factor products,
      // when they're not all constants...
      @@
      expression E1, E2, E3;
      constant C1, C2, C3;
      @@
      
      (
        kmalloc(C1 * C2 * C3, ...)
      |
        kmalloc(
      -	(E1) * E2 * E3
      +	array3_size(E1, E2, E3)
        , ...)
      |
        kmalloc(
      -	(E1) * (E2) * E3
      +	array3_size(E1, E2, E3)
        , ...)
      |
        kmalloc(
      -	(E1) * (E2) * (E3)
      +	array3_size(E1, E2, E3)
        , ...)
      |
        kmalloc(
      -	E1 * E2 * E3
      +	array3_size(E1, E2, E3)
        , ...)
      )
      
      // And then all remaining 2 factors products when they're not all constants,
      // keeping sizeof() as the second factor argument.
      @@
      expression THING, E1, E2;
      type TYPE;
      constant C1, C2, C3;
      @@
      
      (
        kmalloc(sizeof(THING) * C2, ...)
      |
        kmalloc(sizeof(TYPE) * C2, ...)
      |
        kmalloc(C1 * C2 * C3, ...)
      |
        kmalloc(C1 * C2, ...)
      |
      - kmalloc
      + kmalloc_array
        (
      -	sizeof(TYPE) * (E2)
      +	E2, sizeof(TYPE)
        , ...)
      |
      - kmalloc
      + kmalloc_array
        (
      -	sizeof(TYPE) * E2
      +	E2, sizeof(TYPE)
        , ...)
      |
      - kmalloc
      + kmalloc_array
        (
      -	sizeof(THING) * (E2)
      +	E2, sizeof(THING)
        , ...)
      |
      - kmalloc
      + kmalloc_array
        (
      -	sizeof(THING) * E2
      +	E2, sizeof(THING)
        , ...)
      |
      - kmalloc
      + kmalloc_array
        (
      -	(E1) * E2
      +	E1, E2
        , ...)
      |
      - kmalloc
      + kmalloc_array
        (
      -	(E1) * (E2)
      +	E1, E2
        , ...)
      |
      - kmalloc
      + kmalloc_array
        (
      -	E1 * E2
      +	E1, E2
        , ...)
      )
      Signed-off-by: NKees Cook <keescook@chromium.org>
      6da2ec56
  8. 25 5月, 2018 1 次提交
    • A
      drm/amdgpu: fix 32-bit build warning · ebe1d22b
      Arnd Bergmann 提交于
      Casting a pointer to a 64-bit type causes a warning on 32-bit targets:
      
      drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c:473:24: error: cast from pointer to integer of different size [-Werror=pointer-to-int-cast]
                lower_32_bits((uint64_t)wptr));
                              ^
      drivers/gpu/drm/amd/amdgpu/amdgpu.h:1701:53: note: in definition of macro 'WREG32'
       #define WREG32(reg, v) amdgpu_mm_wreg(adev, (reg), (v), 0)
                                                           ^
      drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c:473:10: note: in expansion of macro 'lower_32_bits'
                lower_32_bits((uint64_t)wptr));
                ^~~~~~~~~~~~~
      
      The correct method is to cast to 'uintptr_t'.
      
      Fixes: d5a114a6 ("drm/amdgpu: Add GFXv9 kfd2kgd interface functions")
      Signed-off-by: NArnd Bergmann <arnd@arndb.de>
      Reviewed-by: NOded Gabbay <oded.gabbay@gmail.com>
      Signed-off-by: NOded Gabbay <oded.gabbay@gmail.com>
      ebe1d22b
  9. 11 4月, 2018 2 次提交
  10. 16 3月, 2018 1 次提交
  11. 28 12月, 2017 1 次提交
  12. 09 12月, 2017 4 次提交
  13. 07 2月, 2018 5 次提交
  14. 28 11月, 2017 1 次提交
  15. 02 11月, 2017 3 次提交
  16. 07 10月, 2017 1 次提交
    • O
      drm/amdgpu: Fixed a potential circular lock · a50ecc54
      ozeng 提交于
      The dead circular lock senario captured is as followed.
      The idea of the fix is moving read_user_wptr outside of
      acquire_queue...release_queue critical section
      
      [   63.477482] WARNING: possible circular locking dependency detected
      [   63.484091] 4.12.0-kfd-ozeng #3 Not tainted
      [   63.488531] ------------------------------------------------------
      [   63.495146] HelloWorldLoop/2526 is trying to acquire lock:
      [   63.501011]  (&mm->mmap_sem){++++++}, at: [<ffffffff911898ce>] __might_fault+0x3e/0x90
      [   63.509472]
                     but task is already holding lock:
      [   63.515716]  (&adev->srbm_mutex){+.+...}, at: [<ffffffffc0484feb>] lock_srbm+0x2b/0x50 [amdgpu]
      [   63.525099]
                     which lock already depends on the new lock.
      
      [   63.533841]
                     the existing dependency chain (in reverse order) is:
      [   63.541839]
                     -> #2 (&adev->srbm_mutex){+.+...}:
      [   63.548178]        lock_acquire+0x6d/0x90
      [   63.552461]        __mutex_lock+0x70/0x8c0
      [   63.556826]        mutex_lock_nested+0x16/0x20
      [   63.561603]        gfx_v8_0_kiq_resume+0x1039/0x14a0 [amdgpu]
      [   63.567817]        gfx_v8_0_hw_init+0x204d/0x2210 [amdgpu]
      [   63.573675]        amdgpu_device_init+0xdea/0x1790 [amdgpu]
      [   63.579640]        amdgpu_driver_load_kms+0x63/0x220 [amdgpu]
      [   63.585743]        drm_dev_register+0x145/0x1e0
      [   63.590605]        amdgpu_pci_probe+0x11e/0x160 [amdgpu]
      [   63.596266]        local_pci_probe+0x40/0xa0
      [   63.600803]        pci_device_probe+0x134/0x150
      [   63.605650]        driver_probe_device+0x2a1/0x460
      [   63.610785]        __driver_attach+0xdc/0xe0
      [   63.615321]        bus_for_each_dev+0x5f/0x90
      [   63.619984]        driver_attach+0x19/0x20
      [   63.624337]        bus_add_driver+0x40/0x270
      [   63.628908]        driver_register+0x5b/0xe0
      [   63.633446]        __pci_register_driver+0x5b/0x60
      [   63.638586]        rtsx_pci_switch_output_voltage+0x1d/0x20 [rtsx_pci]
      [   63.645564]        do_one_initcall+0x4c/0x1b0
      [   63.650205]        do_init_module+0x56/0x1ea
      [   63.654767]        load_module+0x208c/0x27d0
      [   63.659335]        SYSC_finit_module+0x96/0xd0
      [   63.664058]        SyS_finit_module+0x9/0x10
      [   63.668629]        entry_SYSCALL_64_fastpath+0x1f/0xbe
      [   63.674088]
                     -> #1 (reservation_ww_class_mutex){+.+.+.}:
      [   63.681257]        lock_acquire+0x6d/0x90
      [   63.685551]        __ww_mutex_lock.constprop.11+0x8c/0xed0
      [   63.691426]        ww_mutex_lock+0x67/0x70
      [   63.695802]        amdgpu_verify_access+0x6d/0x100 [amdgpu]
      [   63.701743]        ttm_bo_mmap+0x8e/0x100 [ttm]
      [   63.706615]        amdgpu_bo_mmap+0xd/0x60 [amdgpu]
      [   63.711814]        amdgpu_mmap+0x35/0x40 [amdgpu]
      [   63.716904]        mmap_region+0x3b5/0x5a0
      [   63.721255]        do_mmap+0x400/0x4d0
      [   63.725260]        vm_mmap_pgoff+0xb0/0xf0
      [   63.729625]        SyS_mmap_pgoff+0x19e/0x260
      [   63.734292]        SyS_mmap+0x1d/0x20
      [   63.738199]        entry_SYSCALL_64_fastpath+0x1f/0xbe
      [   63.743681]
                     -> #0 (&mm->mmap_sem){++++++}:
      [   63.749641]        __lock_acquire+0x1401/0x1420
      [   63.754491]        lock_acquire+0x6d/0x90
      [   63.758750]        __might_fault+0x6b/0x90
      [   63.763176]        kgd_hqd_load+0x24f/0x270 [amdgpu]
      [   63.768432]        load_mqd+0x4b/0x50 [amdkfd]
      [   63.773192]        create_queue_nocpsch+0x535/0x620 [amdkfd]
      [   63.779237]        pqm_create_queue+0x34d/0x4f0 [amdkfd]
      [   63.784835]        kfd_ioctl_create_queue+0x282/0x670 [amdkfd]
      [   63.790973]        kfd_ioctl+0x310/0x4d0 [amdkfd]
      [   63.795944]        do_vfs_ioctl+0x90/0x6e0
      [   63.800268]        SyS_ioctl+0x74/0x80
      [   63.804207]        entry_SYSCALL_64_fastpath+0x1f/0xbe
      [   63.809607]
                     other info that might help us debug this:
      
      [   63.818026] Chain exists of:
                       &mm->mmap_sem --> reservation_ww_class_mutex --> &adev->srbm_mutex
      
      [   63.830382]  Possible unsafe locking scenario:
      
      [   63.836605]        CPU0                    CPU1
      [   63.841364]        ----                    ----
      [   63.846123]   lock(&adev->srbm_mutex);
      [   63.850061]                                lock(reservation_ww_class_mutex);
      [   63.857475]                                lock(&adev->srbm_mutex);
      [   63.864084]   lock(&mm->mmap_sem);
      [   63.867657]
                      *** DEADLOCK ***
      
      [   63.873884] 3 locks held by HelloWorldLoop/2526:
      [   63.878739]  #0:  (&process->mutex){+.+.+.}, at: [<ffffffffc06e1a9a>] kfd_ioctl_create_queue+0x24a/0x670 [amdkfd]
      [   63.889543]  #1:  (&dqm->lock){+.+...}, at: [<ffffffffc06eedeb>] create_queue_nocpsch+0x3b/0x620 [amdkfd]
      [   63.899684]  #2:  (&adev->srbm_mutex){+.+...}, at: [<ffffffffc0484feb>] lock_srbm+0x2b/0x50 [amdgpu]
      [   63.909500]
                     stack backtrace:
      [   63.914187] CPU: 3 PID: 2526 Comm: HelloWorldLoop Not tainted 4.12.0-kfd-ozeng #3
      [   63.922184] Hardware name: AMD Carrizo/Gardenia, BIOS WGA5819N_Weekly_15_08_1 08/19/2015
      [   63.930865] Call Trace:
      [   63.933464]  dump_stack+0x85/0xc9
      [   63.936999]  print_circular_bug+0x1f9/0x207
      [   63.941442]  __lock_acquire+0x1401/0x1420
      [   63.945745]  ? lock_srbm+0x2b/0x50 [amdgpu]
      [   63.950185]  lock_acquire+0x6d/0x90
      [   63.953885]  ? __might_fault+0x3e/0x90
      [   63.957899]  __might_fault+0x6b/0x90
      [   63.961699]  ? __might_fault+0x3e/0x90
      [   63.965755]  kgd_hqd_load+0x24f/0x270 [amdgpu]
      [   63.970577]  load_mqd+0x4b/0x50 [amdkfd]
      [   63.974745]  create_queue_nocpsch+0x535/0x620 [amdkfd]
      [   63.980242]  pqm_create_queue+0x34d/0x4f0 [amdkfd]
      [   63.985320]  kfd_ioctl_create_queue+0x282/0x670 [amdkfd]
      [   63.991021]  kfd_ioctl+0x310/0x4d0 [amdkfd]
      [   63.995499]  ? kfd_ioctl_destroy_queue+0x70/0x70 [amdkfd]
      [   64.001234]  do_vfs_ioctl+0x90/0x6e0
      [   64.005065]  ? up_read+0x1a/0x40
      [   64.008496]  SyS_ioctl+0x74/0x80
      [   64.011955]  entry_SYSCALL_64_fastpath+0x1f/0xbe
      [   64.016863] RIP: 0033:0x7f4b3bd35f07
      [   64.020696] RSP: 002b:00007ffe7689ec38 EFLAGS: 00000246 ORIG_RAX: 0000000000000010
      [   64.028786] RAX: ffffffffffffffda RBX: 00000000002a2000 RCX: 00007f4b3bd35f07
      [   64.036414] RDX: 00007ffe7689ecb0 RSI: 00000000c0584b02 RDI: 0000000000000005
      [   64.044045] RBP: 00007f4a3212d000 R08: 00007f4b3c919000 R09: 0000000000080000
      [   64.051674] R10: 00007f4b376b64b8 R11: 0000000000000246 R12: 00007f4a3212d000
      [   64.059324] R13: 0000000000000015 R14: 0000000000000064 R15: 00007ffe7689ef50
      Signed-off-by: NOak Zeng <Oak.Zeng@amd.com>
      Reviewed-by: NFelix Kuehling <Felix.Kuehling@amd.com>
      Signed-off-by: NAlex Deucher <alexander.deucher@amd.com>
      a50ecc54
  17. 27 9月, 2017 1 次提交
  18. 30 8月, 2017 1 次提交
  19. 25 8月, 2017 1 次提交
  20. 16 8月, 2017 2 次提交