From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Xie, AlexBin" Subject: Re: [PATCH] drm/amdgpu: Move compute vm bug logic to amdgpu_vm.c Date: Thu, 1 Jun 2017 13:17:40 +0000 Message-ID: References: <1496272081-21584-1-git-send-email-AlexBin.Xie@amd.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0865017748==" Return-path: In-Reply-To: <1496272081-21584-1-git-send-email-AlexBin.Xie-5C7GfCeVMHo@public.gmane.org> Content-Language: en-US List-Id: Discussion list for AMD gfx List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: amd-gfx-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Sender: "amd-gfx" To: "amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org" , "Koenig, Christian" --===============0865017748== Content-Language: en-US Content-Type: multipart/alternative; boundary="_000_MWHPR1201MB00450087F85C0B784DEE4BA2F2F60MWHPR1201MB0045_" --_000_MWHPR1201MB00450087F85C0B784DEE4BA2F2F60MWHPR1201MB0045_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Hi Christian, Please review this v2 patch. It is slightly faster. Thanks, Alex Bin ________________________________ From: Xie, AlexBin Sent: Wednesday, May 31, 2017 7:08 PM To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Cc: Xie, AlexBin Subject: [PATCH] drm/amdgpu: Move compute vm bug logic to amdgpu_vm.c In review, Christian would like to keep the logic inside amdgpu_vm.c with a cost of slightly slower. The loop is still optimized out with this patch. v2: remove the if statement. Now it is not slower. Signed-off-by: Alex Xie --- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 2 ++ drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c | 32 ------------------------- drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h | 5 ---- drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 38 ++++++++++++++++++++++++++= ++-- drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | 1 + 5 files changed, 39 insertions(+), 39 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/a= md/amdgpu/amdgpu_device.c index 89bc34a..2f1a4e9 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -2227,6 +2227,8 @@ int amdgpu_device_init(struct amdgpu_device *adev, adev->accel_working =3D true; + amdgpu_vm_check_compute_bug(adev); + /* Initialize the buffer migration limit. */ if (amdgpu_moverate >=3D 0) max_MBps =3D amdgpu_moverate; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c b/drivers/gpu/drm/amd= /amdgpu/amdgpu_ring.c index 7d95435..31aa51d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c @@ -153,36 +153,6 @@ void amdgpu_ring_undo(struct amdgpu_ring *ring) } /** - * amdgpu_ring_check_compute_vm_bug - check whether this ring has compute = vm bug - * - * @adev: amdgpu_device pointer - * @ring: amdgpu_ring structure holding ring information - */ -static void amdgpu_ring_check_compute_vm_bug(struct amdgpu_device *adev, - struct amdgpu_ring *ring) -{ - const struct amdgpu_ip_block *ip_block; - - ring->has_compute_vm_bug =3D false; - - if (ring->funcs->type !=3D AMDGPU_RING_TYPE_COMPUTE) - /* only compute rings */ - return; - - ip_block =3D amdgpu_get_ip_block(adev, AMD_IP_BLOCK_TYPE_GFX); - if (!ip_block) - return; - - /* Compute ring has a VM bug for GFX version < 7. - And compute ring has a VM bug for GFX 8 MEC firmware version < = 673.*/ - if (ip_block->version->major <=3D 7) { - ring->has_compute_vm_bug =3D true; - } else if (ip_block->version->major =3D=3D 8) - if (adev->gfx.mec_fw_version < 673) - ring->has_compute_vm_bug =3D true; -} - -/** * amdgpu_ring_init - init driver ring struct. * * @adev: amdgpu_device pointer @@ -288,8 +258,6 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct= amdgpu_ring *ring, DRM_ERROR("Failed to register debugfs file for rings !\n")= ; } - amdgpu_ring_check_compute_vm_bug(adev, ring); - return 0; } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h b/drivers/gpu/drm/amd= /amdgpu/amdgpu_ring.h index 334307e..ad399c8 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h @@ -208,9 +208,4 @@ static inline void amdgpu_ring_clear_ring(struct amdgpu= _ring *ring) } -static inline bool amdgpu_ring_has_compute_vm_bug(struct amdgpu_ring *ring= ) -{ - return ring->has_compute_vm_bug; -} - #endif diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/a= mdgpu/amdgpu_vm.c index d4d05a8..6e32748 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c @@ -656,6 +656,41 @@ static int amdgpu_vm_alloc_reserved_vmid(struct amdgpu= _device *adev, return r; } +/** + * amdgpu_vm_check_compute_bug - check whether asic has compute vm bug + * + * @adev: amdgpu_device pointer + */ +void amdgpu_vm_check_compute_bug(struct amdgpu_device *adev) +{ + const struct amdgpu_ip_block *ip_block; + bool has_compute_vm_bug; + struct amdgpu_ring *ring; + int i; + + has_compute_vm_bug =3D false; + + ip_block =3D amdgpu_get_ip_block(adev, AMD_IP_BLOCK_TYPE_GFX); + if (ip_block) { + /* Compute has a VM bug for GFX version < 7. + Compute has a VM bug for GFX 8 MEC firmware version < 67= 3.*/ + if (ip_block->version->major <=3D 7) + has_compute_vm_bug =3D true; + else if (ip_block->version->major =3D=3D 8) + if (adev->gfx.mec_fw_version < 673) + has_compute_vm_bug =3D true; + } + + for (i =3D 0; i < adev->num_rings; i++) { + ring =3D adev->rings[i]; + if (ring->funcs->type =3D=3D AMDGPU_RING_TYPE_COMPUTE) + /* only compute rings */ + ring->has_compute_vm_bug =3D has_compute_vm_bug; + else + ring->has_compute_vm_bug =3D false; + } +} + bool amdgpu_vm_need_pipeline_sync(struct amdgpu_ring *ring, struct amdgpu_job *job) { @@ -664,8 +699,7 @@ bool amdgpu_vm_need_pipeline_sync(struct amdgpu_ring *r= ing, struct amdgpu_vm_id_manager *id_mgr =3D &adev->vm_manager.id_mgr[v= mhub]; struct amdgpu_vm_id *id; bool gds_switch_needed; - bool vm_flush_needed =3D job->vm_needs_flush || - amdgpu_ring_has_compute_vm_bug(ring); + bool vm_flush_needed =3D job->vm_needs_flush || ring->has_compute_v= m_bug; if (job->vm_id =3D=3D 0) return false; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/a= mdgpu/amdgpu_vm.h index 8309bc7..f5dba9c 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h @@ -245,5 +245,6 @@ void amdgpu_vm_adjust_size(struct amdgpu_device *adev, = uint64_t vm_size); int amdgpu_vm_ioctl(struct drm_device *dev, void *data, struct drm_file *f= ilp); bool amdgpu_vm_need_pipeline_sync(struct amdgpu_ring *ring, struct amdgpu_job *job); +void amdgpu_vm_check_compute_bug(struct amdgpu_device *adev); #endif -- 2.7.4 --_000_MWHPR1201MB00450087F85C0B784DEE4BA2F2F60MWHPR1201MB0045_ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable

Hi Christian,


Please review this v2 patch. It is slightly faster.


Thanks,

Alex Bin


From: Xie, AlexBin
Sent: Wednesday, May 31, 2017 7:08 PM
To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org
Cc: Xie, AlexBin
Subject: [PATCH] drm/amdgpu: Move compute vm bug logic to amdgpu_vm.= c
 
  In review, Christian would like to keep the= logic
  inside amdgpu_vm.c with a cost of slightly slower.
  The loop is still optimized out with this patch.

v2: remove the if statement. Now it is not slower.

Signed-off-by: Alex Xie <AlexBin.Xie-5C7GfCeVMHo@public.gmane.org>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |  2 ++
 drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c   | 32 -----------= --------------
 drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h   |  5 ----  drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c     | 38 &= #43;++++++++++++++&= #43;++++++++++++--
 drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h     | = ; 1 +
 5 files changed, 39 insertions(+), 39 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/a= md/amdgpu/amdgpu_device.c
index 89bc34a..2f1a4e9 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -2227,6 +2227,8 @@ int amdgpu_device_init(struct amdgpu_device *adev= ,
 
         adev->accel_working =3D= true;
 
+       amdgpu_vm_check_compute_bug(adev)= ;
+
         /* Initialize the buffer m= igration limit. */
         if (amdgpu_moverate >= =3D 0)
            &nb= sp;    max_MBps =3D amdgpu_moverate;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c b/drivers/gpu/drm/amd= /amdgpu/amdgpu_ring.c
index 7d95435..31aa51d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
@@ -153,36 +153,6 @@ void amdgpu_ring_undo(struct amdgpu_ring *ring)  }
 
 /**
- * amdgpu_ring_check_compute_vm_bug - check whether this ring has compute = vm bug
- *
- * @adev: amdgpu_device pointer
- * @ring: amdgpu_ring structure holding ring information
- */
-static void amdgpu_ring_check_compute_vm_bug(struct amdgpu_device *adev, -            &n= bsp;            = ;            &n= bsp; struct amdgpu_ring *ring)
-{
-       const struct amdgpu_ip_block *ip_bloc= k;
-
-       ring->has_compute_vm_bug =3D false= ;
-
-       if (ring->funcs->type !=3D AMDG= PU_RING_TYPE_COMPUTE)
-            &n= bsp;  /* only compute rings */
-            &n= bsp;  return;
-
-       ip_block =3D amdgpu_get_ip_block(adev= , AMD_IP_BLOCK_TYPE_GFX);
-       if (!ip_block)
-            &n= bsp;  return;
-
-       /* Compute ring has a VM bug for GFX = version < 7.
-           And compute r= ing has a VM bug for GFX 8 MEC firmware version < 673.*/
-       if (ip_block->version->major &l= t;=3D 7) {
-            &n= bsp;  ring->has_compute_vm_bug =3D true;
-       } else if (ip_block->version->m= ajor =3D=3D 8)
-            &n= bsp;  if (adev->gfx.mec_fw_version < 673)
-            &n= bsp;          ring->has_com= pute_vm_bug =3D true;
-}
-
-/**
  * amdgpu_ring_init - init driver ring struct.
  *
  * @adev: amdgpu_device pointer
@@ -288,8 +258,6 @@ int amdgpu_ring_init(struct amdgpu_device *adev, st= ruct amdgpu_ring *ring,
            &nb= sp;    DRM_ERROR("Failed to register debugfs file for r= ings !\n");
         }
 
-       amdgpu_ring_check_compute_vm_bug(adev= , ring);
-
         return 0;
 }
 
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h b/drivers/gpu/drm/amd= /amdgpu/amdgpu_ring.h
index 334307e..ad399c8 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
@@ -208,9 +208,4 @@ static inline void amdgpu_ring_clear_ring(struct am= dgpu_ring *ring)
 
 }
 
-static inline bool amdgpu_ring_has_compute_vm_bug(struct amdgpu_ring *ring= )
-{
-       return ring->has_compute_vm_bug; -}
-
 #endif
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/a= mdgpu/amdgpu_vm.c
index d4d05a8..6e32748 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -656,6 +656,41 @@ static int amdgpu_vm_alloc_reserved_vmid(struct am= dgpu_device *adev,
         return r;
 }
 
+/**
+ * amdgpu_vm_check_compute_bug - check whether asic has compute vm bug=
+ *
+ * @adev: amdgpu_device pointer
+ */
+void amdgpu_vm_check_compute_bug(struct amdgpu_device *adev)
+{
+       const struct amdgpu_ip_block *ip_= block;
+       bool has_compute_vm_bug;
+       struct amdgpu_ring *ring;
+       int i;
+
+       has_compute_vm_bug =3D false;
+
+       ip_block =3D amdgpu_get_ip_block(= adev, AMD_IP_BLOCK_TYPE_GFX);
+       if (ip_block) {
+           &nbs= p;   /* Compute has a VM bug for GFX version < 7.
+           &nbs= p;      Compute has a VM bug for GFX 8 MEC firmwar= e version < 673.*/
+           &nbs= p;   if (ip_block->version->major <=3D 7)
+           &nbs= p;           has_compute_= vm_bug =3D true;
+           &nbs= p;   else if (ip_block->version->major =3D=3D 8)
+           &nbs= p;           if (adev->= ;gfx.mec_fw_version < 673)
+           &nbs= p;            &= nbsp;      has_compute_vm_bug =3D true;
+       }
+
+       for (i =3D 0; i < adev->num= _rings; i++) {
+           &nbs= p;   ring =3D adev->rings[i];
+           &nbs= p;   if (ring->funcs->type =3D=3D AMDGPU_RING_TYPE_COMPUTE)=
+           &nbs= p;           /* only comp= ute rings */
+           &nbs= p;           ring->has= _compute_vm_bug =3D has_compute_vm_bug;
+           &nbs= p;   else
+           &nbs= p;           ring->has= _compute_vm_bug =3D false;
+       }
+}
+
 bool amdgpu_vm_need_pipeline_sync(struct amdgpu_ring *ring,
            &nb= sp;            =           struct amdgpu_job *j= ob)
 {
@@ -664,8 +699,7 @@ bool amdgpu_vm_need_pipeline_sync(struct amdgpu_rin= g *ring,
         struct amdgpu_vm_id_manage= r *id_mgr =3D &adev->vm_manager.id_mgr[vmhub];
         struct amdgpu_vm_id *id;          bool gds_switch_needed; -       bool vm_flush_needed =3D job->vm_n= eeds_flush ||
-            &n= bsp;  amdgpu_ring_has_compute_vm_bug(ring);
+       bool vm_flush_needed =3D job->= vm_needs_flush || ring->has_compute_vm_bug;
 
         if (job->vm_id =3D=3D 0= )
            &nb= sp;    return false;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/a= mdgpu/amdgpu_vm.h
index 8309bc7..f5dba9c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
@@ -245,5 +245,6 @@ void amdgpu_vm_adjust_size(struct amdgpu_device *ad= ev, uint64_t vm_size);
 int amdgpu_vm_ioctl(struct drm_device *dev, void *data, struct drm_fi= le *filp);
 bool amdgpu_vm_need_pipeline_sync(struct amdgpu_ring *ring,
            &nb= sp;            =           struct amdgpu_job *j= ob);
+void amdgpu_vm_check_compute_bug(struct amdgpu_device *adev);
 
 #endif
--
2.7.4

--_000_MWHPR1201MB00450087F85C0B784DEE4BA2F2F60MWHPR1201MB0045_-- --===============0865017748== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: inline X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KYW1kLWdmeCBt YWlsaW5nIGxpc3QKYW1kLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5m cmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9hbWQtZ2Z4Cg== --===============0865017748==--