<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<p style="font-family:Arial;font-size:10pt;color:#0078D7;margin:15pt;" align="Left">
[AMD Official Use Only - Internal Distribution Only]<br>
</p>
<br>
<div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Okay, I will change back to its original format. </div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Yong</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
 </div>
<div id="appendonsend"></div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> Kuehling, Felix <Felix.Kuehling@amd.com><br>
<b>Sent:</b> Thursday, March 5, 2020 3:49 PM<br>
<b>To:</b> amd-gfx@lists.freedesktop.org <amd-gfx@lists.freedesktop.org>; Zhao, Yong <Yong.Zhao@amd.com><br>
<b>Subject:</b> Re: [PATCH] drm/amdkfd: Consolidate duplicated bo alloc flags</font>
<div> </div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt;">
<div class="PlainText">On 2020-03-04 3:21 p.m., Yong Zhao wrote:<br>
> ALLOC_MEM_FLAGS_* used are the same as the KFD_IOC_ALLOC_MEM_FLAGS_*,<br>
> but they are interweavedly used in kernel driver, resulting in bad<br>
> readability. For example, KFD_IOC_ALLOC_MEM_FLAGS_COHERENT is totally<br>
> not referenced in kernel, and it functions in the kernel through<br>
> ALLOC_MEM_FLAGS_COHERENT, causing unnecessary confusion.<br>
><br>
> Replace all occurrences of ALLOC_MEM_FLAGS_* by<br>
> KFD_IOC_ALLOC_MEM_FLAGS_* to solve the problem.<br>
><br>
> Change-Id: Iced6ed3698167296c97b14e7e4569883859d619c<br>
> Signed-off-by: Yong Zhao <Yong.Zhao@amd.com><br>
> ---<br>
>   drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c    |  9 +++--<br>
>   .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c  | 38 +++++++++++--------<br>
>   drivers/gpu/drm/amd/amdkfd/kfd_process.c      | 13 ++++---<br>
>   .../gpu/drm/amd/include/kgd_kfd_interface.h   | 21 ----------<br>
>   4 files changed, 36 insertions(+), 45 deletions(-)<br>
><br>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c<br>
> index 726c91ab6761..affaa0d4b636 100644<br>
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c<br>
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c<br>
> @@ -29,6 +29,7 @@<br>
>   #include <linux/module.h><br>
>   #include <linux/dma-buf.h><br>
>   #include "amdgpu_xgmi.h"<br>
> +#include <uapi/linux/kfd_ioctl.h><br>
>   <br>
>   static const unsigned int compute_vmid_bitmap = 0xFF00;<br>
>   <br>
> @@ -500,11 +501,13 @@ int amdgpu_amdkfd_get_dmabuf_info(struct kgd_dev *kgd, int dma_buf_fd,<br>
>                r = amdgpu_bo_get_metadata(bo, metadata_buffer, buffer_size,<br>
>                                           metadata_size, &metadata_flags);<br>
>        if (flags) {<br>
> -             *flags = (bo->preferred_domains & AMDGPU_GEM_DOMAIN_VRAM) ?<br>
> -                     ALLOC_MEM_FLAGS_VRAM : ALLOC_MEM_FLAGS_GTT;<br>
> +             if (bo->preferred_domains & AMDGPU_GEM_DOMAIN_VRAM)<br>
> +                     *flags = KFD_IOC_ALLOC_MEM_FLAGS_VRAM;<br>
> +             else<br>
> +                     *flags = KFD_IOC_ALLOC_MEM_FLAGS_GTT;<br>
<br>
You're sneaking in some personal preference (changing the trinary (cond <br>
? a : b) operator to if-else) with the renaming change. Personally I <br>
find the trinary operator just as readable and more concise.<br>
<br>
<br>
>   <br>
>                if (bo->flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED)<br>
> -                     *flags |= ALLOC_MEM_FLAGS_PUBLIC;<br>
> +                     *flags |= KFD_IOC_ALLOC_MEM_FLAGS_PUBLIC;<br>
>        }<br>
>   <br>
>   out_put:<br>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c<br>
> index e4481caed648..c81fe7011e88 100644<br>
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c<br>
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c<br>
> @@ -29,6 +29,7 @@<br>
>   #include "amdgpu_vm.h"<br>
>   #include "amdgpu_amdkfd.h"<br>
>   #include "amdgpu_dma_buf.h"<br>
> +#include <uapi/linux/kfd_ioctl.h><br>
>   <br>
>   /* BO flag to indicate a KFD userptr BO */<br>
>   #define AMDGPU_AMDKFD_USERPTR_BO (1ULL << 63)<br>
> @@ -400,18 +401,18 @@ static int vm_update_pds(struct amdgpu_vm *vm, struct amdgpu_sync *sync)<br>
>   static uint64_t get_pte_flags(struct amdgpu_device *adev, struct kgd_mem *mem)<br>
>   {<br>
>        struct amdgpu_device *bo_adev = amdgpu_ttm_adev(mem->bo->tbo.bdev);<br>
> -     bool coherent = mem->alloc_flags & ALLOC_MEM_FLAGS_COHERENT;<br>
> +     bool coherent = mem->alloc_flags & KFD_IOC_ALLOC_MEM_FLAGS_COHERENT;<br>
>        uint32_t mapping_flags;<br>
>   <br>
>        mapping_flags = AMDGPU_VM_PAGE_READABLE;<br>
> -     if (mem->alloc_flags & ALLOC_MEM_FLAGS_WRITABLE)<br>
> +     if (mem->alloc_flags & KFD_IOC_ALLOC_MEM_FLAGS_WRITABLE)<br>
>                mapping_flags |= AMDGPU_VM_PAGE_WRITEABLE;<br>
> -     if (mem->alloc_flags & ALLOC_MEM_FLAGS_EXECUTABLE)<br>
> +     if (mem->alloc_flags & KFD_IOC_ALLOC_MEM_FLAGS_EXECUTABLE)<br>
>                mapping_flags |= AMDGPU_VM_PAGE_EXECUTABLE;<br>
>   <br>
>        switch (adev->asic_type) {<br>
>        case CHIP_ARCTURUS:<br>
> -             if (mem->alloc_flags & ALLOC_MEM_FLAGS_VRAM) {<br>
> +             if (mem->alloc_flags & KFD_IOC_ALLOC_MEM_FLAGS_VRAM) {<br>
>                        if (bo_adev == adev)<br>
>                                mapping_flags |= coherent ?<br>
>                                        AMDGPU_VM_MTYPE_CC : AMDGPU_VM_MTYPE_RW;<br>
> @@ -1160,24 +1161,24 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(<br>
>        /*<br>
>         * Check on which domain to allocate BO<br>
>         */<br>
> -     if (flags & ALLOC_MEM_FLAGS_VRAM) {<br>
> +     if (flags & KFD_IOC_ALLOC_MEM_FLAGS_VRAM) {<br>
>                domain = alloc_domain = AMDGPU_GEM_DOMAIN_VRAM;<br>
>                alloc_flags = AMDGPU_GEM_CREATE_VRAM_WIPE_ON_RELEASE;<br>
> -             alloc_flags |= (flags & ALLOC_MEM_FLAGS_PUBLIC) ?<br>
> +             alloc_flags |= (flags & KFD_IOC_ALLOC_MEM_FLAGS_PUBLIC) ?<br>
>                        AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED :<br>
>                        AMDGPU_GEM_CREATE_NO_CPU_ACCESS;<br>
> -     } else if (flags & ALLOC_MEM_FLAGS_GTT) {<br>
> +     } else if (flags & KFD_IOC_ALLOC_MEM_FLAGS_GTT) {<br>
>                domain = alloc_domain = AMDGPU_GEM_DOMAIN_GTT;<br>
>                alloc_flags = 0;<br>
> -     } else if (flags & ALLOC_MEM_FLAGS_USERPTR) {<br>
> +     } else if (flags & KFD_IOC_ALLOC_MEM_FLAGS_USERPTR) {<br>
>                domain = AMDGPU_GEM_DOMAIN_GTT;<br>
>                alloc_domain = AMDGPU_GEM_DOMAIN_CPU;<br>
>                alloc_flags = 0;<br>
>                if (!offset || !*offset)<br>
>                        return -EINVAL;<br>
>                user_addr = untagged_addr(*offset);<br>
> -     } else if (flags & (ALLOC_MEM_FLAGS_DOORBELL |<br>
> -                     ALLOC_MEM_FLAGS_MMIO_REMAP)) {<br>
> +     } else if (flags & (KFD_IOC_ALLOC_MEM_FLAGS_DOORBELL |<br>
> +                     KFD_IOC_ALLOC_MEM_FLAGS_MMIO_REMAP)) {<br>
>                domain = AMDGPU_GEM_DOMAIN_GTT;<br>
>                alloc_domain = AMDGPU_GEM_DOMAIN_CPU;<br>
>                bo_type = ttm_bo_type_sg;<br>
> @@ -1198,7 +1199,7 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(<br>
>        }<br>
>        INIT_LIST_HEAD(&(*mem)->bo_va_list);<br>
>        mutex_init(&(*mem)->lock);<br>
> -     (*mem)->aql_queue = !!(flags & ALLOC_MEM_FLAGS_AQL_QUEUE_MEM);<br>
> +     (*mem)->aql_queue = !!(flags & KFD_IOC_ALLOC_MEM_FLAGS_AQL_QUEUE_MEM);<br>
>   <br>
>        /* Workaround for AQL queue wraparound bug. Map the same<br>
>         * memory twice. That means we only actually allocate half<br>
> @@ -1652,6 +1653,7 @@ int amdgpu_amdkfd_gpuvm_import_dmabuf(struct kgd_dev *kgd,<br>
>        struct drm_gem_object *obj;<br>
>        struct amdgpu_bo *bo;<br>
>        struct amdgpu_vm *avm = (struct amdgpu_vm *)vm;<br>
> +     uint32_t flags;<br>
>   <br>
>        if (dma_buf->ops != &amdgpu_dmabuf_ops)<br>
>                /* Can't handle non-graphics buffers */<br>
> @@ -1680,10 +1682,16 @@ int amdgpu_amdkfd_gpuvm_import_dmabuf(struct kgd_dev *kgd,<br>
>   <br>
>        INIT_LIST_HEAD(&(*mem)->bo_va_list);<br>
>        mutex_init(&(*mem)->lock);<br>
> -     (*mem)->alloc_flags =<br>
> -             ((bo->preferred_domains & AMDGPU_GEM_DOMAIN_VRAM) ?<br>
> -              ALLOC_MEM_FLAGS_VRAM : ALLOC_MEM_FLAGS_GTT) |<br>
> -             ALLOC_MEM_FLAGS_WRITABLE | ALLOC_MEM_FLAGS_EXECUTABLE;<br>
> +     <br>
> +     flags = KFD_IOC_ALLOC_MEM_FLAGS_WRITABLE<br>
> +             | KFD_IOC_ALLOC_MEM_FLAGS_EXECUTABLE;<br>
> +<br>
> +     if (bo->preferred_domains & AMDGPU_GEM_DOMAIN_VRAM)<br>
> +             flags |= KFD_IOC_ALLOC_MEM_FLAGS_VRAM;<br>
> +     else<br>
> +             flags |= KFD_IOC_ALLOC_MEM_FLAGS_GTT;<br>
> +<br>
> +     (*mem)->alloc_flags = flags;<br>
<br>
Same as above. The original code was only 4 lines and a single <br>
statement. Your code is 8 lines, four statements, plus an extra local <br>
variable. I don't see how this is an improvement.<br>
<br>
Regards,<br>
   Felix<br>
<br>
<br>
>   <br>
>        (*mem)->bo = amdgpu_bo_ref(bo);<br>
>        (*mem)->va = va;<br>
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c<br>
> index 22abdbc6dfd7..1c7bfc842f06 100644<br>
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c<br>
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c<br>
> @@ -327,10 +327,10 @@ static int kfd_process_alloc_gpuvm(struct kfd_process_device *pdd,<br>
>   static int kfd_process_device_reserve_ib_mem(struct kfd_process_device *pdd)<br>
>   {<br>
>        struct qcm_process_device *qpd = &pdd->qpd;<br>
> -     uint32_t flags = ALLOC_MEM_FLAGS_GTT |<br>
> -                      ALLOC_MEM_FLAGS_NO_SUBSTITUTE |<br>
> -                      ALLOC_MEM_FLAGS_WRITABLE |<br>
> -                      ALLOC_MEM_FLAGS_EXECUTABLE;<br>
> +     uint32_t flags = KFD_IOC_ALLOC_MEM_FLAGS_GTT |<br>
> +                     KFD_IOC_ALLOC_MEM_FLAGS_NO_SUBSTITUTE |<br>
> +                     KFD_IOC_ALLOC_MEM_FLAGS_WRITABLE |<br>
> +                     KFD_IOC_ALLOC_MEM_FLAGS_EXECUTABLE;<br>
>        void *kaddr;<br>
>        int ret;<br>
>   <br>
> @@ -692,8 +692,9 @@ static int kfd_process_device_init_cwsr_dgpu(struct kfd_process_device *pdd)<br>
>   {<br>
>        struct kfd_dev *dev = pdd->dev;<br>
>        struct qcm_process_device *qpd = &pdd->qpd;<br>
> -     uint32_t flags = ALLOC_MEM_FLAGS_GTT |<br>
> -             ALLOC_MEM_FLAGS_NO_SUBSTITUTE | ALLOC_MEM_FLAGS_EXECUTABLE;<br>
> +     uint32_t flags = KFD_IOC_ALLOC_MEM_FLAGS_GTT<br>
> +                     | KFD_IOC_ALLOC_MEM_FLAGS_NO_SUBSTITUTE<br>
> +                     | KFD_IOC_ALLOC_MEM_FLAGS_EXECUTABLE;<br>
>        void *kaddr;<br>
>        int ret;<br>
>   <br>
> diff --git a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h<br>
> index 0cee79d56075..a3c238c39ef5 100644<br>
> --- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h<br>
> +++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h<br>
> @@ -167,27 +167,6 @@ struct tile_config {<br>
>   <br>
>   #define KFD_MAX_NUM_OF_QUEUES_PER_DEVICE_DEFAULT 4096<br>
>   <br>
> -/*<br>
> - * Allocation flag domains<br>
> - * NOTE: This must match the corresponding definitions in kfd_ioctl.h.<br>
> - */<br>
> -#define ALLOC_MEM_FLAGS_VRAM         (1 << 0)<br>
> -#define ALLOC_MEM_FLAGS_GTT          (1 << 1)<br>
> -#define ALLOC_MEM_FLAGS_USERPTR              (1 << 2)<br>
> -#define ALLOC_MEM_FLAGS_DOORBELL     (1 << 3)<br>
> -#define ALLOC_MEM_FLAGS_MMIO_REMAP   (1 << 4)<br>
> -<br>
> -/*<br>
> - * Allocation flags attributes/access options.<br>
> - * NOTE: This must match the corresponding definitions in kfd_ioctl.h.<br>
> - */<br>
> -#define ALLOC_MEM_FLAGS_WRITABLE     (1 << 31)<br>
> -#define ALLOC_MEM_FLAGS_EXECUTABLE   (1 << 30)<br>
> -#define ALLOC_MEM_FLAGS_PUBLIC               (1 << 29)<br>
> -#define ALLOC_MEM_FLAGS_NO_SUBSTITUTE        (1 << 28) /* TODO */<br>
> -#define ALLOC_MEM_FLAGS_AQL_QUEUE_MEM        (1 << 27)<br>
> -#define ALLOC_MEM_FLAGS_COHERENT     (1 << 26) /* For GFXv9 or later */<br>
> -<br>
>   /**<br>
>    * struct kfd2kgd_calls<br>
>    *<br>
</div>
</span></font></div>
</div>
</body>
</html>